2011-01-26 4 views
2

Я использую vs2008, winxp, в локальной сети с серверами Win2003.обнаруживает, что машина находится в автономном режиме или в автономном режиме, используя WMI и C#

Я хочу, чтобы приложение, установленное в winxp, обнаружило, что машины win2003 находятся в автономном режиме или в автономном режиме, и если он отключен при загрузке.

У меня есть эта ссылка, больше ссылок, образцов кода и передового опыта?

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

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

http://dotnoted.wordpress.com/2005/01/15/the-popular-c-ping-utitility/

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

+0

Не уверен, что я получаю «когда», но если машина находится в автономном режиме, не было бы трудно сказать, чтобы она перезагрузилась? –

+0

@Hans Passant: Я тоже думал об этом, и я считаю, что он хочет обнаружить, когда машина станет доступной, т.е. е. загрузился. – Christoph

ответ

1

Если машины чтить ICMP эхо-запросов, вы можете использовать Ping класс вместо WMI.

2

Я бы пошел на .NET System.Net.NetworkInformation.Ping, потому что он довольно гибкий, у вас есть возможность сделать это асинхронно, и я нахожу его более интуитивным, чем WMI (я использовал оба и использовал WMI только в том случае, если мне нужно получить больше информации с удаленной машины, чем просто пинг). Но это всего лишь личное мнение.

0

Не уверен, в чем вопрос, но для чего он стоит, у меня есть тестовая среда, которая запускает тесты на виртуальных машинах и должна перезагрузить их. После перезагрузки окно (через WMI) Я жду пинг неудачу, то пинг успех (с использованием System.Net.NetworkInformation.Ping, как уже отмечалось другими), то мне нужно подождать, пока Windows, готова:

private const int RpcServerUnavailable = unchecked((int)0x800706BA); 

    private const int RpcCallCancelled = unchecked((int)0x80010002); 

    public bool WindowsUp(string hostName) 
    { 
     string adsiPath = string.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; 
      } 
     } 
    } 

Это немного наивно, но он работает :)

Смежные вопросы