Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set a timeout on WMI queries?

Tags:

c#

.net

timeout

wmi

I have a .NET application which runs WMI queries on all domain computers in order to find the logged in user; it pings each computer to find whether it is online or not, then runs the actual query.

Code snippet:

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
}

The problem: sometimes the WMI query hangs on indefinitely.

How can I set a timeout on it?

like image 800
Massimo Avatar asked Jun 15 '11 09:06

Massimo


2 Answers

The ManagementObjectSearcher has an Options property: one of the available options is Timeout, of type TimeSpan:

Gets or sets the time-out to apply to the operation. Note that for operations that return collections, this time-out applies to the enumeration through the resulting collection, not the operation itself (the ReturnImmediately property is used for the latter). This property is used to indicate that the operation should be performed semi-synchronously.

like image 150
stuartd Avatar answered Oct 23 '22 09:10

stuartd


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

like image 25
markoo Avatar answered Oct 23 '22 08:10

markoo