Сеть и WMI
Я достаточно долго искал способ, который бы позволил мне изменять параметры сетевого адаптера. Дело в том, что у меня приличное количество мест, где я подрубаюсь к сети и в итоге начались проблемы с запоминанием всех параметров. Одно время спасал обычный текстовик со списком, но все равно вручную менять все это было крайне напряжно. В итоге, мне подсказали способ, как можно это автоматизировать, используя netsh, но все равно, когда количество батников перевалило за 20 меня это начало раздражать...
И вот, пустился я в поиски по MSDN'у (вернее, сначала, я пытался откопать что-то в нете, но то ли плохо искал, то ли...). Вначале, я, естественно, наткнулся на функцию AddIPAddress, в IP Helper, но, во-1, она не всегда корректно работала, во-2, возможности изменять шлюзы и DNS адреса я не нашел... В итоге, я вспомнил про Windows Management Instrumentation(WMI), покопавшись, я нашел класс Win32_NetworkAdapterConfiguration, который как раз позволял мне реализовать мою затею =)
И вот, пустился я в поиски по MSDN'у (вернее, сначала, я пытался откопать что-то в нете, но то ли плохо искал, то ли...). Вначале, я, естественно, наткнулся на функцию AddIPAddress, в IP Helper, но, во-1, она не всегда корректно работала, во-2, возможности изменять шлюзы и DNS адреса я не нашел... В итоге, я вспомнил про Windows Management Instrumentation(WMI), покопавшись, я нашел класс Win32_NetworkAdapterConfiguration, который как раз позволял мне реализовать мою затею =)
В общем, смысл реализации всего задуманного был таков: описываем класс опций адаптера
| 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....... } |
Тогда получение его опций можно произвести следующим образом:
И, соответственно, установка:
Надо сказать, что работа с WMI на VB.Net и 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; } |
И, соответственно, установка:
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]
Отправить комментарий