Управление сетями Windows с помощью сценариев — часть 2: очистка

Опубликовано: 24 Марта, 2023

  • Управление сетями Windows с помощью сценариев. Часть 4. Использование Win32_NetworkAdapterConfiguration
  • Управление сетями Windows с помощью сценариев. Часть 5. Преодолеваем трудности
  • Управление сетями Windows с помощью сценариев. Часть 7. Устранение загадочной ошибки
  • Управление сетями Windows с помощью сценариев. Часть 8. Устранение неполадок с удаленными сценариями с помощью Network Monitor 3.0
  • Управление сетями Windows с помощью сценариев. Часть 9. Общие сведения об удаленных сценариях
  • Управление сетями Windows с помощью скриптов. Часть 10. Приемы удаленного скриптинга
  • Управление сетями Windows с помощью сценариев. Часть 11. Дополнительные приемы работы со сценариями
  • Управление сетями Windows с помощью сценариев. Часть 12. Свойства класса WMI
  • Управление сетями Windows с помощью сценариев. Часть 13. Удобный сценарий возврата всех значений
  • Управление сетями Windows с помощью сценариев. Часть 14. Дополнительные сведения о сценариях WMI

В прошлом месяце я начал новую серию статей здесь, на WindowsNetworking.com, предназначенных для демонстрации того, как управлять различными аспектами сетей Windows с помощью сценариев. В первой статье были представлены некоторые основные концепции сценариев, такие как объекты, методы и свойства, и целью статьи было написать простой сценарий, который изменил IP-адрес, назначенный вашему сетевому адаптеру. Вот что мы придумали для нашего первого скрипта, который мы назвали ChangeIPAddress.vbs:

стрКомпьютер = «.»
arrIP-адрес = Массив («172.16.11.99»)
arrSubnetMask = Массив («255.255.255.0»)
Установите objWMIService = GetObject("winmgmts:\" & strComputer & " ootcimv2")
Установите colNetAdapters = objWMIService.ExecQuery («Выберите * из Win32_NetworkAdapterConfiguration»)
Для каждого objNetAdapter в colNetAdapters
errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Следующий


Получите свою копию Windows Server Hacks!

Когда я запустил этот сценарий на своем сервере Windows, он успешно изменил IP-адрес машины с.45 на.99, что можно было увидеть, запустив ipconfig до и после запуска сценария. Все идет нормально.

К сожалению, хотя приведенный выше сценарий работает, он несколько «запутан», поскольку в нем отсутствуют некоторые вещи, которые должны быть в хорошо написанных сценариях, такие как определения переменных, обработка ошибок, использование ввода и подтверждение вывода. Итак, давайте «очистим» наш сценарий, добавив эти элементы, и попутно узнаем больше об основах написания сценариев для Windows.

Определения переменных

Первое, что мы сделаем, чтобы привести наш сценарий в порядок, — это определим используемые в нем переменные. Хотя VBScript позволяет неявно определять переменные, просто используя их в операторе, всегда полезно явно объявлять переменные в начале сценария. Объявление переменной сообщает VBScript о ее существовании, чтобы он мог выделить для нее память. Почему объявление переменных — это хорошая идея? Что ж, в длинном сценарии вы, вероятно, сделаете опечатку или две, и если вы наберете имя переменной неправильно, ваш сценарий может работать не так, как ожидалось. Но если вы явно объявляете переменные в начале скрипта, то любая переменная, которая позже будет неявно объявлена в скрипте (например, вызванная опечаткой), будет генерировать ошибку времени выполнения, и такие ошибки могут помочь вам определить ваши опечатки и устранить неполадки. скрипты.

Чтобы сообщить VBScript, что вы явно объявляете все переменные в своем скрипте, добавьте следующий оператор в начале вашего скрипта:

Опция явная

Если вы просто добавите этот оператор в начало нашего сценария ChangeIPAddress.vbs, а затем запустите этот сценарий из командной строки, вы получите следующий результат:

C:Documents and SettingsAdministrator.DC-1Desktop> ChangeIPAddress.vbs
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.

C:Documents and SettingsAdministrator.DC-1DesktopChangeIPAddress.vbs(2, 1) Ошибка выполнения Microsoft VBScript: переменная не определена: 'strComputer'

Что здесь говорит VBScript (или, скорее, что говорит зарегистрированный скриптовый движок Windows Script Host для запуска скриптов VBScript), так это то, что в строке 2 нашего скрипта есть ошибка. Что в строке 2? Этот:

улКомпьютер = "."

Почему это вызывает ошибку времени выполнения? Потому что мы присваиваем значение строковой переменной (strComputer), которую еще не объявили. Итак, давайте теперь добавим объявления переменных для переменных, которые мы используем в нашем скрипте:

Опция явная
Дим objWMIService
Dim objNetAdapter
Dim strКомпьютер
Dim arrIP-адрес
Dim arrSubnetMask
Dim colNetAdapters
Dim errEnableStatic

улКомпьютер = "."
arrIP-адрес = Массив («172.16.11.93»)
arrSubnetMask = Массив («255.255.255.0»)
Установите objWMIService = GetObject("winmgmts:\" & strComputer & " ootcimv2")
Установите colNetAdapters = objWMIService.ExecQuery («Выберите * из Win32_NetworkAdapterConfiguration, где IPEnabled = TRUE»)
Для каждого objNetAdapter в colNetAdapters
errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Следующий

Обратите внимание, что когда вы используете Option Explicit, вы должны объявить все переменные в вашем скрипте, включая объекты, строки, массивы, коллекции, переменные для кодов ошибок и так далее. Это может показаться слишком хлопотным, но поверьте мне, как только ваши сценарии начинают занимать несколько страниц, это может стать спасением для устранения ошибок во время выполнения. Также обратите внимание, что не имеет значения, в каком порядке вы объявляете свои переменные, просто обязательно объявляйте каждую переменную перед ее использованием. Обычно лучше всего размещать все ваши объявления переменных в начале вашего скрипта в виде одного раздела, как мы сделали выше.

Обработка ошибок

Теперь, когда мы удалили опечатки (надеюсь) из нашего скрипта, когда мы запускаем исправленный скрипт, он работает. Но что, если это не так? Например, что, если мы изменим наш сценарий, чтобы запускать его на удаленном компьютере, а не на локальном (я объясню, как это сделать в следующей статье), но удаленный компьютер не находится в сети? Опять же, произойдет ошибка времени выполнения (ошибка, которая происходит во время выполнения сценария, в отличие от синтаксической ошибки, которую VBScript распознает при компиляции сценария перед его запуском), и сценарий остановится и отобразит сообщение об ошибке, подобное к тому, который мы показали ранее, что, конечно, хорошо. А что, если мы напишем скрипт, который должен выполнять ряд действий? В этом случае мы могли бы не захотеть, чтобы ошибка времени выполнения останавливала сценарий — мы могли бы захотеть, чтобы сценарий продолжал работать, чтобы он мог, по крайней мере, выполнять все другие действия, которые он должен был выполнить. Хорошим примером является сценарий, который отслеживает настройки на нескольких компьютерах, но не изменяет эти настройки. В этом случае вы хотите, чтобы сценарий продолжал работать, даже если один или несколько компьютеров недоступны.

Самый простой способ обработки ошибок во время выполнения — игнорировать их, когда они возникают. Вы можете указать VBScript сделать это, добавив следующий оператор в начале вашего скрипта:

При ошибке Возобновить Далее

Хорошее место, чтобы добавить это сразу после Option Explicit, так что давайте сделаем это с нашим скриптом. Конечно, бывают случаи, когда вы можете захотеть сделать что-то большее в отношении обработки ошибок. Например, вы можете захотеть проверить наличие состояния ошибки во время выполнения в какой-то момент вашего скрипта (например, после попытки подключения к службе WMI на удаленном компьютере), чтобы вы могли проверить, выполняется ли определенное действие скриптом. должен выполнить, удалось или нет. Затем, основываясь на результатах тестирования на наличие этого состояния ошибки, вы можете решить, что должен делать скрипт. Например, если произошла ошибка, вы можете отобразить сообщение «Компьютер X не найден», а затем продолжить выполнение сценария. Мы подробно рассмотрим подобную обработку ошибок в одной из следующих статей этой серии, а пока давайте просто добавим приведенный выше оператор, чтобы игнорировать любые возникающие ошибки времени выполнения.

Пользовательский ввод

Что, если мы захотим указать новый IP-адрес для машины при запуске скрипта вместо того, чтобы жестко кодировать его в нашем скрипте как 172.16.11.99? В этом случае нам нужно изменить сценарий, чтобы мы могли предоставлять пользовательский ввод при его запуске. Хорошим способом сделать это было бы, если бы мы могли указать аргументы при запуске нашего скрипта из командной строки, например, набрав ChangeIPAddress.vbs 172.16.11.188, вы должны изменить IP-адрес нашего сетевого адаптера на 172.16.11.188 и так далее.. Вот как пересмотреть наш сценарий, чтобы мы могли это сделать:

Опция явная
При ошибке Возобновить Далее

Дим objWMIService
Dim objNetAdapter
Dim strКомпьютер
Дим улАдрес
Dim arrIP-адрес
Dim arrSubnetMask
Dim colNetAdapters
Dim errEnableStatic

Если WScript.Arguments.Count = 0 Тогда
Wscript.Echo «Использование: ChangeIPAddress.vbs новый_IP_адрес»
WScript.Выйти
Конец, если

улКомпьютер = "."
strAddress = Wscript.Аргументы.Элемент (0)
arrIP-адрес = Массив (strAddress)
arrSubnetMask = Массив («255.255.255.0»)
Установите objWMIService = GetObject("winmgmts:\" & strComputer & " ootcimv2")
Установите colNetAdapters = objWMIService.ExecQuery («Выберите * из Win32_NetworkAdapterConfiguration, где IPEnabled = TRUE»)
Для каждого objNetAdapter в colNetAdapters
errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Следующий

Давайте разберем это по частям. Во-первых, мы объявили одну новую переменную:

Дим улицаАдрес

Это строковая переменная, которая будет содержать аргумент (IP-адрес), который мы указываем при запуске скрипта. Затем мы добавили следующие строки после нашего раздела объявлений:

Если WScript.Arguments.Count = 0 Тогда
Wscript.Echo «Использование: ChangeIPAddress.vbs новый_IP_адрес»
WScript.Выйти
Конец, если

Что это делает? Свойство Arguments объекта WScript возвращает набор аргументов, указанных при запуске скрипта. Метод Count возвращает количество введенных нами аргументов, а этот фрагмент кода проверяет, не забыли ли мы ввести какие-либо аргументы (количество аргументов равно нулю). Если это так, он повторяет (отображает) сообщение, говорящее нам, как правильно использовать сценарий, а затем сценарий завершает работу, не продолжая работу.

Наконец, предыдущая строка:

arrIP-адрес = Массив («172.16.11.93»)

где мы жестко закодировали новый IP-адрес, который должен быть назначен, теперь заменен этими двумя строками:

strAddress = Wscript.Аргументы.Элемент (0)
arrIP-адрес = Массив (strAddress)

Первая строка берет первый элемент (номер элемента) коллекции WScript.Arguments и присваивает его строковой переменной strAddress. Затем вторая строка берет этот strAddress и назначает его первым элементом массива arrIPAddress.

Давайте посмотрим, что произойдет, когда мы запустим этот новый скрипт, сначала без указания аргумента, а затем с аргументом:

C:Documents and SettingsAdministrator.DC-1Desktop> ipconfig

IP-конфигурация Windows

Ethernet-адаптер Подключение по локальной сети:

DNS-суффикс для конкретного подключения.:
Айпи адрес............: 172.16.11.31
Маска подсети...........: 255.255.255.0
Шлюз по умолчанию.........: 172.16.11.1

C:Documents and SettingsAdministrator.DC-1Desktop> ChangeIPAddress.vbs
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.

Использование: ChangeIPAddress.vbs новый_IP_адрес

C:Documents and SettingsAdministrator.DC-1Desktop> ChangeIPAddress.vbs 172.16.11.188
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.

C:Documents and SettingsAdministrator.DC-1Desktop> ipconfig

IP-конфигурация Windows

Ethernet-адаптер Подключение по локальной сети:

DNS-суффикс для конкретного подключения.:
Айпи адрес............: 172.16.11.188
Маска подсети...........: 255.255.255.0
Шлюз по умолчанию.........: 172.16.11.1

Все идет нормально!

Вывод подтверждения

Затем я немного устал вводить ipconfig после запуска моего скрипта, чтобы увидеть, сделал ли он то, что я ожидал. Есть ли способ проверить результат скрипта, не делая этого? Да, есть! Обратите внимание на следующие строки нашего скрипта:

Для каждого objNetAdapter в colNetAdapters
errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Следующий

Хотя целью этого кода является изменение IP-адреса, назначенного сетевому адаптеру, с помощью метода objNetAdapter.EnableStatic, я отметил в своей предыдущей статье этой серии, что нам нужно использовать переменную err (здесь errEnableStatic) в качестве места для сохранить код ошибки, возвращенный при запуске метода. Список возможных кодов ошибок, которые могут быть возвращены методом EnableStatic класса Win32_NetworkAdapterConfiguration, находится здесь, в MSDN, и из этого списка мы можем видеть, что возвращенный код ошибки, равный нулю, означает, что операция прошла успешно (т. е. IP-адрес адаптера был успешно изменено). Самый простой способ проверить это — повторить этот код ошибки, добавив эту строку в конец нашего скрипта:

Wscript.Echo errEnableStatic

Давайте снова запустим наш скрипт и увидим это:

C:Documents and SettingsAdministrator.DC-1Desktop> ChangeIPAddress.vbs 172.16.11.237
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.

C:Documents and SettingsAdministrator.DC-1Desktop> ipconfig

IP-конфигурация Windows

Ethernet-адаптер Подключение по локальной сети:

DNS-суффикс для конкретного подключения.:
Айпи адрес............: 172.16.11.237
Маска подсети...........: 255.255.255.0
Шлюз по умолчанию.........: 172.16.11.1

Конечно же, код ошибки 0 означает, что IP-адрес был успешно изменен. Вместо этого было бы лучше отобразить сообщение, заменив этот оператор echo следующим:

Если errEnableStatic=0 Тогда
Wscript.Echo «IP-адрес адаптера был успешно изменен на » & strAddress
Еще
Wscript.Echo «Не удалось изменить адрес адаптера. Код ошибки ”& errEnableStatic
Конец, если

Давайте добавим это в конец нашего скрипта и попробуем запустить скрипт дважды, один раз с правильным IP-адресом и один раз с ерундой:

C:Documents and SettingsAdministrator.DC-1Desktop> ChangeIPAddress.vbs 172.16.11.173
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.

IP-адрес адаптера был успешно изменен на 172.16.11.173.

C:Documents and SettingsAdministrator.DC-1Desktop> ChangeIPAddress.vbs 172.16.11.1492567
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.

Изменение адреса адаптера не удалось. Код ошибки 70

C:Documents and SettingsАдминистратор.DC-1Рабочий стол>

Последнее, что мы хотим сделать, чтобы очистить наш сценарий, — это добавить несколько комментариев, чтобы задокументировать наш сценарий. Это всегда хорошая идея, так как когда год спустя вы вытащите сценарий из своего набора инструментов и захотите использовать или изменить его, вы сможете быстро понять, что он должен делать. Вот наш окончательный, очищенный скрипт для изменения IP-адреса сетевого адаптера на нашей машине:

'==========================
' ИМЯ: ChangeIPAddress.vbs
'
АВТОР: Митч Таллок
ДАТА: октябрь 2006 г.
'
АРГУМЕНТЫ:
'1. новый_IP_адрес
'==========================-

Опция явная
При ошибке Возобновить Далее

Дим objWMIService
Dim objNetAdapter
Dim strComputer ' Можно указать IP-адрес, имя хоста или полное доменное имя
Dim strAddress 'Содержит новый IP-адрес
Dim arrIP-адрес
Dim arrSubnetMask
Dim colNetAdapters
Dim errEnableStatic

'Проверить отсутствующие аргументы

Если WScript.Arguments.Count = 0 Тогда
Wscript.Echo «Использование: ChangeIPAddress.vbs новый_IP_адрес»
WScript.Выйти
Конец, если

улКомпьютер = "."
strAddress = Wscript.Аргументы.Элемент (0)
arrIP-адрес = Массив (strAddress)
arrSubnetMask = Массив («255.255.255.0»)
Установите objWMIService = GetObject("winmgmts:\" & strComputer & " ootcimv2")
Установите colNetAdapters = objWMIService.ExecQuery («Выберите * из Win32_NetworkAdapterConfiguration, где IPEnabled = TRUE»)
Для каждого objNetAdapter в colNetAdapters
errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Следующий

'Показать результат или код ошибки

Если errEnableStatic=0 Тогда
Wscript.Echo «IP-адрес адаптера был успешно изменен на » & strAddress
Еще
Wscript.Echo «Смена адреса адаптера не удалась. Код ошибки ”& errEnableStatic
Конец, если

  • Управление сетями Windows с помощью сценариев. Часть 4. Использование Win32_NetworkAdapterConfiguration
  • Управление сетями Windows с помощью сценариев. Часть 5. Преодолеваем трудности
  • Управление сетями Windows с помощью сценариев. Часть 7. Устранение загадочной ошибки
  • Управление сетями Windows с помощью сценариев. Часть 8. Устранение неполадок с удаленными сценариями с помощью Network Monitor 3.0
  • Управление сетями Windows с помощью сценариев. Часть 9. Общие сведения об удаленных сценариях
  • Управление сетями Windows с помощью скриптов. Часть 10. Приемы удаленного скриптинга
  • Управление сетями Windows с помощью сценариев. Часть 11. Дополнительные приемы работы со сценариями
  • Управление сетями Windows с помощью сценариев. Часть 12. Свойства класса WMI
  • Управление сетями Windows с помощью сценариев. Часть 13. Удобный сценарий возврата всех значений
  • Управление сетями Windows с помощью сценариев. Часть 14. Дополнительные сведения о сценариях WMI