В первых двух статьях из этой серии мы узнали об основах написания сценариев для управления сетевыми настройками 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