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. Все права защищены; полное или частичное воспроизведение без разрешения запрещено.