определить, находится ли машина в сети или в автономном режиме, используя WMI и C #

Я использую vs2008, winxp, в локальной сети с серверами Win2003.

Я хочу, чтобы приложение, установленное в 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-utility/

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


person Kiquenet    schedule 26.01.2011    source источник
comment
Не уверен, что понял, когда, но если машина отключена, не будет ли сложно сказать ей перезагрузиться?   -  person Hans Passant    schedule 27.01.2011
comment
@Hans Passant: я тоже думал об этом, и я полагаю, что он хочет определить, когда машина станет доступной, т.е. е. загрузился.   -  person Christoph    schedule 27.01.2011


Ответы (3)


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

person Christoph    schedule 26.01.2011

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

person Frédéric Hamidi    schedule 26.01.2011

Не совсем уверен, к чему вопрос, но для чего он стоит, у меня есть тестовая среда, которая запускает тесты на виртуальных машинах и требует их перезагрузки. После перезагрузки коробки (через 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;
            }
        }
    }

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

person Troy Parsons    schedule 19.01.2012