Hey, Scripting Guy!Конечно, мы адаптируемся
The Microsoft Scripting Guys
Данная статья основана на предварительной версии Windows Vista. Некоторая приведенная здесь информация может меняться.
Загрузить исходный код для этой статьи: ScriptingGuys2006_11.exe (151KB)
Вы, вероятно, слышали, что одним из самых лучших способов продвинуться по карьерной лестнице является общение, то есть, заводить связи с другими людьми по бизнесу с тем, чтобы учиться у них, делиться информацией с ними и, возможно, получить у них новую работу. Группа The Scripting Guys никогда реально не занималась всем этим налаживанием связей и знакомств (что должно быть очевидно), но мы кое-что понимаем в налаживании связей компьютерной сети. Поэтому у вас многое получится при построении сетей с помощью сценариев.
Windows® Management Instrumentation (WMI) обеспечивает ряд классов, которые вы можете использовать как для управления, так и для контроля вашей сетевой среды. Два из этих классов, Win32_NetworkAdapter и Win32_NetworkAdapaterConfiguration, позволяют работать с сетевыми адаптерами на ваших компьютерах.
Нам часто задают вопрос "Как включать и отключать сетевые адаптеры при помощи сценария?" Что ж, мы не будем томить вас в ожидании. Мы скажем вам прямо сейчас - никак. По крайне мере, пока вы не начнете работать в Windows Vista™. В класс Win32_NetworkAdapter Windows Vista были добавлены два новых метода: включение и отключение. Мы сейчас остановимся на этих методах. Но сначала, до того, как вы совсем расстроитесь, мы покажем вам, что можно делать с операционными системами, предшествующими Windows Vista. Для начала можно узнать, какие сетевые адаптеры в данный момент установлены на компьютере (см Рисунок 1). Хорошенькое дельце, да?
Figure 1 Поиск сетевых адаптеров
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter")
For Each objItem in colItems
Wscript.Echo "Name: " & objItem.Name
Wscript.Echo "Description: " & objItem.Description
Wscript.Echo
Next
На Рисунке 1 мы начинаем с подключения к службе WMI на локальном компьютере. Конечно, достаточно просто найти сетевые адаптеры на своем локальном компьютере при помощи графического интерфейса, но попытайтесь-ка использовать его для получения информации о сетевых адаптерах на удаленном компьютере. Вот в чем заключается прелесть этого сценария и написания сценариев WMI в целом: вы можете выполнить этот самый сценарий на удаленном компьютере, просто изменив значение strComputer на имя удаленного компьютера.
После подключения к службе WMI мы делаем запрос классу Win32_NetworkAdapter. На наш запрос выдается перечень всех сетевых адаптеров на компьютере. Теперь все, что нам нужно сделать – это настроить схему For Each на опрос перечня адаптеров и получение имени (Name) и описания (Description) каждого. В результате у вас получится приблизительно следующее:
Name: Broadcom NetXtreme 57xx Gigabit Controller
Description: Broadcom NetXtreme 57xx Gigabit Controller
Name: RAS Async Adapter
Description: RAS Async Adapter
Name: WAN Miniport (L2TP)
Description: WAN Miniport (L2TP)
Name: WAN Miniport (PPTP)
Description: WAN Miniport (PPTP)
Намного больше информации о своих сетевых адаптерах вы сможете получить просто опрашивая различные свойства Win32_NetworkAdapter, такие как DeviceID, Manufacturer и TimeOfLastReset. Более подробная информация представлена в большом труде "Автоматизация компьютерных сетей TCP/IP у клиентов", где же еще?—в Script Center.
Адаптация к изменениям
При помощи класса Win32_NetworkAdapter все, что вы можете сделать – это получить информацию о сетевых адаптерах. Если же вы хотите все-таки изменить какие любо настройки адаптера, то вам нужно использовать класс Win32_NetworkAdapterConfiguration. Этот класс не только дает дополнительную информацию о ваших адаптерах (благодаря свойствам, отсутствующим в Win32_NetworkAdapter), но он также предлагает несколько методов, которые позволяют вам настроить свои сетевые адаптеры по своему усмотрению.
Например, вы, может быть, не сможете включить и отключить адаптеры, но вы сможете включить и отключить протокол динамического выбора конфигурации хост-машины (DHCP) на каждом адаптере с поддержкой TCP/IP. На Рисунке 2 показан сценарий, который осуществляет поиск всех сетевых адаптеров с поддержкой TCP/IP, контролирует, включен ли DHCP на каждом адаптере и, если нет, включает его.
Figure 2 Включение DHCP
strComputer = "."
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")
For Each objItem in colItems
If objItem.DHCPEnabled = False Then
Wscript.Echo objItem.Caption
intReturn = objItem.EnableDHCP
Select Case intReturn
Case 0
Wscript.Echo "DHCP enabled"
Case 1
Wscript.Echo "You must reboot before DHCP will be enabled"
Case Else
Wscript.Echo "Error occurred"
End Select
Wscript.Echo
End If
Next
Точно также, как сценарий на Рисунке 1, сценарий на Рисунке 2 подключается к службе WMI на локальном компьютере. Затем он запрашивает класс Win32_NetworkAdapterConfiguration. Обратите внимание, что поскольку мы рассматриваем только адаптеры с поддержкой TCP/IP, то мы включили условие Where в наш запрос:
Where IPEnabled = 'True'
Это условие обозначает, что нас интересуют только события класса Win32_NetworkAdapterConfiguration, когда свойство IPEnabled установлено на True, что означает, что адаптер, связанный с этим событием, имеет поддержку TCP/IP.
Затем мы используем схему For Each для повторного опроса перечня адаптеров, полученных в результате нашего запроса. В рамках этой схемы сначала мы проверяем свойство DHCPEnabled каждого адаптера. Если это свойство установлено на False, то это означает, что DHCP не включен, и мы начинаем процедуру включения. Для этого мы обращаемся к методу EnableDHCP на объекте адаптера. Вот собственно и все.
Для понимания того, что происходит в сценарии мы опрашиваем свойство Caption, поэтому мы знаем, с какими адаптерами мы работаем. Мы также включили оператор Select Case и создали дескрипторы каждой возможной ситуации для конечного пользователя. Метод EnableDHCP в конце выдает целое значение. Значение 0 означает успешное выполнение метода и включение DHCP. Значение 1 означает успешное выполнение метода, но также необходимость перезапуска компьютера для вступления изменений в силу. Любое другое значение означает какую-то ошибку и отказ включения DHCP. Мы используем оператор Select Case для проверки этих целых значений и выдачи соответствующего сообщения.
Вы также можете отключить DHCP; для этого необходимо настроить статический IP-адрес и маску подсети в адаптере (см. Рисунок 3).
Figure 3 Настройка IP-адреса
arrIPAddress = Array("192.168.0.12")
arrSubnetMask = Array("255.255.255.0")
strComputer = "."
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled = 'True'")
For Each objItem in colItems
If objItem.DHCPEnabled = True Then
Wscript.Echo objItem.Caption
intReturn = objItem.EnableStatic(arrIPAddress, arrSubnetMask)
Select Case intReturn
Case 0
Wscript.Echo "Static address assigned"
Case 1
Wscript.Echo "You must reboot before the static address will take effect"
Case Else
Wscript.Echo "Error occurred"
End Select
Wscript.Echo
End If
Next
Сценарий на Рисунке 3 почти такой же, как сценарий на Рисунке 2 за исключением нескольких основных отличий. В начале сценария мы заявляем два массива, arrIPAddress и arrSubnetMask, и каждому приписывается определенное значение. Затем в нашей схеме For Each вместо контроля установки DHCPEnabled на False, мы проверяем его установку на True, что означает включение DHCP (что, в свою очередь, означает, что мы хотим отключить его). Затем мы обращаемся к методу EnableStatic на объекте адаптера. Вы заметите, что в отличие от метода EnableDHCP, метод EnableStatic использует параметры. Этими параметрами являются массивы, которые мы заявили ранее, и в которых содержится новый статический IP-адрес и маска подсети.
Дополнения Windows Vista
Как мы обещали (а группа Scripting Guys никогда, ну или редко нарушает свои обещания), сейчас мы покажем вам, что можно делать в Windows Vista. Как говорилось ранее, в Windows Vista в WMI-класс Win32_NetworkAdapter добавлены два новых метода, Enable и Disable, которые позволяют включать и отключать ваши сетевые адаптеры. Также добавлено новое свойство NetEnabled, которое выдает True при включенном адаптере и False при отключенном. На Рисунке 4 показан сценарий, которые осуществляет поиск всех отключенных сетевых адаптеров на компьютере, а затем включает их.
Figure 4 Включение сетевых адаптеров
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_NetworkAdapter Where NetEnabled = 'False'")
For Each objItem in colItems
Wscript.Echo "Name: " & objItem.Name
Wscript.Echo "Description: " & objItem.Description
objItem.Enable
Wscript.Echo
Next
Он почти такой же, как сценарий, приведенный на Рисунке 1. (Если вы не заметили, то мы настоятельно рекомендуем взглянуть еще раз.) Мы подключаемся к службе WMI на локальном компьютере и запрашиваем все события Win32_NetworkAdapter. Так как нас интересуют только отключенные адаптеры, то мы вводим условие Where:
Where NetEnabled = 'False'
В этом условии используется новое свойство NetEnabled, которое обозначает, что на запрос должны выдаваться только те адаптеры, в которых NetEnabled установлен на False—другими словами, отключенные адаптеры. Затем мы снова настраиваем схему For Each для опроса перечня объектов сетевых адаптеров, полученных в результате нашего запроса. После сообщения имени (Name) и описания (Description) адаптера мы обращаемся к методу Enable для включения адаптера.
Все это очень просто, да? И если бы только мы смогли освоить другой вид налаживания связей.
The Microsoft Scripting Guys Группа The Scripting Guys работает для — ну, нанята — компанией Microsoft. Когда мы не играем/тренируемся/смотрим бейсбол (а также не занимаемся другими делами), мы работаем в TechNet Script Center. Заходите на www.scriptingguys.com.
© 2008 Корпорация Майкрософт и компания CMP Media, LLC. Все права защищены; полное или частичное воспроизведение без разрешения запрещено.