5 июл. 2012 г.

Проверка доступности компьютера с помощью WMI

      Если вам нужно написать программу с использованием WMI, которая подключается к удаленной машине, то перед подключением необходимо проверить – доступна ли эта машина. В случае если машина по сети не доступна (выключена или отсоединена от сети), то подключение к WMI не состоится и ваша программа сообщит об ошибке. Сама по себе ошибка не представляет большой проблемы, но перед тем как WMI вернет ее вам, пройдет довольно большой тайм-аут (около 30-60 секунд). Таким образом, если вы запустите программу, которая должна будет подключиться к 100 машинам по сети и 25 из них будут недоступны, то время выполнения, займёт от 15 до 30 минут.
      Для устранения данной проблемы можно создать предварительную проверку доступности компьютера, это значительно сократит время ожидания. Эту задачу позволяет эффективно решать Ping. Вам следует не забывать, что проверка доступности хоста по ICMP эхо-запросу может быть неудачной и из-за применения в сети на маршруте следования пакета фильтрующих маршрутизаторов или firewall.
      Провайдер Ping предоставляет в репозиторий WMI (Microsoft Windows® Management Instrumentation) всего один класс Win32_PingStatus. Запрос к этому классу позволяет выполнить процедуру ping гораздо быстрее и проще. Этот способ не зависит от локализации операционной системы. WMI-класс Win32_PingStatus обычно возвращает объект, имеющий 24 свойства, которые предоставляют обширные сведения о пакетах ping-запросов, отправляемых классом.

Информацию по данному классу вы можете посмотреть на сайте поддержки разработчиков Microsoft MSDN. По адресу http://msdn.microsoft.com/en-us/library/aa394350(v=vs.85).aspx
      Создайте проект Windows Form в Microsoft Visual Studio. Добавьте на главную форму два компонента:
  • textBox1 – Текстовое поле для ввода DNS имени или IP адреса;
  • button1 – Кнопка для запуска проверки доступности.
У вас получится форма примерно следующего вида:
      Перейдите в листинг вашей главной формы, нажав на клавиатуре клавишу «F7» и добавьте приведенный ниже метод проверки доступности компьютера:
public static bool Ping(string Target)
{
    SelectQuery query = 
          new SelectQuery("Win32_PingStatus",
               string.Format("Address='{0}'", Target));
    ManagementObjectSearcher searcher = 
          new ManagementObjectSearcher(query);

    foreach (ManagementObject result in searcher.Get())
    {
        return (result["StatusCode"] != null && (0 == (UInt32)result["StatusCode"]));
    }
    return false;
}
      Чтобы воспользоваться данным методом, перейдите в конструктор главной формы и сделайте два клика по компоненту «button1». Перейдите в автоматически созданный метод «button1_Click» и добавьте в него следующий листинг:
if (Ping(textBox1.Text))
{
    MessageBox.Show("Компьютер доступен");
}
else
{
    MessageBox.Show("Компьютер не доступен");
}
Для работы вам понадобится подключить следующее пространство имен:
using System.Management;
Так же необходимо добавить ссылку на библиотеку данного пространства имен.
      Для проверки кода, запустите ваш проект, нажав на клавишу «F5». Введите в текстовое поле ip адрес компьютера и нажмите на кнопку «Проверить доступность». В случае если компьютер доступен, вы увидите сообщение:
Если не доступен, то сообщение будет следующего вида:

Ссылка на исходник: Rusfolder.net