среда, октября 04, 2006

Сеть и WMI

Я достаточно долго искал способ, который бы позволил мне изменять параметры сетевого адаптера. Дело в том, что у меня приличное количество мест, где я подрубаюсь к сети и в итоге начались проблемы с запоминанием всех параметров. Одно время спасал обычный текстовик со списком, но все равно вручную менять все это было крайне напряжно. В итоге, мне подсказали способ, как можно это автоматизировать, используя netsh, но все равно, когда количество батников перевалило за 20 меня это начало раздражать...
И вот, пустился я в поиски по MSDN'у (вернее, сначала, я пытался откопать что-то в нете, но то ли плохо искал, то ли...). Вначале, я, естественно, наткнулся на функцию AddIPAddress, в IP Helper, но, во-1, она не всегда корректно работала, во-2, возможности изменять шлюзы и DNS адреса я не нашел... В итоге, я вспомнил про Windows Management Instrumentation(WMI), покопавшись, я нашел класс Win32_NetworkAdapterConfiguration, который как раз позволял мне реализовать мою затею =)
В общем, смысл реализации всего задуманного был таков: описываем класс опций адаптера



Code C#

public class AdapterOptions
{
   string _adapterName; // Имя адаптера
   public string AdapterName
   {
      get { return _adapterName; }
      set { _adapterName = value; }
   }
.......skip.......
   string _macAddress; // MAC адрес
   public string MACAddress
   {
      get { return _macAddress; }
      set { _macAddress = value; }
   }
   string [] _ipAdress; // IP адрес
   public string [] IpAdress
   {
      get { return _ipAdress;}
      set { _ipAdress = value;}
   }
.......skip.......
}


Тогда получение его опций можно произвести следующим образом:



Code C#

public static AdapterOptions GetAdapterOptions(string AdapterName)
{
 AdapterOptions adapterOptions = new AdapterOptions();
 ManagementClass netAdapters = new ManagementClass("Win32_NetworkAdapterConfiguration");
 ManagementObjectCollection netAdaptersCollection = netAdapters.GetInstances();
 foreach (ManagementBaseObject managementBaseObject in netAdaptersCollection)
 {
  if (!(bool)managementBaseObject["ipEnabled"])
   continue;
  if ((string)managementBaseObject["Caption"] == AdapterName)
  {
   adapterOptions.AdapterName = AdapterName;
   adapterOptions.ServiceName = (string) managementBaseObject["ServiceName"];
   adapterOptions.MACAddress = (string) managementBaseObject["MACAddress"];
   adapterOptions.IpAdress = (string[]) managementBaseObject["IPAddress"];
   adapterOptions.SubnetMask = (string[]) managementBaseObject["IPSubnet"];
   adapterOptions.Gateways = (string[]) managementBaseObject["DefaultIPGateway"];
   adapterOptions.DNSAddresses = (string[]) managementBaseObject["DNSServerSearchOrder"];
   return adapterOptions;
  }
 }
 return null;
}

И, соответственно, установка:



Code C#

public static void SetAdapterOptions(AdapterOptions adapterOptions)
{
 ManagementClass netAdapters = new ManagementClass("Win32_NetworkAdapterConfiguration");
 ManagementObjectCollection netAdaptersCollection = netAdapters.GetInstances();
 foreach (ManagementObject managementBaseObject in netAdaptersCollection)
 {
  if (!(bool)managementBaseObject["ipEnabled"])
   continue;
  if ((string)managementBaseObject["Caption"] == adapterOptions.AdapterName)
  {
   try
   {
    // Устанавливаем IP адреса и маски подсети
    // Получаем параметры метода
    ManagementBaseObject ipAddr = managementBaseObject.GetMethodParameters("EnableStatic");
    // Устанавливаем их
    ipAddr["IPAddress"] = adapterOptions.IpAdress;
    ipAddr["SubnetMask"] = adapterOptions.SubnetMask;
    // Вызываем метод с указанными параметрами
    managementBaseObject.InvokeMethod("EnableStatic", ipAddr, null);
.......skip.......
   }
   catch (Exception)
   {
    MessageBox.Show("Got error while trying to change adapter parameters", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
   }
   MessageBox.Show("Setting new options successfully complete", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
   return;
  }
 }
}

Надо сказать, что работа с WMI на VB.Net и C# одно удовольствие, а вот если вы попробуете сделать это на С, то ваша жизнь превратится в кошмар =)

3 комментария:

Анонимный комментирует...

CPP FOREVER!

Анонимный комментирует...

Добрый вечер.
Статья очень познавательная, действительно WMI довольно удобен для управления компьютером.
Но возник такой вопрос: а реально вообще для беспроводного соединения указывать к какой сети подключаться (идентификация сети к примеру по имени) и автоматически вводить пароль WEP/WPA/WPA2 без участия пользователя? Или придется лезть в реестр? (хотя не факт, что там что-то лежит)

Анонимный комментирует...

[b]- Дети, вам было задано на дом сочинение на тему "Моя любимая передача".
Скажи, Вовочка, ты сам писал или тебе папа помогал?
- Папа помогал.
- Ну тогда скажи папе, что передачи можно не только получать, но еще и
смотреть. [/b]
Общество Мегаполиса Pi7.ru порадовала новым выходом очередного сборника нюансов.
Меня удивила скажем это "[url=http://www.2nt.ru/go/videoerotika.php]Vanity Club в Лас-ВегасеГерпес приводит к шизофрении [/url]" - Канечно вы можете встретить и ради себя миллион интерестного
Ну а однако лучшее противоядие через скуки это анекдотец.
[url=http://my.pi7.ru/users/katya][IMG]http://www.my.pi7.ru/images/photos/medium/8a602c9644083b9f55bb147e497508dc.jpg[/IMG][/url]