Comment définir un délai d’attente pour les requêtes WMI?

J’ai une application .NET qui exécute des requêtes WMI sur tous les ordinateurs du domaine afin de trouver l’utilisateur connecté; il envoie une commande ping à chaque ordinateur pour déterminer s’il est en ligne ou non, puis exécute la requête réelle.

Extrait de code:

try { ssortingng loggedonuser = null; ssortingng 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 = (Ssortingng) mo["username"]; } catch(Exception e) { // Handle WMI exception } 

Le problème: parfois, la requête WMI s’accroche indéfiniment.

Comment puis-je définir un délai d’attente sur elle?

ManagementObjectSearcher a une propriété Options : une des options disponibles est Timeout , de type TimeSpan :

Obtient ou définit le délai d’expiration à appliquer à l’opération. Notez que pour les opérations qui renvoient des collections, ce délai d’attente s’applique à l’énumération de la collection résultante et non à l’opération elle-même (la propriété ReturnImmediately est utilisée pour cette dernière). Cette propriété est utilisée pour indiquer que l’opération doit être effectuée de manière semi-synchrone.

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