Продолжается подписка на наши издания! Вы не забыли подписаться?

Автоматизация работы с использованием Windows Scripting Host

<< Windows Scripting

Помните ВАТ-файлы DOS? Это было прекрасное средство автоматизации повторяющихся задач. Windows, увы, не предложила эквивалентной замены, а средства сторонних разработчиков не прижились по различным причинам. Но положение, похоже, может исправиться. Windows Scripting Host (WSH) - новый, независимый от языка скрипт-хост для Win9x и NT, позволяет строить аналоги ВАТ-файлов на Visual Basic Scripting Edition, JScript и других скриптовых языках, например, Active Perl или Python.

Здесь мы обсудим некоторые преимущества Windows Scripting Host.

Преимущества Windows Scripting Host

Раньше единственным поддерживаемым Windows скриптовым языком был командный язык DOS. Но его возможности довольно бедны по сравнению с VBScript и JScript. Хотя командный язык DOS по прежнему поддерживается, современные ActiveX-скрипты позволяют решать более сложные задачи.

Cкрипт может принимать решения на основе использования полноценных операторов If/Else. Сценарий может выполнять один набор команд, если данное условие истинно, или другой набор, если условие ложно. Кроме того, JScript и VBScript хороши при выполнении математических операций, включая общие тригонометрические функции.

Другое свойство Windows Scripting Host заключается в том, что скрипты могут исполняться вне браузера. Достаточно кликнуть по файлу с текстом скрипта или ввести его название в командной строке,чтобы запустить его на исполнение. Windows Scripting Host не требователен к памяти и прекрасно годится для автоматизации Windows.

Хост и скриптовые машины

Как ни хороши скриптовые языки, многого с ними не сотворишь. Они неспособны повлиять на что-либо за пределами родного скрипта. Эти языки не имеют прямых инструкций, позволяющих читать или записывать файлы на диске, выводить информацию в командную строку, изменять записи в Реестре Windows и так далее.

Чтобы справиться с такими задачами, можно воспользоваться дополнительными COM-объектами. Ряд таких объектов входит в поставку WSH, а один из них, WScript, даже уже имеет созданный экземпляр, и им можно пользоваться непосредственно, без предварительного создания. Остальные создаются с помощью синтаксиса, соответствующего конкретному языку или функции WScript.CreateObject.

Объекты WSH

В поставку Windows Scripting Host входят 4 объекта: Wscript, WshShell, WshNetwork, и FileSystemObject.

Каждый объект, естественно, имеет набор собственных методов и свойств.

Объект Wscript позволяет скриптам "познать самих себя". Вдобавок этот объект позволяет скриптам запускать приложения и управлять ими. Основные свойства и методы этого объекта перечислены в таблице 1.

Таблица 1. Методы и свойства объекта WScript

Свойство

Описание

Arguments

Возвращает указатель на список аргументов командной строки

FullName

Возвращает имя исполняемого файла хоста и полный путь к нему (например, C:\Windows\wscript.exe)

Name

Выводит замечательную надпись Windows Scripting Host

Path

Определяет каталог и путь, содержащие wscript.exe или cscript.exe

ScriptFullName

Возвращает полный путь и имя исполняемого в данный момент скрипта

ScriptName

То же, что и ScriptFullName, но без пути

Version

Возвращает версию установленного Windows Scripting Host


Метод

Описание

CreateObject

Создает объект по его ProgID

ConnectObject

Позволяет подключиться к событиям объекта. В качестве параметра принимает объект, к которому надо подключиться и префикс соответствующих событиям процедур, реализованных в скрипте

DisconnectObject

Отключает от объекта, подключенного предыдущим методом

Echo

Выводит текстовую строку (в cscript - в StdOut, в Wscript - в виде диалогового окна.

GetObject

Позволяет получить указатель на объект из файла или объекта, указанного в параметре strProgID.

Quit

Завершает скрипт

Sleep

Переводит скрипт в неактивное состояние на время, указанное в миллисекундах

Объект WshShell позволяет скриптам устанавливать и конфигурировать другие приложения. Он также дает возможность общаться с пользователем, изменять Реестр и находить папки. Некоторые его свойства и методы перечислены в таблице 2.

Таблица 2. Свойства и методы объекта WshShell

Свойство

Описание

Environment

Возвращает объект, который позволяет получить значения переменных среды, например

Set WSHShell = CreateObject("WScript.Shell")
Set WshSysEnv = WshShell.Environment("Process")
WScript.Echo WshSysEnv("windir")

SpecialFolders

Возвращает полный путь к специальным папкам типа меню Пуск.

Вот список доступных папок: AllUsersDesktop, AllUsersStartMenu, AllUsersPrograms, AllUsersStartup, Desktop, Favorites, Fonts, MyDocuments, NetHood, PrintHood, Programs, Recent, SendTo, StartMenu, Startup, Templates.

Метод

Описание

Run

Запускает приложение. strCommand - исполняемая команда, параметр intWindowStyle позволяет управлять положением и поведением окон, а bWaitOnReturn позволяет указать объекту WshShell, надо ли ожидать окончания выполнения запущенного приложения.

Popup

Ещё один способ вывести текст в окне

CreateShortcut

Создает ярлыки файлов или URL

RegRead

Возвращает значение ключа или записи реестра по его имени

RegWrite

Создает новые ключ или запись Реестра или записывает новое значение существующих.

RegDelete

Удаляет ключ или запись реестра

LogEvent

Позволяет записать сообщение в event log Windows NT или W2K или файл WSH.log в случае Windows 9х

ExpandEnvironmentStrings

Позволяет раскрыть строку, содержащую переменные среды

SendKeys

Позволяет эмулировать клавиатурный ввод

Объект WshNetwork используется при создании скриптов, модифицирующих конфигурацию сети. Это включает задачи типа подключения к сети, инсталляцию принтеров, назначение буквенных обозначений сетевым дискам и так далее. Основные свойства и методы WshNetwork перечислены в таблице 3.

Таблица 3. Свойства и методы объекта WshNetwork

Свойства

Описание

ComputerName

Возвращает имя компьютера

UserDomain

Возвращает имя домена, в котором зарегистрирован пользователь

UserName

Возвращает догадаетесь что!

Метод

Описание

MapNetworkDrive

Присваивает назначенную пользователем букву сетевому диску

EnumNetworkDrives

Возвращает список подключенных сетевых дисков

RemoveNetworkDrive

Отключает сетевой диск

AddWindowsPrinterConnection

Позволяет установить новый принтер в Windows, то есть указать путь к принтеру и инициировать установку драйверов.

AddPrinterConnection

Подключает сетевой принтер

RemovePrinterConnection

Отключает сетевой принтер

SetDefaultPrinter

Задает принтер по умолчанию

EnumPrinterConnections

Возвращает список подключенных принтеров

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

FileSystemObject имеет методы BuildPath, CopyFile, CopyFolder, CreateFolder, CreateTextFile, DeleteFile, DeleteFolder, DriveExists, FileExists, FolderExists, GetAbsolutePathName, GetBaseName, GetDrive, GetDriveName, GetExtensionName, GetFile, GetFileName, GetFolder, GetParentFolderName, GetSpecialFolder, GetTempName, MoveFile, MoveFolder, OpenTextFile. Их названия в отдельном объяснении не нуждаются. Его единственное свойство Drives возвращает список дисков, доступных на данной машине, включая сетевые.

Что вам нужно для начала

Первое, что надо сделать - убедиться, что Windows Scripting Host у вас есть. В состав W2K он входит изначально. Если вы используете Windows 98 или Internet Information Server 4.0, или если вы устанавливали Option Pack для Windows NT 4 и для Windows 95, он у вас точно есть. В случае Windows 95 все усложняется, и Windows Scripting Host придется скачивать с сайта Microsoft (msdn.microsoft. com/ scripting). Напишите в командной строке wscript. Если появилось диалоговое окно с надписью, отличной от "File not found", все в порядке.

Microsoft не поставляет визуального редактора скриптов WSH. Но Notepad вполне годится.

Создание и запуск скриптов

По сравнению с различными программистскими изысками писать скрипты для Windows Scripting Host относительно просто. В Notepad вы пишете свой скрипт с использованием упомянутых объектов. Потом сохраняете файл с расширением .vbs для VBScript или .js для JScript.

Запуск скриптов - тоже несложная задача. Есть несколько способов. Самый простой - командная строка DOS и аналогичная версия Windows Scripting Host, CSCRIPT.ЕXE. Эта версия позволяет контролировать исполнение скрипта с помощью параметров командной строки.

Параметры хоста включают или отключают различные опции Windows Scripting Host и всегда предваряются двумя слэшами (//). Имя скрипта - это всегда имя файла, а параметры скрипта - параметры, передаваемые скрипту. Эти параметры всегда предваряются одним слэшем (/). Таблица 4 содержит некоторые параметры CSCRIPT.EXE.

Таблица 4. Параметры командной строки CSCRIPT.EXE

Параметр

Описание

//B

Включает пакетный режим

//T

Задает таймаут в секундах

//I

Выключает пакетный режим (используется по умолчанию)

//logo

Включает гордую надпись (увы, используется по умолчанию)

Microsoft (R) Windows Scripting Host Version 5.0 for Windows
Copyright (C) Microsoft Corporation 1996-1997. All rights reserved.

//nologo

Выключает эту гордую надпись.

//H:Cscript or Wscript

Делает CSCRIPT.EXE или WSCRIPT.EXE хостом по умолчанию, т.е. ассоциирует их с расширениями скриптов.

//S

Сохраняет установки командной строки для текущего пользователя

Если вы не желаете видеть окошек с кнопкой ОК, используйте cscript.exe, а для вывода сообщений пользуйтесь методом WScript.Echo.

Для запуска скриптов с помощью wscript.exe имеются три пути.

Один из них - просто дважды щелкнуть по файлу или иконке. Другой - выбрать Выполнить... из меню Пуск и написать полное имя файла в текстовом поле Открыть. Наконец, можно запустить сам WSCRIPT.EXE из того же Выполнить..., добавив к нему имя скрипта и любой из возможных параметров.

Пример скрипта

Попробуем написать какой-нибудь скрипт на VBScript. Конкретный пример, приведенный в Листинге 1, предоставлен Microsoft и может быть получен (как и несколько других) с их WWW-сайта: msdn.microsoft.com/scripting/windowshost/ download/default.asp.

Этот скрипт создает на рабочем столе ярлык для Notepad. Замечу, что сейчас в наши задачи не входит обучение пользователя программированию на VB или Java. Тем не менее, этот пример даст вам представление о том, что Windows Scripting Host может делать при наличии некоторых базовых навыков программирования.

Теперь пора перейти к более существенным применениям WSH. Наверное, больше всего WSH пригодится администраторам, осатаневшим от регулярного повторения одних и тех же действий. Администраторы Windows NT не располагали возможностями UNIX-администраторов, использовавших скрипты испокон веков. С появлением WSH ситуация изменилась, тем более, что WSH позволяет воспользоваться внешними по отношению к скриптовым языкам технологиям, таким, как Windows Management Instrumentation (WMI) и Active Directory Services Interface (ADSI).

WMI и ADSI мы будем использовать, я предполагаю, что у вас есть по крайней мере общее понимание этих технологий. Больше информации о них вы можете получить по адресам http://msdn.microsoft.com/developer/sdk/wmisdk/default.asp и http://www.microsoft.com//adsi/

В этих примерах предполагается, что вы используете W2K, для других платформ, вам, вероятно, придется установить WMI и ADSI.

Использование WSH и WMI для создания Logon-скриптов

Как вы знаете, такие скрипты подразумевают запуск в момент старта. В Листинге 2 приведен загрузочный скрипт, который определяет тип входящего в систему пользователя и выполняет задачи, основываясь на этой информации. Первое, скрипт создает некоторые общие объекты которые вам придется использовать, например, объекты WScript.Network и WScript.Shell. Дальше он использует эти объекты для определения имени пользователя и доменной информации. Наконец, используя ADSI скрипт возвращает информацию содержащую группу пользователя. Эта информация используется для определения подходящей подпрограммы, вызываемой для каждой из пользовательских групп. Это выполняет оператор Select Case.

Загрузочный скрипт для пользователей создаваемой нами группы Windows NT (под именем YourNewGroup) использует сетевые возможности WSH. Он проверяет, используется ли буква Z. Если она свободна, диском Z назначается \\yourserver\NETLOGON используя формат \\server\share.

Чтобы объяснить, как работает загрузочный скрипт, некоторые подпрограммы и функции вынесены в текст статьи. Можете просто вернуть их на место в блок <script> в Листинге 2.

 sub Domainlogon
     if CheckNetworkMapping("z:", "\\yourserver\NETLOGON") = false then
         MapNetwork "z:", "\\yourserver\NETLOGON "
     end if
 end sub

Функция CheckNetworkMapping перечисляет различные буквы дисков чтобы определить, используется ли данная буква (см. Листинг 3). Она возвращает true или false на основании доступности данной буквы. В случае true вызывается подпрограмма MapNetwork для выполнения отображения. Эта подпрограмма использует метод MapNetworkDrive объекта wshNetwork для присвоения сетевому ресурсу соответствующей буквы. Более полную информацию о объекте wshNetwork можно получить из таблицы 3.

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

 sub Adminslogon
      Wscript.Echo _
       "Эта процедура возвращает значения основных переменных среды данного компьютера."
 ReturnENV
 Wscript.Echo
     regProxy
     Wscript.Echo
     'Для работы следующих двух строк требуется ввести сервер, имя пользователя и пароль
     Wscript.Echo "IP-адреса этого компьютера: " & GetIPAddress _ 
         ("yourserver ", "administrator", "p-word")
     Wscript.Echo "Общее количество RAM на этой машине: " & GetRAM _
         ("yourserver ", "administrator", "p-word")
 end sub

Этот скрипт приведен чисто для примера - легкомысленно было бы хранить пароль администратора в открытом виде.

Что же еще можно сделать с помощью объектов, поставляемых вместе с WSH? Например, вы можете получить некую информацию о вашем компьютере. Это можно сделать с помощью метод ReturnENV. Сперва в этом методе потребуется подключить wshProcEnv к рабочей среде. Перед этим нужно создать объект wshShell (см. скрипт ниже). Как только вы подключились к окружению процесса, вы можете вернуть данные наподобие NUMBER_OF_PROCESSORS или PATH конфигурации данного компьютера. Здесь несколько примеров того, что вы можете извлечь из окружения процесса.

sub ReturnENV()
     set wshShell = Wscript.CreateObject("WScript.Shell")
     set wshProcEnv = wshShell.environment("process")
 
     WScript.Echo ("NUMBER_OF_PROCESSORS: " & wshProcEnv _ 
         ("NUMBER_OF_PROCESSORS"))
     WScript.Echo
     WScript.Echo ("PROCESSOR_IDENTIFIER: " & wshProcEnv _
         ("PROCESSOR_IDENTIFIER"))
     WScript.Echo
     WScript.Echo ("OS: " & wshProcEnv ("OS"))
     WScript.Echo
     WScript.Echo ("PATH: " & wshProcEnv ("PATH"))
     WScript.Echo
     WScript.Echo ("WINDIR: " & wshProcEnv ("WINDIR"))
     WScript.Echo
end sub

Заметьте, что этот скрипт полностью работоспособен только в среде NT (или W2K). В WindowsК9x будут доступны только PATH и WINDIR.

Вы, несомненно, знаете, что неумелыми, а тем более умелыми действиями в реестре можно быстро и бесповоротно угробить любую ОС от Microsoft. Для автоматизации этого процесса WSH предоставляет простой способ управления реестром. Методами RegRead, RegWrite и RegDelete вы можете сделать все, что заблагорассудится. Все, что требуется - указать верный ключ для чтения, записи или удаления.

Попробуем для примера настроить proxy-сервер. Получить текущую информацию, хранящуюся в реестре по адресу HKCU\Software\Microsoft\ Windows\CurrentVersion\Internet Settings\ProxyServer можно с помощью метода RegRead. Затем, используя RegWrite, перепишем это значение собственным, именем какого-то вашего proxy-сервера, MYPROXY:80. Наконец, убедимся, что записали верную информацию, для чего снова считаем значение с помощью RegRead.

sub regProxy
     prefix =  "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\"
 
     WScript.Echo "Старые установки Proxy-сервера: " & wshShell.RegRead(prefix & _
         "ProxyServer")
     wshShell.regWrite prefix & "ProxyServer", "MYPROXY:80"
     WScript.Echo  " Новые установки Proxy-сервера: " & wshShell.RegRead(prefix & _
         "ProxyServer")
 end sub

С помощью WMI вы можете собрать массу интересных сведений. Функция GetIPAddress использует WMI для определения IP-адреса машины. Здесь я не буду вдаваться в детали WMI, но, в основном, команда GetObject берет объект управления WMI. Этот объект содержит метод ExecQuery, который берет текстовый аргумент, описывающий IP-адрес и возвращает набор всех IP-адресов машины.

GetRAM очень похож на GetIPAddress за исключением того, что запрашиваемые строки различны. Как и в предыдущем случае, в связанном сервисном объекте WMI работает ExecQuery. Листинг 4 показывает реализацию GetIPAddress и GetRAM.

Чтобы завершить скрипт, сохраните код в файл logon.wsf (или другой, как хотите). Его следует поместить в \\server\NETLOGON. Это каталог, который Windows NT будет использовать в поисках файлов типа загрузочных скриптов. Заметьте, что не-W2K-серверы могут не исполнять иных файлов, кроме командных и ВАТ-файлов. В этом случае вам придется написать простой logon.bat, который вызывает cscript.exe.

Возможно, будет мудро заменить две функции WMI из Листинга 4 на Windows Script Components.

WSH и Active Directory Service Interfaces (ADSI)

Active Directory работает под Windows 2000. Но клиентские приложения, в нашем случае - скрипты, могут быть запущены и из-под Windows 95, Windows 98 или Windows NT 4.0. Для всех этих ОС существуют клиентские компоненты, которые, как и важную дополнительную информацию, можно получить с WWW-сайта MSDN (см. адрес выше).

Теперь, когда у вас есть загрузочный скрипт, осталось понять, зачем он вам нужен? Представьте, что вам нужно создать 5000 учетных записей пользователей вашей компании, причем, как обычно, вчера! Нет проблем! Сейчас мы покажем, как создавать группы пользователей и учетные записи пользователей Windows NT, и как вносить нужных пользователей в нужные группы.

Если посмотреть на имена пользователей и группы вашего NT-сервера, легко заметить, что имеется несколько предварительно созданных групп, например, Administrators и Domain Users. Создать собственную группу на сервере или в домене несложно. Все, что требуется - указать Windows NT-компьютер, на котором вы собираетесь создавать группу и имя группы. В коде ниже демонстрируется пример функции CreateGroup, создающей такую группу. Чтобы получить ссылку на объект, с помощью которого можно управлять Active Directory, следует воспользоваться функцией GetObject. Воспользовавшись объектом, полученным от GetObject, можно добавить группу с нужным вам именем и ее описание. Важная строка кода - SetInfo, сохраняющая информацию на сервере:

sub CreateGroup (ServerName, GroupName, GroupDesc)
     on error resume next
     err.clear
     set objServer = GetObject("WinNT://" & ServerName)
     set objGroup = objServer.Create("group", GroupName)
     objGroup.Description = GroupDesc
     objGroup.SetInfo
     if err <&rt 0 then 
         WScript.Echo "Не могу создать группу " & GroupName
     Else
         Wscript.Echo "Группа " & GroupName & " создана успешно."
     end if
 end sub
 CreateGroup " YourServerName", "YourNewGroup", "Описание группы"

Если вы хотите создать группу в домене, а не на сервере, надо заменить ServerName на DomainName. Следует также привязываться не к серверному, а к доменному объекту.

Теперь, когда у вас есть собственная группа, давайте заведем несколько пользователей. Код на самом деле очень похож на код, создающий группу. Как и прежде, вам следует получить ссылку на серверный или доменный объект с помощью GetObject. Затем в коде создается пользователь и вводится некоторая информация, такую, как полное имя и пароль (пользователи могут изменить их при первом входе в систему или позже). Код в Листинге 5 создает трех пользователей и задает их пароли, полные имена и свойства загрузочного скрипта. По умолчанию Windows будет искать загрузочный скрипт в \\server\NETLOGON.

Теперь вы готовы ввести пользователей в группы Windows NT. Хохмы ради добавим двух пользователей в свежесозданную группу, а одного - в группу администраторов.

sub AddUser (server, group, user)
     on error resume next
     err.clear
     set objGroup = GetObject("WinNT://" & server & "/" & group)
     objGroup.Add "WinNT://" & server & "/" & user
     if err <&rt 0 then 
         WScript.Echo "Не могу добавить" & user & " в группу " & group
     Else
         Wscript.Echo "Добавлен " & user & " в группу " & group
     end if
 end sub
 
 AddUser "YourServerName", "YourNewGroup", "Ivanoff"
 AddUser "YourServerName", "YourNewGroup", "Petroff"
 AddUser "YourServerName", "administrators", "Smirnoff"

Вывод

Windows Scripting Host - хорошая замена уходящим в прошлое BAT-файлам. Он уже имеет поддержку множества сторонних разработчиков, создающих новые скрипт-машины, хосты и т.д. С небольшим навыком программирования вы сможете писать собственные скрипты для автоматизации функций Windows. Если вы не сможете или не захотите писать нужный скрипт самостоятельно, почти наверняка такой найдется в Сети. Все это, поверьте, сделает вашу жизнь проще!

Это только верхушка айсберга - с помощью WSH, WMI и ADSI можно сделать куда больше. Windows Script Host позволяет писать независимые от языка скрипты с использованием его собственной объектной модели или какой-нибудь взятой взаймы. Так что будьте созидательны.

Преимущество в том, что вы сможете инкапсулировать всю эту функциональность в аккуратный COM-компонент, модуль, готовый к повторному использованию в любом приложении.?


Copyright © 1994-2016 ООО "К-Пресс"