Как установить тайм-аут для запросов WMI?

У меня есть приложение .NET, которое запускает запросы WMI на всех компьютерах домена, чтобы найти зарегистрированного пользователя; он пингует каждый компьютер, чтобы найти, находится ли он в сети или нет, а затем запускает фактический запрос.

фрагмент кода:

try
{
    string loggedonuser = null;

    string computername = "ComputerToQuery";

    ConnectionOptions co = new ConnectionOptions();

    co.Username = "DOMAINMyUser";
    co.Password = "MyPassword";

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

    ManagementPath mp = new ManagementPath(@"" + computername + @"rootcimv2");

    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 ответов


ManagementObjectSearcher имеет Options свойство: одним из доступных вариантов является Timeout, типа TimeSpan:

получает или задает тайм-аут для применения к операция. Обратите внимание, что для операции, возвращающие коллекции, этот тайм-аут применяется к перечисление через результирующее коллекция, а не сама операция (свойство ReturnImmediately является используется для последнего). Это свойство используется для указания что операция должно быть выполнено полу-синхронно.


попробовать co.Timeout = new TimeSpan(0, 0, 30);