détecter si la machine est en ligne ou hors ligne à l’aide de WMI et C #

J’utilise vs2008, winxp, en réseau local avec des serveurs Win2003.

Je veux une application installée dans Winxp pour détecter si les machines Win2003 sont en ligne ou hors ligne, et si elles sont hors ligne au démarrage.

J’ai ces références, d’autres références, des exemples de code et les meilleures pratiques?

http://danielvl.blogspot.com/2004/06/how-to-ping-in-c-using.html

http://snipplr.com/view/2157/ping-using-wmi-pingstatus/

The popular C# Ping Utitility

http://www.visualbasicscript.com/Ping-WMI-amp-NonWMI-Versions-Functions-amp-Simple-Connectivity-Monitor-m42535.aspx

Je préférerais .NET System.Net.NetworkInformation.Ping , car il est assez flexible, vous avez la possibilité de le faire de manière asynchrone et je le trouve plus intuitif que WMI (j’ai utilisé les deux et utiliser WMI uniquement si j’ai besoin de obtenir plus d’informations de la machine distante que juste le ping). Mais ceci est juste une opinion personnelle.

Si les machines respectent les demandes d’écho ICMP, vous pouvez utiliser la classe Ping au lieu de WMI.

Je ne sais pas exactement à quoi la question s’adresse, mais pour ce que cela vaut, j’ai un framework de test qui exécute des tests sur les VM et doit les redémarrer. Après avoir redémarré la boîte (via WMI), j’attends un échec de ping, puis un succès de ping (en utilisant System.Net.NetworkInformation.Ping comme mentionné par d’autres), puis je dois attendre que Windows soit prêt:

  private const int RpcServerUnavailable = unchecked((int)0x800706BA); private const int RpcCallCancelled = unchecked((int)0x80010002); public bool WindowsUp(ssortingng hostName) { ssortingng adsiPath = ssortingng.Format(@"\\{0}\root\cimv2", hostName); ManagementScope scope = new ManagementScope(adsiPath); ManagementPath osPath = new ManagementPath("Win32_OperatingSystem"); ManagementClass os = new ManagementClass(scope, osPath, null); ManagementObjectCollection instances = null; try { instances = os.GetInstances(); return true; } catch (COMException exception) { if (exception.ErrorCode == RpcServerUnavailable || exception.ErrorCode == RpcCallCancelled) { return false; } throw; } finally { if (instances != null) { instances.Dispose(); instances = null; } } } 

C’est un peu naïf, mais ça marche 🙂