Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在使用WMI进行权限检查期间防止应用程序挂起_C#_Wmi - Fatal编程技术网

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

C# 如何在使用WMI进行权限检查期间防止应用程序挂起,c#,wmi,C#,Wmi,我正在使用WMI,我需要获取一些信息,但当类由于权限不足而不可用时,一切都会挂起几(~5)秒。即使设置低超时也不起作用(更不用说这是一个愚蠢的解决方案) 问题不是权限不足,而是“挂断” 是否有任何方法可以检查当前进程是否具有从某个类读取信息的权限,以防止出现“挂起”和“拒绝访问”异常 ConnectionOptions co = new ConnectionOptions(); co.Impersonation = ImpersonationLevel.Impersonate; co.Authe

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

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

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

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

要读取所有名称空间(名称空间根、类\u名称空间,而不是递归读取所有名称空间),需要35秒。我使用ThreadPool(使用新线程读取每个孩子,然后再使用多个线程读取该孩子的孩子)将时间缩短到8秒。这是一个可怕的解决方案,但8比35好。有什么想法吗?你的评论应该是另一个发布的问题。我试图阻止挂断而不是挂断后台线程(这不会减少获得响应所需的时间),但可能没有更好的解决方案。