【问题标题】:How to set a timeout on WMI queries?如何设置 WMI 查询超时?
【发布时间】:2011-09-15 09:14:09
【问题描述】:

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

代码sn-p:

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 查询会无限期挂起。

如何设置超时时间?

【问题讨论】:

    标签: c# .net timeout wmi


    【解决方案1】:

    ManagementObjectSearcher 有一个Options 属性:可用选项之一是Timeout,类型为TimeSpan

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

    【讨论】:

    • 可以用 C++ 做吗?
    • @Mayur 如果您使用的是 C++/CLI,那么可以。如果不是,那我就不知道了。
    【解决方案2】:

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

    【讨论】:

    • 这里只用于连接,不用于实际查询;无论如何有用,如果连接花费太多时间(防火墙等);但在我的情况下,它是挂起的 query
    猜你喜欢
    • 1970-01-01
    • 2016-06-20
    • 2019-11-28
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2014-08-06
    相关资源
    最近更新 更多