我正在使用WMI,我需要获取一些信息,但是当由于权限不足而无法使用类时,所有内容都会挂起几(~5)秒。即使设置低超时也不起作用(更不用说它将是愚蠢的解决方案)。
问题不是权限不足,问题是“挂断”。
有没有办法检查当前进程是否有权从某个类中读取信息以防止“挂断”和“拒绝访问”异常?
ConnectionOptions co = new ConnectionOptions();
co.Impersonation = ImpersonationLevel.Impersonate;
co.Authentication = AuthenticationLevel.Packet;
co.Timeout = new TimeSpan(0, 0, 1); // 1 second, but still hangs for ~5
co.EnablePrivileges = false; // false or true, doesn't matter
ManagementPath mp = new ManagementPath();
mp.NamespacePath = @"root\CIMV2\Security\MicrosoftTpm";
mp.Server = "";
ManagementScope ms = new ManagementScope(mp, co);
ms.Connect(); // Hangs for ~5 seconds and throws "access denied"
答案 0 :(得分:1)
您需要做的是在后台线程上运行操作。它可能仍需要五秒钟(或更长时间),但您的应用程序将保持响应而不是挂起。尝试这样的事情:
Task.Factory.StartNew(() =>
{
// Your permission checking code here.....
}).ContinueWith((t) =>
{
// Inform user of permissions status.
});
如果您没有使用支持“任务”的框架版本,请尝试使用BackgroundWorker。这些是保持长时间运行的流程不会挂起您的应用程序的常用方法。