Управление сетями Windows с помощью сценариев (Часть 2)

Published on Февраль 19, 2009 by   ·   Комментариев нет

В прошлом месяце я начал новую серию статей на WindowsNetworking.com, направленных на то, чтобы продемонстрировать вам, как управлять различными аспектами сетей Windows network с помощью сценариев (script). В первой статье рассказывалось о некоторых основах концепции написания сценариев, таких как объекты, методы (methods) и свойства, а целью статьи было написание простого сценария, который измял IP адрес, присвоенный вашем сетевому адаптеру (network adapter).

В этой статье мы продолжим совершенствовать первый сценарий, который мы назвали ChangeIPAddress.vbs:

strComputer = «.»
arrIPAddress = Array(«172.16.11.99»)
arrSubnetMask = Array(«255.255.255.0»)
Set objWMIService = GetObject(«winmgmts:\\» & strComputer & «\root\cimv2»)
Set colNetAdapters = objWMIService.ExecQuery(«Select * from Win32_NetworkAdapterConfiguration»)
For Each objNetAdapter in colNetAdapters
errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Next

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

К несчастью, во время работы сценария могут появляться ошибки, а также для хорошо написанного сценария может понадобиться описание переменных, обработка ошибок (error handling), использование ввода, и подтверждение вывода. Поэтому давайте улучшим наш сценарий, добавлением этих элементов, а в процессе улучшения мы сможем больше узнать об основах написания сценариев Windows.

Описание переменных

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

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

Option Explicit

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

C:\Documents and Settings\Administrator.DC-1\Desktop>ChangeIPAddress.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

C:\Documents and Settings\Administrator.DC-1\Desktop\ChangeIPAddress.vbs(2, 1) Microsoft VBScript runtime error: Variable is undefined: ‘strComputer’

В этом сообщении VBScript сообщает вам, что в строке 2 вашего сценария обнаружена ошибка. Какая у нас строка 2? Это:

strComputer = «.»

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

Option Explicit
Dim objWMIService
Dim objNetAdapter
Dim strComputer
Dim arrIPAddress
Dim arrSubnetMask
Dim colNetAdapters
Dim errEnableStatic

strComputer = «.»
arrIPAddress = Array(«172.16.11.93»)
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

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

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

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

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

On Error Resume Next

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

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

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

Option Explicit
On Error Resume Next

Dim objWMIService
Dim objNetAdapter
Dim strComputer
Dim strAddress
Dim arrIPAddress
Dim arrSubnetMask
Dim colNetAdapters
Dim errEnableStatic

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

Давайте разобьем это код на части и подробно рассмотрим каждую часть. Сперва, мы описали одну новую переменную:

Dim strAddress

Это строковая переменная, которая будет содержать аргумент, который мы укажем при запуске сценария. Далее мы добавили следующие строчки после секции описания переменных:

If WScript.Arguments.Count = 0 Then
Wscript.Echo «Usage: ChangeIPAddress.vbs new_IP_address»
WScript.Quit
End If

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

Наконец, старая строчка:

arrIPAddress = Array(«172.16.11.93»)

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

strAddress = Wscript.Arguments.Item(0)
arrIPAddress = Array(strAddress)

В первой строке переменной strAddress присваивается первый аргумент (аргумент с номером ноль) коллекции WScript.Arguments. Во второй стоке эта строковая переменная добавляется первым элементом в массив arrIPAddress.

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

C:\Documents and Settings\Administrator.DC-1\Desktop>ipconfig

Windows IP Configuration

Ethernet adapter Local Area Connection:

Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 172.16.11.31
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 172.16.11.1

C:\Documents and Settings\Administrator.DC-1\Desktop>ChangeIPAddress.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Usage: ChangeIPAddress.vbs new_IP_address

C:\Documents and Settings\Administrator.DC-1\Desktop>ChangeIPAddress.vbs 172.16.11.188
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

C:\Documents and Settings\Administrator.DC-1\Desktop>ipconfig

Windows IP Configuration

Ethernet adapter Local Area Connection:

Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 172.16.11.188
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 172.16.11.1

Чем дальше, тем лучше!

Подтверждение вывода

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

For Each objNetAdapter in colNetAdapters
errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Next

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

Wscript.Echo errEnableStatic

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

C:\Documents and Settings\Administrator.DC-1\Desktop>ChangeIPAddress.vbs 172.16.11.237
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

0

C:\Documents and Settings\Administrator.DC-1\Desktop>ipconfig

Windows IP Configuration

Ethernet adapter Local Area Connection:

Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 172.16.11.237
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 172.16.11.1

Достаточно понятно, что код ошибки, равный 0, говорит о том, что IP адресу адаптера был успешно изменен. Немного более красивый метод будет, если мы выведем сообщение:

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 адресом, а второй раз вместо адреса введем какую-нибудь чепуху:

C:\Documents and Settings\Administrator.DC-1\Desktop>ChangeIPAddress.vbs 172.16.11.173
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Adapter’s IP address has been successfully changed to 172.16.11.173

C:\Documents and Settings\Administrator.DC-1\Desktop>ChangeIPAddress.vbs 172.16.11.1492567
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Changing the adapter’s address was not successful. Error code 70

C:\Documents and Settings\Administrator.DC-1\Desktop>

Заключение

Последнее, что мы должны улучшить в нашем сценарии – это добавить новые комментарии, для лучшей документации нашего сценария. Благодаря этому, когда через год вам вновь придется изменить сценарий, вы сможете быстро вспомнить, что и для чего в нем предназначалось, а также, как это сделать. Ниже представлена конечная улучшенная версия нашего сценария для изменения IP адреса сетевого адаптера (network adapter) на нашей локальной машине:

‘=========================
‘ NAME: ChangeIPAddress.vbs

‘AUTHOR: Mitch Tulloch
‘DATE: October 2006

ARGUMENTS:
‘1. new_IP_address
‘=========================-

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

www.windowsnetworking.com








































































































Смотрите также:

Tags: ,

Readers Comments (Комментариев нет)




Да человек я, человек! =)




Exchange 2007

Проведение мониторинга Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 3)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Проведение мониторинга Exchange 2007 с помощью диспетчера System ... [+]

Практическое рассмотрение перехода с Exchange 2003 на Exchange 2007 (часть 1)

Введение В этой статье из нескольких частей я хочу показать вам процесс, который недавно использовал для перехода с существующей среды Exchange 2003 ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 2)

Если вы пропустили первую часть этой серии, пожалуйста, прочтите ее по ссылке Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (Часть ... [+]

Мониторинг Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 2)

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Мониторинг Exchange 2007 с помощью диспетчера System Center Operations ... [+]

Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 5)

Если вы пропустили предыдущие части этой серии статей, перейдите по ссылкам: Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 1) ... [+]

Установка и настройка Exchange 2007 из командной строки (Часть 3)

If you missed the previous parts in this article series please read: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 1)

Инструмент ExRCA Текущий выпуск инструмента предоставляется только в целях тестирования и оснащен 5 опциями: Тест подключения Outlook 2007 Autodiscover Тест подключения Outlook 2003 RPC ... [+]

Развертывание сервера Exchange 2007 Edge Transport (часть 5)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Развертывание сервера Exchange 2007 Edge Transport (часть 1) Развертывание ... [+]

Установка и настройка Exchange 2007 из командной строки (часть 2)

Если вы пропустили первую статью данного цикла, пожалуйста, перейдите по ссылке: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование интегрированных сценариев Using Exchange Server 2007 – часть 2: генерирование отчетов агента Transport AntiSpam Agent

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Использование интегрированных сценариев Using Exchange Server 2007 – часть ... [+]