Сетевое программирование в .NET, страница 11

      string serviceName = "SYSTEM\\CurrentControlSet\\Services\\" +

        serviceKey.GetValue("ServiceName").ToString() + "\\Parameters\\Tcpip";

      RegistryKey key = Registry.LocalMachine.OpenSubKey (serviceName);

      if (key == null)

        Console.WriteLine("No IP configuration set");

      else

      {

        foreach (string addr in (string[])key.GetValue("IPAddress"))

          Console.WriteLine("IP Address  : {0}", addr);

        foreach (string mask in (string[])key.GetValue("SubnetMask"))

          Console.WriteLine("Subnet Mask : {0}", mask);

        foreach (string gate in (string[])key.GetValue("DefaultGateway"))

          Console.WriteLine("Gateway     : {0}", gate);

        key.Close();

      }

    }

    serviceKey.Close();

  }

  Registry.LocalMachine.Close();

  Console.WriteLine("\n\n");

}

Достаем информацию с помощью WMI

Сетевую информацию также можно получить из поддерживаемой операционной системой Windows специальной инфраструктуры, или проще, базы данных WMI (Windows Management Instrumentation). Она реализует одну из инициатив Microsoft (попытку разработать и ввести общий стандарт) под именем WBEM (Web-Based Enterprise Management). Эта инициатива направлена на унификацию методов получения информации о программах и аппаратуре, которые не должны зависеть от ее типа и производителя.

Инициатива WBEM, в свою очередь, основана на схеме, называемой Common Information Model (CIM), которая представляет собой промышленный стандарт, разработанный организацией DMTF (Distributed Management Task Force). В разработке WBEM, впервые предложенной в 1996, участвовали такие компании, как: Cisco Systems, Intel Compaq Computer и BMC Software. Спецификация CIM описывает некий язык моделирования, способы обозначения и преобразования информации, используемые при сборе и передаче данных, полученных из источников различной природы. Интересующая нас информация содержится в таблице NetworkAdapterConfiguration базы данных WMI. Запрос к этой таблице возвращает коллекцию данных об одном из сетевых интерфейсов. Следующая таблица перечисляет поля таблицы NetworkAdapterConfiguration.

Field

Description

DefaultIPGateway

Массив IP-адресов маршрутизаторов, присвоенных данному устройству

Description

Имя, или описание устройства

DHCPEnabled

Флаг динамического способа присвоения IP-адреса

DHCPServer

Имя DHCP-сервера, который присвоил IP-адрес

DNSHostName

Доменное имя (DNS) хост-компьютера, который распознает имена

IPAddress

Массив IP-адресов, присвоенных данному устройству

IPEnabled

Использует-ли устройство сетевой IP-адрес

IPSubnet

Массив IP subnet адресов, используемых данным устройством

MACAddress

Ethernet MAC-адрес, присвоенный данному устройству

Рассмотрим, как получить сетевую информацию, опрашивая базу данных WMI с помощью классов библиотеки .NET Framework, обитающих в пространстве имен System.Management.

public static void Main()

{

  Console.WriteLine("\tNetwork Info\n");

  ManagementObjectSearcher searcher = new ManagementObjectSearcher(

    "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'");

  foreach (ManagementObject mo in searcher.Get())

  {

    Console.WriteLine(

      "\nDNSHostName :\t {0}\nNetwork Card:\t {1}" +

      "\nMAC Address :\t {2}\nDHCPServer  :\t {3}",

      mo["DNSHostName"], mo["Description"], mo["MACAddress"], mo["DHCPServer"]);

    foreach (string addr in (string[])mo["IPAddress"])

      Console.WriteLine("IP Address  :\t {0}", addr);

    foreach (string subnet in (string[])mo["IPSubnet"])

      Console.WriteLine("Subnet Mask :\t {0}", subnet);