определить, подключен ли компьютер к сети или нет, используя WMI и C # - PullRequest
2 голосов
/ 27 января 2011

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

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

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

Ответы [ 3 ]

2 голосов
/ 27 января 2011

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

1 голос
/ 27 января 2011

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

0 голосов
/ 19 января 2012

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

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

...