如何在使用WMI进行权限检查期间阻止应用程序挂起

时间:2011-03-21 19:13:59

标签: c# wmi

我正在使用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"

1 个答案:

答案 0 :(得分:1)

您需要做的是在后台线程上运行操作。它可能仍需要五秒钟(或更长时间),但您的应用程序将保持响应而不是挂起。尝试这样的事情:

  Task.Factory.StartNew(() =>
  {
    // Your permission checking code here.....
  }).ContinueWith((t) =>
  {
    // Inform user of permissions status.
  });

如果您没有使用支持“任务”的框架版本,请尝试使用BackgroundWorker。这些是保持长时间运行的流程不会挂起您的应用程序的常用方法。