Работа, которую WSH может сделать за вас

Боб Уэллс. консультант по программному обеспечению; специализируется на вопросах проектирования и реализации инфрастуктуры информационных систем, основанных на NT. Имеет сертификаты MCSE и MCT. С ним можно связаться по адресу bobwells@winntmag.com.
В некоторых компаниях не знают, для чего можно использовать Windows Scripting Host (WSH), и потому откладывают его внедрение. Переведя вашу среду регистрации на WSH, вы сможете запускать, в том числе по графику, на клиентских машинах богатые возможностями, интеллектуальные сценарии, и лучше подготовиться к переходу на Windows 2000. Какие же именно задачи может выполнять WSH?

Одна из наиболее типичных сфер применения WSH — сценарии для регистрации пользователей NT в сети. «Перевод» используемого вами сценария на WSH будет состоять из трех этапов: установка WSH на клиентские системы, создание пакетного файла для запуска сценария и преобразование используемых пакетных файлов в сценарий на Visual Basic Script (VBScript) или JScript.

Установка WSH

Как вы уже, вероятно, знаете, Windows NT 4.0 не поддерживает возможность входа в систему с помощью сценариев WSH. Поэтому вам необходимо установить WSH на каждый из клиентов, где планируется запускать сценарии WSH. Чтобы определить, установлена ли уже поддержка WSH, можно воспользоваться стандартным сценарием NT для входа в систему.

Если вы пользуетесь сервисом NT Directory Replicator, то первым этапом установки WSH на клиенты будет копирование самораспаковывающегося архива wsh.exe в каталог %systemroot%system32ReplExportScripts на сервере экспорта. Сервером экспорта, как правило, является основной контроллер доменов (Primary Domain Controller, PDC). Архив с WSH можно получить по адресу http://www.msdn.microsoft.com/ scripting.

Затем нужно создать регистрационный сценарий, аналогичный start.bat, приведенному на листинге 1, или включить в ваш start.bat строчку A листинга 1. Эта строчка проверяет, установлен ли на клиенте файл wscript.exe. Если start.bat не находит wscript.exe, сценарий запускает программу установки WSH без вывода сообщений на экран (с параметром /q). Единственный недостаток этой процедуры в том, что пользователь, запускающий регистрационный сценарий на клиентской машине, должен обладать правами администратора. Если таких прав у пользователя нет, компонент с объектной моделью WSH (wshom.ocx), содержащий объекты WSH Network и Shell, не будет зарегистрирован.

Листинг 1: start.bat

@echo off if not ?%OS%?==?Windows_NT? goto EXIT A if not exist %windir%system32wscript.exe start /wait%0..wsh.exe /q B cscript.exe //nologo %0..logon.vbs :EXIT exit

Создание файла-оболочки

Регистрационный сценарий WSH необходимо вызывать из пакетного файла-оболочки, потому что процедура входа в Windows NT 4.0 не поддерживает WSH-совместимые сценарии на ActiveX. (В Windows 2000 их поддержка появится). По умолчанию при входе в NT вы можете запускать только пакетные (с расширением .bat или .cmd) и исполняемые файлы. Как видно из start.bat, можно включить код запуска WSH-скрипта в пакетный файл входа в NT 4.0, проверяющий, установлена ли поддержка WSH на клиентской системе. Строка B на листинге 1 вызывает написанный мною на VBScript регистрационный сценарий, logon.vbs.

Для запуска регистрационного сценарием WSH вы можете воспользоваться программами wscript.exe или cscript.exe. Главная разница между ними в том, что только cscript.exe дает возможность пользоваться переменной окружения ERRORLEVEL интерпретатора команд NT, cmd.exe. (ERRORLEVEL — переменная, содержащая код выхода из последней команды, выполненной интерпретатором команд). Если для возвращения кода выхода файлу-оболочке вы планируете воспользоваться методом WScript.Quit, то запускать ваш сценарий необходимо при помощи cscript.exe.

Как переписать существующий сценарий

После установки WSH на клиенты и выбор способа запуска сценариев из пакетного файла можно начинать перевод существующих сценариев на WSH. Вначале вам предстоит решить, на чем писать новые сценарии — на VBScript или JScript — оба эти основанные на ActiveX механизма выполнения сценариев поставляются с WSH. Выбор языка сценариев, в общем, дело вкуса, но не следует забывать, что VBScript и JScript существенно различаются по синтаксису и функциональным возможностям. VBScript больше похож на Visual Basic, а JScript весьма напоминает Си и Java. К примеру, Jscript поддерживает регулярные выражения, а VBScript — нет (хотя в VBScript 5.0 их поддержка уже есть). Я предпочитаю пользоваться VBScript, потому что он прост, похож на Visual Basic и поддерживает компонентную модель Component Object Model. Кроме того, при написании регистрационных сценариев я могу не беспокоиться о поддержке кросс-платформенности на уровне браузеров (для чего, собственно, изначально были предназначены JScript и JavaScript).

Чтобы переписать уже имеющиеся у вас сценарии на VBScript, вам нужно усвоить, как решаются следующие задачи: запуск внешних команд на выполнение; замена команд net.exe на соответствующие объекты, методы и свойства WSH; и замена Microsoft Windows NT Resource Kit или иного комплекта команд и утилит на функции, поддерживаемые объектной моделью WSH.

Работая над переводом, вы обнаружите, что WSH не имеет полных аналогов некоторых команд и утилит, которыми вы пользовались. Поэтому для выполнения отдельных задач вам придется воспользоваться внешними командами. В частности, WSH не имеет объекта синхронизации времени, аналогичного по функциям команде NET TIME. Чтобы синхронизировать локальное время на клиентах с временем в регистрирующем их домене, придется воспользоваться методом WSH Shell Run, выполняющим внешние команды.

Кроме того, некоторые из функций, выполняемых при помощи команд NT или утилит Resource Kit, придется реализовывать в сценариях WSH при помощи объектных библиотек, таких как Active Directory Service Interfaces (ADSI). К примеру, если в исходном пакетном файле для определения, к какой группе принадлежит клиент, используется утилита Resource Kit ifmember.exe, то в сценарии WSH ее можно заменить на объект ADSI Group и соответствующий метод IsMember.

Подбирая замену функциям, вызываемым из пакетного файла, не забывайте, что сам по себе механизм исполнения сценариев, которым вы пользуетесь, содержит немало полезных объектов, в частности, FileSystemObject, Err и Dictionary. Таблица 1 показывает, как с помощью WSH выполнять некоторые стандартные функции, реализуемые пакетными файлами.

Таблица 1: Соответствие между функциями WSH и командами пакетных файлов

Задача Решение средствами пакетного файла каталогов и диска Решение средствами WSH
Определение степени заполнения Утилиты Resource Kit diruse.exe и diskuse.exe FileSystemObject в VBScript
Выполнение файловых операций ввода/вывода Символы перенаправления ввода/вывода (>, >>, <, |) и командные фильтры (find,more, sort) FileSystemObject в VBScript
Использование переменных окружения Команда Set и конструкция % ПеременнаяОкружения% Свойство Environment объекта WSH Shell
Обработка ошибок Переменная окружения ERRORLEVEL Объект VBScript Err
Получение информации от пользователя Передача параметров, заданных в командной строке, через %1, %2, %3 т.д.Передача параметров, заданных в командной строке, через свойство Arguments в и WScript или организация интерактивного ввода параметров с помощью функции VBScript InputBox
Экранный вывод сообщений Команда Echo Метод WScript Echo, метод Popup объекта WSH Shell, функция VBScript MsgBox
Установление сетевых соединений Команды net.exe Объект WSH Network
Запись и чтение реестра утилита Resource Kit reg.exe Объекты WSH Shell RegDelete, RegRead и RegWrite
Выполнение внешних команд Имя команды или утилиты Метод Run объекта WSH Shell
Поиск с использованием регулярных выражений Символы перенаправления ввода/вывода (<,|) и фильтры команд (find, findstr) Объект VBScript RegExp (пока не реализован)
Манипуляции с пользователями и группами Команды net.exe, различные утилиты, в том числе входящие в Resource Kit ADSI

Перевод регистрационного сценария на WSH

Теперь, когда вы знаете, какие трудности вас могут ждать на пути преобразования регистрационных сценариев на WSH, я на примере покажу, как это делается. Листинг 2 содержит образец регистрационного сценария, logon.bat, в котором для подключения сетевого диска используется команда NET USE, а для синхронизации локального времени на рабочей станции с доменом, в котором она регистрируется — NET TIME. Листинг 3 содержит сценарий WSH logon.vbs, выполняющий те же самые функции. На первый взгляд он кажется более сложным, но не забывайте, что VBScript представляет другую, чем язык пакетных файлов, парадигму программирования. Основное назначение пакетных файлов — выполнение набора команд; VBScript же оперирует с объектами. Освоив VBScript, вы, скорее всего, обнаружите, что писать и совершенствовать сложные сценарии при помощи этого языка гораздо проще.

Листинг 2: logon.bat

@echo off if not ?%OS%?==?Windows_NT? goto EXIT if exist p:*.* net use p: /delete net use p: compaq575pubLic /persistent:no /yes net time /domain:LAB /set /yes if ERRORLEVEL 2 goto NETTIME goto EXIT :NETTIME echo Не удалось синхронизировать локальное время echo Обратитесь в отдел техподдержки pause goto EXIT :EXIT exit

Logon.vbs начинается с директивы VBScript Option Explicit, «принуждающей» сценарий декларировать переменные. Затем идет строка On Error Resume Next, включающая обработку ошибок периода исполнения; команда указывает, что исполнение сценария после возникновения ошибки не должно прерываться. Если не включать эту строку в сценарий, при возникновении ошибки пользователь будет получать не всегда понятные ему сообщения, после чего работа сценария прекратится. Затем декларируются переменные, присваиваются начальные значения strDrive и strShare, и активизируется метод Wscript CreateObject, создающий объекты wshNetwork и wshShell. Первый позже используется для подключения сетевых дисков, а второй — для доступа к системным переменным и исполнения команды NET TIME.

Листинг 3: logon.vbs

Option Explicit On Error Resume Next Dim wshNetwork, wshShell, wshSysEnv, colDrives, nReturnCode Dim i, strDrive, strShare strDrive = ?P:? strShare = ?Compaq575Public? Set wshNetwork = WScript.CreateObject(?WScript.Network?) Set wshSheLL = WScript.CreateObject(?WScript.Shell?) A Set wshSysEnv = wshShell.Environment(?SYSTEM?) If (wshSysEnv?OS?) = ?Windows_NT?) Then B Set colDrives = wshNetwork. EnumNetworkDrives For i = B To colDrives Count - 1 Step 2 If (colDrives(i) = strDrive) Then wshNetwork.RemoveNetworkDrive strDrive End If Next wshNetwork.MapNetworkDrive strDrive, strShare C ReturnCode = wshSheLL.Run(?net time /domain:? & wshNetwork.UserDomain & ? /set /yes?, 0, TRUE) If (nReturnCode <> 0) Then MsgBox ?Не удалось синхронизировать локальное время? & vbNewLine & ?Обратитесь в отдел техподдержки?, 48, ?WSH Logon Script Error? End If Else WScript.Echo ?Этот регистрационный сценарий WSH работает только в Windows NT? & vbNewLine & ?Завершение работы...? Set wshNetwork = Nothing Set wshShell = Nothing WScript.quit(1) End If Set wshNetwork = Nothing Set wshShell = Nothing WScript.quit(nReturnCode)

Строка А на листинге 3 устанавливает переменную wshSysEnv в значение свойства Environment объекта wshShell. Тем самым создается объект wshEnvironment, с помощью которого можно получить значения переменных окружения заданного типа (например, SYSTEM, USER, VOLATILE или PROCESS). В данном случае мы сможем получать значения переменных типа SYSTEM.

Затем wshSysEnv используется для получения значения переменной окружения OS. Если оно соответствует строке «Windows_NT», то скрипт переходит к выполнению блока If, обозначенного меткой В. В противном случае выполняется блок Else, находящийся в конце сценария. Этот блок выводит соответствующее сообщение для пользователя, уничтожает созданные сценарием объекты и завершает его выполнение с кодом 1. Если скрипт запущен под управлением cscript.exe, то переменная окружения ERRORLEVEL будет установлена в 1. По значению этой переменной пакетный файл-оболочка сможет определить, успешно ли был завершен сценарий.

В блоке В метод MapNetworkDrive объекта Network используется для установления соединения с сетевым диском. Однако предварительно logon.vbs должен убедиться в том, что заданная буква диска на клиенте еще не задействована для постоянного сетевого соединения. Это делается путем получения и обхода коллекции существующих соединений. Для этого вначале вызывается метод EnumNetworkDrives объекта wshNetwork, возвращающий коллекцию (к которой можно обращаться, как к массиву) текущих соединений с сетевыми дисками. Затем коллекция просматривается, и ее четные элементы сверяются со значением переменной strDrive (четные потому, что метод EnumNetworkDrives возвращает коллекцию в виде пар значений; четные элементы коллекции — это буквы дисков, нечетные — соответствующие им сетевые ресурсы). При обнаружении совпадения вызывается метод RemoveNetworkDrive для уничтожения существующего соединения с соответствующим сетевым ресурсом. После проверки на наличие привязки заданной буквы диска к сетевым ресурсам и, при необходимости, уничтожения соединений, диск, заданный значением strDrive, подключается к сетевому ресурсу, заданному значением strShare.

Последняя функция logon.vbs — выполнение команды NET TIME. Для этого применяется метод Run объекта wshShell. У Run один обязательный аргумент — имя команды, которую следует выполнить, — и два необязательных: целое число, определяющее тип окна, которое должна открыть команда; и флаг типа Boolean, показывающий, надо ли ждать завершения выполнения команды перед продолжением выполнения сценария. В строке С листинга 3 свойство UserDomain объекта wshNetwork и оператор объединения строк VBScript (символ «&») используются для указания домена, с которым необходимо синхронизировать время. Значение 0 второго аргумента команды Run указывает сценарию не открывать новых окон при выполнении команды, а значение TRUE третьего параметра заставляет сценарий ждать завершения выполнения команды NET TIME перед продолжением работы.

По завершении работы NET TIME возвращаемое ею значение помещается в переменную nReturnCode, и используется, чтобы проверить, успешно ли была выполнена процедура синхронизации. Если значение nReturnCode не равно нулю, то вызывается функция MsgBox для вывода соответствующего сообщения об ошибке. Перед своим завершением сценарий уничтожает объекты wshNetwork и wshShell.

Расширение функциональности регистрационного сценария

Функции, о которых рассказано в этой статье — это лишь верхушка айсберга возможностей WSH, как механизма выполнения регистрационных сценариев. WSH похож на языки программирования — он поддерживает типизированные переменные, подпрограммы и различные операторы ветвления; пакетные файлы таких возможностей не предоставляют. Объект VBScript FileSystemObject реализует более широкий спектр функций доступа к файловой системе, чем язык пакетных файлов. Кроме того, WSH дает возможность доступа к службам каталогов через ADSI, к базам данных через ActiveX Data Object (ADO) и к функциям отправки почты через Collaboration Data Object (CDO).

Используйте простые в освоении языки WSH и поддерживаемые ими компоненты для обучения своих сценариев новым «трюкам». Познакомьтесь с WSH и VBScript поближе уже сегодня, чтобы быть готовыми к работе с платформой нового тысячелетия.

Поделитесь материалом с коллегами и друзьями