В первых двух статьях из этой серии мы узнали об основах написания сценариев для управления сетевыми настройками TCP/IP. В частности, мы разработали следующий простой сценарий для изменения IP адреса сетевого адаптера:
Option Explicit
On Error Resume Next
Dim objWMIService
Dim objNetAdapter
Dim strComputer     ' Can specify IP address or hostname or FQDN
Dim strAddress     'Contains the new IP address
Dim arrIPAddress
Dim arrSubnetMask
Dim colNetAdapters
Dim errEnableStatic
'Check for missing arguments
If WScript.Arguments.Count = 0 Then
     Wscript.Echo "Usage: ChangeIPAddress.vbs new_IP_address"
     WScript.Quit
End If
strComputer = "."
strAddress = Wscript.Arguments.Item(0)
arrIPAddress = Array(strAddress)
arrSubnetMask = Array("255.255.255.0")
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each objNetAdapter in colNetAdapters
     errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Next
'Display result or error code
If errEnableStatic=0 Then
     Wscript.Echo "Adapter's IP address has been successfully changed to " & strAddress
Else
     Wscript.Echo "Changing the adapter's address was not successful. Error code " & errEnableStatic
End If
Представленный выше сценарий изменяет IP адрес сетевого адаптера с помощью класса Win32_NetworkAdapterConfiguration, который является наиболее часто используемым классом WMI для управления сетевой конфигурацией TCP/IP на Windows платформе. В нашей третье статье мы кратко рассмотрим «WMI Land» для более подробного изучения пространства имен WMI namespaces, поставщиков (provider) и классов, чтобы мы могли лучше понять следующую строку, которая лежит в основе этого сценария:
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Если вы помните, то эта строка позволяет нам подключиться к пространству имен root\cimv2 namespace на локальном компьютере, благодаря описанию объекта под названием objWMIService и присвоении ему значения, возвращаемым методом GetObject. И конечно, после того, как вы подключились к этому пространству имен (namespace), вы можете получить необходимую вам информацию.
В этой статье, мы сфокусируемся на строке, которая следует за этой в нашем сценарии, и которая позволяет использовать класс Win32_NetworkAdapterConfiguration:
Set colNetAdapters = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
Если вы снова вспомните, эта строка позволяет вам вызвать метод ExecQuery для объекта под названием objWMIService, который мы объявили в первой строке. Оператор SELECT передается в этот метод в качестве аргумента, и все множество конфигураций сетевых адаптеров (network adapter) на компьютере, которые связаны с TCP/IP и подключены, возвращаются и присваиваются переменной под названием colNetAdapters. После того, как мы получили эту коллекцию, мы можем пройтись по ней в цикле For Each…Next. Помните, что вы всегда должны проходить по коллекции в цикле, даже если в ней содержится всего один объект.
Возникает такой вопрос:”А что еще можно сделать с помощью класса Win32_NetworkAdapterConfiguration ?”
Вспомните, что свойства позволяют получить информацию из системы с помощью WMI. Чем больше свойств имеет класс WMI, тем больше информации вы можете из него получить. Класс под названием Win32_NetworkAdapterConfiguration в действительности имеет 61 различное свойство, некоторые из которых уникальны, а некоторые наследуются из других классов. Полный список свойств класса Win32_NetworkAdapterConfiguration вы можете найти на странице MSDN, которую можно найти здесь. Если вы попытаетесь выяснить, как писать сценарии с использованием WMI, то вы сможете управлять сетями Windows networks с помощью сценариев, очень важно познакомиться с информацией о WMI, которая представлена в MSDN, и на рисунке 1 ниже, изображены некоторые из свойств:

Рисунок 1: Свойства класса Win32_NetworkAdapterConfiguration
На рисунке выше я нажал на ссылку для свойства типа boolean под названием IPEnabled, которое мы использовали в нашем сценарии для того, чтобы идентифицировать все сетевые адаптеры в нашей системе, которые связаны с TCP/IP, и включены на них. Мы сделали это передав в качестве аргумента методу объекта objWMIService.ExecQuery следующий SQL запрос:
Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE
Теперь мы можем увидеть, как мы можем расширить функциональность нашего сценария, запросив другие свойства этого класса. Например, если мы хотим выбрать все сетевые адаптеры в нашей системе, на которых подключен DHCP, мы просто должны изменить наш оператор SELECT:
Select * from Win32_NetworkAdapterConfiguration where DHCPEnabled=TRUE
Откуда мы это узнали? Эту информацию мы нашли на той же странице MSDN, как видно из рисунка 2:

Рисунок 2: Свойство DHCPEnabled класса Win32_NetworkAdapterConfiguration class
Как насчет методов для этого класса? Вспомните, что методы – это то, что вы можете вызвать для выполнения различных действий с помощью WMI. Класс Win32_NetworkAdapterConfiguraiton также имеет много методов, в действительности в нем 41 метод. Вы можете найти список методов для этого класса на той же странице ниже свойств (смотри Рисунок 3):

Рисунок 3: Методы класса Win32_NetworkAdapterConfiguration
Давайте на момент вернемся к следующей основной секции в нашем сценарии:
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each objNetAdapter in colNetAdapters
     errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Next
Сначала мы использовали свойство под названием IPEnabled для класса Win32_NetworkAdapterConfiguration для того, чтобы получить набор сетевых адаптеров, который связаны с TCP/IP и подключены на них. Затем мы вызвали метод под названием EnableStatic этого же самого класса для изменения IP адреса и маски подсети (subnet mask) для этих сетевых адаптеров с помощью переменных массива arrIPAddress и arrSubnetMask, которые мы предварительно описали в этом сценарии. Откуда мы узнали, что мы должны были передать две переменных в качестве аргументов для этого метода? Мы просто нажали на ссылку EnableStatic, что видно на рисунке 3 выше на странице MSDN и получили страницу, изображенную на рисунке 4, на которой рассказывается о том, как использовать этот класс:

Рисунок 4: Подробная информация о методе EnableStatic для класса Win32_NetworkAdapterConfiguration
Обратите внимание, что на этой странице MSDN, мы видим не только синтаксис вызова этого класса, но и также возвращаемое значение, а также информацию о том, как интерпретировать различные коды ошибок, которые могут возникать при использовании этого класса. Именно для этого мы используем переменную для кода ошибки в этой строке кода:
errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Именно поэтому мы включили следующие строки в наш сценарий, чтобы иметь информацию о возникающей ошибке:
If errEnableStatic=0 Then
     Wscript.Echo "Adapter's IP address has been successfully changed to " & strAddress
Else
     Wscript.Echo "Changing the adapter's address was not successful. Error code " & errEnableStatic
End If
И снова, мы можем увидеть, как мы можем расширить функциональность нашего сценария, в этот раз с помощью вызовов других методов этого класса. Например, предположим, что мы захотели отключить NetBIOS через TCP/IP (NetBT) на всех наших сетевых адаптерах (network adapter) TCP/IP. После недолго поиска в MSDN на странице для класса Win32_NetworkAdapterClass, мы нашли метод под названием SetTcpNetbios, который великолепно для этого подходит (смотри Рисунок 5):

Рисунок 5: метод  SetTcpipNetbios класса Win32_NetworkAdapterConfiguration
При нажатии на ссылку для этого метода, мы получим страницу с информацией по его использованию (Рисунок 6):

Рисунок 6: Подробная информация, относительно метода SetTcpipNetbios
Мы можем увидеть, что если мы хотим отключить NetBT на всех наших адаптерах, то мы можем это сделать с помощью замены следующей строчки в нашем сценарии:
     errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
на такую:
     errEnableStatic = objNetAdapter.SetTcpipNetbios(2)
После внесения изменений и удаления переменных, которые более не используются, мы получаем следующий сценарий, который позволяет нам отключить NetBT на всех сетевых адаптерах TCP/IP:
'=========================
' NAME: DisableNetbios.vbs
'
'AUTHOR: Mitch Tulloch
'DATE: December 2006
'
'ARGUMENTS:
'1. None
'=========================-
Option Explicit
On Error Resume Next
Dim objWMIService
Dim objNetAdapter
Dim strComputer     ' Can specify IP address or hostname or FQDN
Dim colNetAdapters
Dim errDisableNetbios
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each objNetAdapter in colNetAdapters
     errEnableStatic = objNetAdapter.SetTcpipNetbios(2)
Next
'Display result or error code
If errDisableNetbios=0 Then
     Wscript.Echo "NetBIOS has been successfully disabled on the adapters"
Else
     Wscript.Echo "Disabling NetBIOS was not successful. Error code " & errDisableNetbios
End If
Давай проверим, работает ли этот сценарий. На рисунке 7 показана закладка WINS расширенных свойств Advanced TCP/IP Properties для локальных соединений (Local Area Connection) на компьютере с операционной системой Windows Server 2003:

Рисунок 7: Настройки NetBIOS через TCP/IP на компьютере с Windows Server 2003
Обратите внимание, что текущие настройки NetBT на этой машине «Default» (по умолчанию), что соответствует значению 0 для метода SetTcpipNetbios (смотрите Рисунок 6). Давайте скопируем наш новый сценарий в Notepad (убедитесь, что Word Wrap выключено) и сохраните его под названием DisableNetbios.vbs. Затем, мы запустим его на нашем сервере в командной строке (Рисунок 8):

Рисунок 8: Отключение NetBIOS через TCP/IP с помощью сценария
Теперь проверим выполнение нашего сценария. Нам нужно закрыть нашу страницу свойств TCP/IP и заново открыть ее для того, чтобы обновить настройки NetBT в графическом интерфейсе GUI, который выглядит так (Рисунок 9):

Рисунок 9: NetBT успешно отключен
Лучший способ изучения написания сценариев Windows заключается в практических занятиях, поэтому ниже представлено пару упражнений, которые вы можете попробовать выполнить сами для закрепления материала, приведенного в этой статье:
www.windowsnetworking.com