如何在WMI查询上设置超时?

时间:2011-06-15 09:26:11

标签: c# .net timeout wmi

我有一个.NET应用程序,它在所有域计算机上运行WMI查询,以便找到登录用户;它ping每台计算机以查找它是否在线,然后运行实际查询。

代码段:

try
{
    string loggedonuser = null;

    string computername = "ComputerToQuery";

    ConnectionOptions co = new ConnectionOptions();

    co.Username = "DOMAIN\MyUser";
    co.Password = "MyPassword";

    co.Impersonation = ImpersonationLevel.Impersonate;
    co.Authentication = AuthenticationLevel.Default;

    ManagementPath mp = new ManagementPath(@"\\" + computername + @"\root\cimv2");

    ManagementScope ms = new ManagementScope(mp,co);

    ms.Connect();

    ObjectQuery oq = new ObjectQuery("SELECT username FROM Win32_ComputerSystem");

    ManagementObjectSearcher mos = new ManagementObjectSearcher(ms,oq);

    foreach(ManagementObject mo in mos.Get())
        loggedonuser = (String) mo["username"];
}
catch(Exception e)
{
    // Handle WMI exception
}

问题:有时WMI查询会无限期地挂起。

如何设置超时?

2 个答案:

答案 0 :(得分:12)

ManagementObjectSearcher具有Options属性:其中一个可用选项为Timeout,类型为TimeSpan

  

获取或设置要应用的超时时间   操作。请注意   返回集合的操作,   这个超时适用于   通过结果枚举   集合,而不是操作本身   (ReturnImmediately属性是   用于后者)。这个属性是   用于表示操作   应该执行   半同步。

答案 1 :(得分:6)

尝试co.Timeout = new TimeSpan(0, 0, 30);