Лабораторная работа N2

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ВОЛЖСКИЙ ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ (ФИЛИАЛ)
ФЕДЕРАЛЬНОГО ГОСУДАРСТВЕННОГО БЮДЖЕТНОГО ОБРАЗОВАТЕЛЬНОГО
УЧРЕЖДЕНИЯ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
КАФЕДРА «ИНФОРМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ»
Д.Н. Лясин, С.Г. Саньков
Автоматизация выполнения административных
задач в ОС Windows с использованием Windows
Scripting Host
Методические указания
Волгоград
2012
УДК 004.056
Рецензент:
канд. тех. наук доцент В. И. Капля
Издается по решению редакционно-издательского совета
Волгоградского государственного технического университета
Лясин, Д.Н. Саньков С.Г. Автоматизация выполнения административных задач в ОС Windows с использованием Windows Scripting Host. [Электронный ресурс]: методические указания / Д.Н. Лясин, С.Г. //Сборник «Методические указания» Выпуск.-Электрон. текстовые дан.(1файл: Kb) – Волжский: ВПИ (филиал)
ВолгГТУ,2012.-Систем.требования:Windows 95 и выше; ПК с процессором 486+;
CD-ROM.
Содержатся сведения, необходимые для изучения средств автоматизации администрирования операционных систем семейства Windows в с использованием
Windiws Script Host (WSH). Рассмотрены методы и свойства объектов WSH, а
также COM-объектов, испоьзуемых в WSH для доступа к основным администрируемым объектам: файловой системе, службам каталога, сетевым объектам. Приведена справочная информация по методам и свойствам объектов WSH,
FileSystemObject, ADSI, WMI. Даны примеры решения конкретных административных задач, рассмотрены типовые методы работы с методами и свойствами
объектов, обобщение которых поможет в самостоятельном написании скриптов.
Приведен порядок выполнения и варианты заданий к лабораторным работам.
Предназначены для студентов, обучающихся по направлению 230100
"Информатика и вычислительная техника" и направлению 231000 "Программная
инженерия" всех форм обучения в рамках курсов «Системное программное обеспечение» и «Операционные системы» .CD-ROM
Волгоградский государственный технический
университет, 2012
 Волжский политехнический
институт, 2012
Лабораторная работа N2
Автоматизация решения административных задач в ОС Windows с использованием Windows Scripting Host
Цель работы: изучить средства автоматизации выполнения работ по управлению ресурсами в ОС семейства Windows, приобретение практических навыков создания сценариев WSH.
1.Теоретические основы
Windows Scripting Host (WSH) представляет собой технологию автоматизации решения задач мониторинга и управления ресурсами в ОС семейства Microsoft.
WSH пришел на смену языку командных файлов (bat-файлам), решая аналогичные
задачи, но с более мощной функциональностью.
Сервер сценариев WSH является развитым инструментом, предоставляющим
единый интерфейс (объектную модель) для специализированных языков, основными из которых являются VBScript, Jscript, но допускается использование дополнительных языков, таких как PerlScript, TCL, Python и т. п.. Основу функциональных
возможностей технологии WSH составляют компоненты ActiveX, сервисные функции которых позволяют управлять ресурсами системы (создавать ярлыки программ,
выключать компьютер, изменять записи в реестре, работать с сетью и пользователями, выводить список дисков, подключать/отключать сетевые диски, получать имя
компьютера и пользователя, работать с переменными окружения, выдавать диалоговые и информационные сообщения т.п. ), а также управлять работой других приложений (серверов автоматизации), например Microsoft Word и или Micosoft Excel.
При этом для работы с WSH используются языки программирования VBScript
и JScript, поддержка которых встроена в операционную систему и не требует установки специализированных систем программирования. Средой программирования
фактически становится текстовый редактор, например, стандартный Блокнот. Типичный WSH-сценарий - это обычный текстовый файл с расширением js (для
JScript) или vbs (для VBScript) соответственно.
Язык JScript — скриптовый интерпретируемый, объектно-ориентированный
язык программирования, разработанный фирмой Microsoft . Первоначально он использовался для создания динамических HTML-страниц в рамках технологии ASP.
Синтаксически он весьма близок языкам Java и C, поэтому является хорошим выбором для написания скриптов теми программистами , которые владеют этими языками. Язык VBScript (Visual Basic Script Edition) – представляет собой облегченную
версию языка Microsoft Visual Basic, и он будет хорошим выбором для тех, кто владеет Visual Basic или VBA (Visual Basic for Application).
Для запуска WSH-скрипта используются команды cscript.exe и wscript.exe.
Первая из них направляет вывод скрипта на стандартную консоль вывода в текстовом режиме, а вторая – в диалоговое окно. В этом можно убедиться, если запустить
следующий скрипт на языке VBScript
'Простейший скрипт на VBScript
WScript.Echo "Привет!"
командами
cscript.exe hello.vbs и wscript.exe hello.vbs
Аналогичный по функциональности скрипт на JScript выглядит следующим
образом:
// Простейший скрипт на JScript
WScript.Echo("Привет!");
При запуске сценария из командной строки можно определить параметры хоста (см. таблицу 1), которые включают или отключают различные опции Windows
Scripting Host и всегда предваряются двумя слэшами (//).
Таблица 1. Параметры командной строки для cscript.exe
Параметр
Описание
//B
Включает пакетный режим. При этом на экран будут выводиться все сообщения об ошибках в сценарии
//T:nn
Задает таймаут в секундах. Сценарий выполняется не более nn секунд
//I
Выключает пакетный режим (используется по умолчанию). На экран не выводятся сообщения об ошибках
//logo
Включает в вывод скрипта надпись о версии и разработчике WSH (используется по умолчанию)
Сервер сценариев Windows (Microsoft (R)) версия 5.7
(C) Корпорация Microsoft (Microsoft Corp.) 1996-2001. Все права защищены.
//nologo
Подавляет информацию о версии и разработчике WSH.
//H:Cscript or
Wscript
Делает CSCRIPT.EXE или WSCRIPT.EXE хостом по умолчанию, т.е. ассоциирует их с расширениями скриптов.
//S
Сохраняет установки командной строки для текущего пользователя
//D
Включение режима Active Debugiing
//X
Выполнение сценария в отладчике
Режим работы сервера сценариев WSH может быть изменен с использованием
ключей реестра из раздела HKLM\ SOFTWARE\ Microsoft\ Windows Script Host\
Settings для всех пользователей или HKCU\ SOFTWARE\ Microsoft\ Windows
Script Host\ Settings для текущего пользователя. В частности, если установить параметр Enabled этого раздела в 0, то выполнение WSH скриптов будет запрещено
для пользователей (я).
Несомненным преимуществом WSH в сравнении с командными файлами является поддержка объектно-ориентированной парадигмы, когда основные объекты
предметной области (такие как файл на диске, ярлык на рабочем столе, переменная
окружения, запущенный процесс и др.) представлены программными объектами.
Манипулирование свойствами и методами этих объектов позволяет быстро и эффективно получить или изменить свойства объекта.
В версии 5.8 WSH, которая входит в Windows 7 включены следующие объекты:
Таблица 2. Объекты WSH
Объект
WScript
WshArguments
WshNamed
WshUnnamed
WshShell
WshSpecialFolders
WshShortcut
WshUrlShortcut
WshEnvironment
WshNetwork
Описание
Это главный объект WSH, который служит для создания других объектов или связи с ними, содержит сведения о сервере сценариев, а
также позволяет вводить данные с клавиатуры и выводить информацию на экран или в окно Windows
Обеспечивает доступ ко всем параметрам командной строки запущенного сценария или ярлыка Windows
Обеспечивает доступ к именованным параметрам командной строки
запущенного сценария. Именованный параметр имеет вид:
/параметр:значение
или
/параметр:”значение c пробелами”
Обеспечивает доступ к безымянным параметрам командной строки
запущенного сценария
Позволяет запускать независимые процессы, создавать ярлыки, работать с переменными среды, системным реестром и специальными
папками Windows
Обеспечивает доступ к специальным папкам Windows
Позволяет работать с ярлыками Windows
Предназначен для работы с ярлыками сетевых ресурсов
Предназначен для просмотра, изменения и удаления переменных среды
Используется при работе с локальной сетью: содержит сетевую информацию для локального компьютера, позволяет подключать сете-
WshScriptExec
WshController
WshRemote
WshRemoteError
Scripting.Signer
вые диски и принтеры
Позволяет запускать консольные приложения в качестве дочерних
процессов, обеспечивает контроль состояния этих приложений и доступ к их стандартным входным и выходным потокам
Позволяет запускать сценарии на удаленных машинах
Позволяет управлять сценарием, запущенным на удаленной машине
Используется для получения информации об ошибке, возникшей в
результате выполнения сценария, запущенного на удаленной машине
Позволяет подписывать и проверять подпись под скриптом с использованием средств ЭЦП
Объем настоящих указаний не позволяет подробно рассмотреть свойства и
методы всех объектов WSH, будут рассмотрены лишь наиболее часто используемые
объекты, подробнее с остальными объектами можно познакомиться в [1].
Одно из центральных мест в скриптах WSH занимает объект WScript. Объект
WScript можно использовать в сценарии WSH сразу, без какого-либо предварительного описания или создания, т.к. его экземпляр создаётся сервером сценариев
(CScript.exe или WScript.exe) автоматически. Объект WScript позволяет осуществлять операции ввода-вывода информации, получать список аргументов скрипта, получать информацию о сервере WSH, а также позволяет скриптам запускать приложения и управлять ими.
Таблица 3. Свойства и методы объекта WScript
Свойство
Описание
Arguments
Возвращает указатель на коллекцию WshArguments аргументов командной строки
FullName
Возвращает имя исполняемого файла хоста и полный путь к нему
(например, C:\Windows\wscript.exe)
Name
Выводит название сервера объекта: Windows Scripting Host
Path
Определяет каталог и путь, содержащие wscript.exe или cscript.exe
ScriptFullName
Возвращает полный путь и имя исполняемого в данный момент скрипта
ScriptName
То же, что и ScriptFullName, но без пути
StdErr
Позволяет запущенному сценарию записывать сообщения в стандартный поток для ошибок
StdIn
Позволяет запущенному сценарию читать информацию из стандартного
входного потока
StdOut
Позволяет запущенному сценарию записывать информацию в стандарт-
ный выходной поток
Возвращает версию установленного Windows Scripting Host
Version
Метод
Описание
CreateObject
Создает объект по его ProgID
ConnectObject
Позволяет подключиться к событиям объекта. В качестве параметра
принимает объект, к которому надо подключиться и префикс соответствующих событиям процедур, реализованных в скрипте
DisconnectObject
Отключает от объекта, подключенного предыдущим методом
Echo
Выводит текстовую строку (в cscript - в StdOut, в Wscript - в виде диалогового окна).
GetObject
Позволяет получить указатель на объект из файла или объекта, указанного в параметре strProgID.
Quit
Завершает скрипт
Sleep
Переводит скрипт в неактивное состояние на время, указанное в миллисекундах
Необходимо отметить, что стандартные потоки ввода-вывода доступны в объекте WScript через свойства StdIn, StdOut и StdErr, только если сценарий запускался в консольном режиме с помощью cscript.exe.
Рассмотрим простой скрипт на языке JScript, использующий свойства и методы объекта WScript:
var args;
args=WScript.Arguments;
for (var i=0; i<args.length;i++) //можно i<args.Count()
WScript.Echo("Аргумент "+i+": "+args(i));
Запустить этот скрипт (предположим, что он записан в файл arglist.js) можно
из командной строки:
cscript.exe arglist.js /a myFolder *.txt
Можно запустить и скрипт с оконным интерфейсом:
wscript.exe arglist.js /a myFolder *.txt
но каждый вызов метода Echo будет создавать отдельное окно сообщения.
Если установленная по умолчанию ассоциация расширения js (и vbs) с программой
cscript.exe не была изменена, то скрипт запускается проще:
arglist.js /a myFolder *.txt
Если создан консольный скрипт, то для ввода-вывода можно использовать
методы Write, WriteLine, Read, ReadLine, ReadAll, Skip, SkipLine свойств-объектов
StdIn, StdOut и StdErr. Следующий пример запрашивает у пользователя полное
имя файла и проверяет, существует ли такой файл на диске:
var FileName, fso;
WScript.StdOut.WriteLine("Введите полное имя файла");
FileName=WScript.StdIn.ReadLine();
fso = WScript.CreateObject("Scripting.FileSystemObject")
if (fso.FileExists(FileName))
WScript.StdOut.WriteLine("Такой файл уже существует");
else
WScript.StdOut.WriteLine("Такой файл не существует");
Вывод информации из скрипта в выходной поток позволяет перенаправлять
информацию в файл или организовывать конвейер стандартными операторами операционной системы (>, >>, |):
cscript.exe someScript.js | find “2012” > lastYear.txt
Отлаживать скрипты можно с использованием, например, поставляемого
вместе с Microsoft Office отладчика Microsoft Script Editor (MSE7.exe). Для вызова
отладчика в то место скрипта, где планируется обращение к отладчику, необходимо
поместить вызов команд Stop для VBScript и debugger для JScript. Тогда при запуске скрипта с ключом //D автоматически запустится отладчик (режим Active
Debugging) и далее скрипт можно выполнить в пошаговом режиме с просмотром
значений переменных, установкой точек прерывания и прочими достоинствами отладчика (рис. 1). Если запустить скрипт с ключом //X, отладчик запустится сразу.
Рисунок 1. Отладка скрипта WSH в Microsoft Script Editor
Из уже рассмотренных пример очевидно, что главный секрет успешного применения WSH заключается в знании и умении манипулировать свойствами и методами перечисленных в таблице 1 объектов. Некоторые из этих объектов создаются
автоматически, инициализируя свойства других объектов (например, уже рассмотренный нами ранее WshArguments), другие необходимо создавать в коде. Для этого
служит метод CreateObject объекта WScript. Например, для создания объекта
WshShell необходимо выполнить:
var wh=WScript.CreateObject("WScript.Shell");
После выполнения этого метода будет создан объект WshShell, доступ к свойствам и методам которого можно посредством переменной wh.
В качестве параметра метод CreateObject принимает программный идентификатор объекта (Programmic Identifier, ProgID). ProgID является уникальным идентификатором объекта, его связь с конкретным расположением файлов, хранящих код
объекта, осуществляется с помощью технологии COM через системный реестр. В
частности, так можно связать скрипт с экземпляром Microsoft Excel и записать данные в ячейки листа документа:
//создаем объект – excel-приложение
var objXL = WScript.CreateObject("Excel.Application");
//Делаем окно видимым и создаем рабочую книгу
objXL.Visible = true;
objXL.WorkBooks.Add;
//устанавливаем ширину первого столбца
objXL.Columns(1).ColumnWidth = 20;
//записываем строку в ячейку (1,1)
objXL.Cells(1, 1).Value = "Создано из WSH";
Следующий пример демонстрирует, как можно дописать информацию в конец файла типа doc (документ Microsoft Word):
var strDoc = "c:\\test.doc";
var d = new Date();
//получаем текущую дату
var strText;
strText += d.getDate() + "/";
//извлекаем день,
strText += (d.getMonth() + 1) + "/";
//месяц
strText += d.getYear();
//год
strText += " Добавлена строка из WSH скрипта\n" ;
if (WScript.CreateObject("Scripting.FileSystemObject").
FileExists(strDoc))
{var oWord=WScript.CreateObject("Word.Application")
var oDoc=oWord.Documents.Open(strDoc);
oDoc.Content.InsertAfter(strText)
oDoc.Save();
oDoc.Close();
oWord.Quit();
}
else
{
WScript.Echo( "Document [" + strDoc + "] not found");
WScript.Quit( 1);
}
WScript.Quit( 0);
Получить ProgID и список методов и свойств для интересующего вас объекта можно из технической документации либо используя библиотеку его типов. Вопросы регистрации COM- и ActiveX-объектов в системе и основные приемы работы
с ними выходят за рамки тематики настоящих указаний, подробнее см. [2].
Для решения практических целей автоматизации решения административных
задач очень полезен объект WshShell. Он позволяет скриптам устанавливать и конфигурировать и управлять другими приложениями, общаться с пользователем, изменять реестр, работать со специальными папкам. создавать ярлыки. Некоторые его
свойства и методы перечислены в таблице 4.
Таблица 4. Свойства и методы объекта WshShell
Свойство
Описание
Environment
Возвращает объект, который позволяет получить значения переменных среды
CurrentDirectory
Полный путь к текущему каталогу (каталогу, из которого был
запущен скрипт)
SpecialFolders (objWshSpecialFolders)
Возвращает полный путь к специальным папкам Windows.
Cписок доступных папок: AllUsersDesktop, AllUsersStartMenu,
AllUsersPrograms, AllUsersStartup, Desktop, Favorites, Fonts,
MyDocuments, NetHood, PrintHood, Programs, Recent, SendTo,
StartMenu, Startup, Templates.
Метод
Описание
Run (strCommand,
[intWindowStyle],
[bWaitOnReturn])
Запускает приложение. strCommand - исполняемая команда,
параметр intWindowStyle позволяет управлять положением и
поведением окон, а bWaitOnReturn позволяет указать объекту
WshShell, надо ли ожидать окончания выполнения запущенного приложения.
Exec (strCommand)
Запускает приложение с возможностью контроля за ним со
строны скрипта.
Popup(strText,[nSecToWait],
[strTitle], [nType])
Выводит на экран информационное окно с текстом strText.
Остальные параметры позволяют управлять внешним видом
окна (набор кнопок, значок, заголовок)
AppActivate (appID)
Активизирует (выводит в фокус ввода) запущенное приложение с именем или PID, задаваемым appID
CreateShortcut (strPath)
Получает доступ или создает ярлык для файла или URL
RegRead (strName)
Возвращает значение ключа или записи реестра по его имени
RegWrite(strName, Value,
[strType])
Создает новые ключ или запись реестра или записывает новое
значение для существующего.
RegDelete (strName)
Удаляет ключ или запись реестра
LogEvent(intType,
strMessage [,strTarget])
Позволяет записать сообщение в системный журнал Windows
ExpandEnvironmentStrings
(strName)
Позволяет получить значение переменной окружения текущего сеанса командной строки по его имени (имя задается в обрамлении %)
SendKeys (str)
Позволяет эмулировать клавиатурный ввод у стороннего приложения
Свойство Environment объекта WshShell, позволяет работать с системными
переменными окружения. Для этого создается объект WshEnvironment вызовом
WshShell.Environment([strType]),где strType – может принимать параметры "System", "User", "Volatile" или "Process" . Значение “Volatile" используется для работы с
динамически изменяемыми переменными окружения. Значения "System", "User" и
"Process" используются для работы с системными данными.
var WSHShell = WScript.CreateObject("WScript.Shell");
var WshSysEnv = WSHShell.Environment("Process");
WScript.Echo( WshSysEnv("windir"));
Таблица 5 содержит перечень системных переменных, доступных в объекте
WshEnvironment при значениях параметра "System", "User" и "Process"
Таблица 5. Системные переменные, доступные в WshEnironment
Значение
Описание
Где присутствует
System
NUMBER_OF_PROCESSORS
PROCESSOR_ARCHITECTURE
Количество процессоров на данX
ном компьютере
Тип процессора
X
PROCESSOR_LEVEL
Расширенные данные о процессоX
ре
Поколение процессора
X
OS
Операционная система
COMSPEC
Путь к файлу командной строки
X
(cmd.exe или command.com)
Каталог по умолчанию для пользователей
Первый локальный диск (обычно
С:)
Заданные системные пути
X
PROCESSOR_IDENTIFIER
HOMEPATH
HOMEDRIVE
PATH
PATHEXT
SYSTEMDRIVE
X
Исполняемые файлы (.exe , .com и
X
т.д.)
Диск на котором находится дирек- -
User
Process
-
X
-
X
-
X
-
X
-
X
-
X
X
-
X
X
X
-
X
-
X
тория с операционной системой
SYSTEMROOT
Директория Windows
-
-
X
WINDIR
Директория Windows
X
-
X
TEMP или TMP
Папка для временных файлов
-
X
X
Объект Environment как и еще ряд объектов WSH (WshSpecialFolders,
WshArguments, WshNamed, WshUnnamed), являются коллекциями.
Объекты-коллекции позволяют перебирать входящие в них элементы благодаря свойству по умолчанию item, индексирующему элементы коллекции по имени
или по номеру. Коллекции отличаются от массивов тем, что члены коллекции могут
индексировать не только целыми числами. В этом случае встает проблема перебора
элементов коллекции. Вместо использования индексов (как было бы в случае с массивами) можно переместить текущий указатель элемента на первый или следующий
элемент коллекции. Для перебора всех элементов коллекции можно использовать
оператор For … each языка VBScript или объект Enumerator языка Jscript:
'VBScript
Set WshShell=WScript.CreateObject("WScript.Shell")
Set WshSysEnv=WshShell.Environment ”Process”
For Each Env In WshSysEnv
s=s & Env & vbCrLf ' перечисляем все переменные окружения
Next
WScript.Echo s
Аналогичное для JScript:
//JScript
var wh=WScript.CreateObject("WScript.Shell");
var WshSysEnv = wh.Environment("Process");
var e = new Enumerator(WshSysEnv);
for (;!e.atEnd();e.moveNext()) {
// Цикл по элементами коллекции
x = e.item();
WScript.Echo(x);
}
Если элементы коллекции индексируются числами, к ним можно получать доступ и в стиле массива:
var wh=WScript.CreateObject("WScript.Shell");
var wsf=wh.SpecialFolders;
for(i=0;i<wsf.count();i++)
WScript.Echo(wsf.item(i));
Метод Run объекта WshShell позволяет запускать другие приложения. В таблице 4 приведен синтаксис вызова этого метода. Для второго параметра (intWindowStyle), определяющего внешнего вида окна запускаемого приложения, допустимы значения, приведенные в таблице 6.
Таблица 6. Возможные значения параметра intWindowStyle метода Run:
Значение Описание
0
Запуск в скрытом виде
1
2
Обычный размер окна, если окно свернуто или развернуто на весь экран, то ему
возвращается исходный вид и положение на экране
Запуск в свернутом виде
3
Окно разворачивается на весь экран
4
Запуск в обычном размере, в неактивном состоянии (без фокуса)
8
Обычный размер в неактивном состоянии, но в фокусе остается запустившее приложение
Вид окна определяется вызываемым приложением
10
Запустим с помощью метода Run в браузере Internet Explorer заданный сайт:
var wh=WScript.CreateObject("WScript.Shell");
wh.Run ("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\"
www.volpi.ru ") ;
Приведенный пример демонстрирует дополнительно свойство метода Run:
если в пути к запускаемому приложению присутствуют пробелы, путь необходимо
заключать в двойные кавычки. При использовании JScrip необходимо помнить об
экранировании кавычками спецсимволов (\” и \\ в последнем примере).
С помощью метода Run можно выполнить консольную команду:
var wh=WScript.CreateObject("WScript.Shell");
var status=wh.Run(”ping 192.168.0.1”, 0, true);
if( status!=0) WScript.Echo(“не могу связаться с удаленным
компьютером”);
В последнем примере метод Run выполняет команду в скрытом окне командного интерпретатора, приостанавливая работу скрипта и возвращая код завершения
выполненной команды. Еще одной возможностью запустить консольное приложение из скрипта является использование метода WShell.Exec. В отличии от метода
Run, он создает новый процесс как дочерний, давая родительскому скрипту возможности доступа к своим объектам StdIn, StdOut и StdErr и тем самым упрощая процесс обмена информацией. В следующем примере команда Exec не только запускает
дочерний процесс, но и создает объект wse, с помощью свойства StdOut которого
запускающий скрипт может получить вывод запускаемого.
var wh=WScript.CreateObject("WScript.Shell");
var wse=wh.Exec("netstat");
str=wse.StdOut.ReadAll();
StrMas=str.split("\n");
for (i=4;i<StrMas.length;i++)
{if (StrMas[i].indexOf(":http")>0)
WScript.Echo(StrMas[i].substring(StrMas[i].indexOf(":")+5,
StrMas[i].lastIndexOf(":http")));
}
Приведенный выше скрипт запускает команду netstat в дочернем процессе и
выбирает в его выводе информацию только о соединениях по протоколу http.
Для взаимодействия с уже запущенным приложением помимо его собственных интерфейсных методов и свойств можно использовать стандартный метод класса WshShell SendKeys. Этот метод позволяет имитировать клавиатурный ввод для
приложения, имеющего фокус ввода (который, в свою очередь, можно присвоить
приложению методом AppActivate). Следующий пример открывает стандартный
Блокнот и заносит в него строку Hello, world! и сохраняет этот текст на диске под
именем WSH.txt.
var wh=WScript.CreateObject("WScript.Shell");
var wse=wh.Exec("%windir%\\notepad.exe");
WScript.Sleep(1000);
wh.AppActivate(wse.ProcessID);
var str=new String("Hello world.");
wh.SendKeys(string=str);
WScript.Sleep(1500);
wh.SendKeys("{BACKSPACE}");
wh.SendKeys("!");
WScript.Sleep(1500);
var Answer=wh.Popup("Сохранить документ? \n(Иначе закрыть блокнот)",10,"WSH",36);
wh.AppActivate(wse.ProcessID);
WScript.Sleep(1500);
if (Answer==6)
{
wh.SendKeys("^s");
WScript.Sleep(100);
wh.SendKeys("WSH.txt");
wh.SendKeys("{ENTER}"); }
else wse.Terminate();
for (;;)
{if (wse.Status==1) break; WScript.Sleep(100);}
WScript.Echo("Блокнот завершен с кодом "+wse.ExitCode);
В последнем примере обращает на себя внимание способ отправки сообщений
о нажатии клавиши S в комбинации c Ctrl (^S). Аналогично комбинацию с Alt отправляем с символом % (например, %A), а комбинацию с Shift – c символом +
(например, +D). Для спецклавиш, таких как функциональные, Enter, Delete и др. используются строковые обозначения, которые необходимо заключать в фигурные
скобки.
Например,
закрыть
активное
окно
можно
командой
wh.SendKeys("%{F4}"). Более подробно о функции SendKeys (методах эмуляции
комбинаций клавиш, автоповтора нажатий, строковых обозначениях спецклавиш и
др.) можно посмотреть в документации.
Еще одна не встречавшаяся ранее деталь последнего скрипта – использование
стандартного диалогового окна вызовом метода WScript.Popup. Этот метод позволяет определять текст сообщения и заголовка окна, набор кнопок в окне. Как результат
возвращается код нажатой кнопки.
Пользователь ОС Windows имеет доступ к ряду специальных папок, содержимое которых либо обладает дополнительной функциональностью (как, например,
папка Автозагрузка главного меню Windows), либо операционная система предоставляет пользователю быстрый доступ к содержимому подобной папки (например,
Мои документы). Если требуется получить доступ к одной из таких папок, можно
воспользоваться
свойством
SpecialFolders
объекта
WshShell.
Свойство
SpecialFolders является коллекцией всех доступных специальных папок. Чтобы
узнать адрес конкретной папки, необходимо использовать идентификатор требуемой специальной папки. Список доступных идентификаторов приведен в таблице 7.
Таблица 7. Список специальных папок, доступных из SpecialFolders
objWshSpecialFolders
Название папки
Desktop
Рабочий стол
Favorites
Избранное
Fonts
Шрифты
MyDocuments
Мои документы
NetHood
PrintHood
Пустая папка, используемая в качестве шаблона для сетевой
среды.
Принтеры
Programs
Программы, меню “Пуск”
Recent
Раздел просмотренных документов из меню “Пуск”
SendTo
Отправить
StartMenu
Меню “Пуск”
Startup
Автозагрузка
Templates
Шаблоны
AllUsersDesktop
Содержимое этой папки выводится на рабочий стол всех
пользователей
Содержимое этой папки добавляется в меню Пуск для всех
пользователей
AllUsersStartMenu
Содержимое этой папки добавляется в пункт Программы меню Пуск для всех пользователей
Содержимое этой папки добавляется в меню Автозагрузка
для всех пользователей
AllUsersPrograms
AllUsersStartup
Каждый объект коллекции хранит путь к соответствующей специальной
папке. Например, путь, по которому хранится папка Мои документы можно узнать
так:
var WshShell = WScript.CreateObject("WScript.Shell");
WScript.Echo(WshShell.SpecialFolders(“MyDocuments”));
Еще один полезный метод объекта WshShell – CreateShortcut. Из названияметода ясно, что он позволяет создать новый ярлык для некоторого ресурса. Параметр
метода задает имя и полный путь к создаваемому ярлыку. Создание ярлыка осуществляется в три этапа:
1. Собственно создание ярлыка методом CreateSortcut.
2. Установка свойств ярлыка. Перечень свойств объекта WshShortcut приведен
в таблице 8.
3. Сохранение ярлыка с установленными свойствами
Таблица 8. Свойства объекта WshShortcut
Свойство
Описание
TargetPath
Полное имя ресурса на который ссылается ярлык
WindowStyle
HotKey
Стиль запускаемого окна. Задает вид окна для запускаемого ресурса
Определяет комбинацию быстрого вызова ярлыка
IconLocation
Расположение иконки ярлыка, файлы
Description
Всплывающая подсказка для ярлыка
WorkingDirectory
устанавливает рабочий каталог, который запускаемое приложение будет использовать для хранения временных и других файлов
Рассмотрим пример создания нового ярлыка для Блокнота в меню Автозагрузки текущего пользователя.
var WSHShell = WScript.CreateObject("WScript.Shell");
var StartPath = WSHShell.SpecialFolders("Startup");
// Создаем ярлык в спецпапке Startup
var MyShortcut = WSHShell.CreateShortcut(StartPath + "
\\ Блокнот .lnk");
// Задаем свойства для ярлыка:
// Запускаемый файл (метод ExpandEnvironmentStrings раскрывает
//системную переменную %windir% в ее значение)
MyShortcut.TargetPath =
WSHShell.ExpandEnvironmentStrings("%windir%\\notepad.exe");
// Директория запускаемого файла
MyShortcut.WorkingDirectory =
WSHShell.ExpandEnvironmentStrings("%windir%");
// Тип окна запускаемого файла (запускаем в свернутом виде)
MyShortcut.WindowStyle = 7;
// Иконка, используемая для ярлыка
MyShortcut.IconLocation =
WSHShell.ExpandEnvironmentStrings("%windir%\\notepad.exe, 0");
// Сохраняем изменения свойств ярлыка
MyShortcut.Save();
Можно создать ярлык на Интернет-ресурс. Создадим ссылку на web-ресурс на
рабочем столе:
var WSHShell = WScript.CreateObject("WScript.Shell");
var DesktopPath = WSHShell.SpecialFolders("Desktop");
var MyShortcut = WSHShell.CreateShortcut(DesktopPath+"ВПИ.lnk");
MyShortcut.TargetPath = http://www.volpi.ru;
MyShortcut.Save();
Наибольшую долю выполняемых в процессе администрирования и обслуживания компьютера операций составляют действия над объектами файловой системы:
создание, чтении и изменение содержимого файлов и папок, их копирование и удаление, получение информации и дисках, папках, файлах и т.п. Скрипты WSH могут
выполнять подобные операции могут с помощью объекта FileSystemObject. Этот
объект не указан в таблице 2 – он не относится к WSH, а является сторонним
ActiveX-объектом. Но, используя метод CreateObject, скрипт WSH может создавать
подобные объекты и использовать богатую функциональность FileSystemObject:
var FSO = WScript.CreateObject(“Scripting.FileSystemObject”);
Объект FileSystemObject предоставляет в распоряжение программиста объекты и коллекции, перечисленные в таблице 9:
Таблица 9. Объекты и коллекции для работы файловой системой
Объект/ Коллекция
Описание
FileSystemObject
Основной объект. Содержит методы и свойства, которые обеспечивают
доступ к файловой системе компьютера: создают, удаляют, получают информацию, и управляют дисками, папками и файлами. Многие методы
этого объекта дублируются в других объекта (например, удалить файл
можно как вызовом DeleteFile этого объекта, так и вызовом метода Delete
объекта File)
Объект. Содержит методы и свойства, которые позволяют собирать информацию о накопителях, имеющихся в системе: имя диска, метка тома,
общий размер и объем свободного места на диске.
Drive
Drives
Коллекция объектов типа Drive. Включает в себя все диски на данном
компьютере независимо от их типа.
File
Files
Folder
Folders
TextStream
Объект. Содержит методы и свойства, которые позволяют выполнять основные операции с файлом: создавать, удалять, или перемещать файл, получать и изменять атрибуты. Свойства этого объекта хранят характеристики файла: размер, имя , путь к нему, атрибуты.
Коллекция объектов типа File. Содержит список всех файлов, находящихся в заданной папке.
Объект. Аналогичен объекту File, но позволяет получить доступ к заданной папке.
Коллекция объектов типа Folder. Содержит список всех папок, находящихся в заданной папке.
Объект. Позволяет читать и писать информацию в текстовый файл.
Для манипулирования с файлом необходимо создать связанный с ним объект File.
Для этого предназначен метод объекта FileSystemObject (далее FSO) GetFile. Если
файл не существует, он предварительно создается методом FSO.CreateTextFile. Следующий пример демонстрирует применение перечисленных методов для работы с
файлом.
var FSO=WScript.CreateObject("Scripting.FileSystemObject");
fname="d:\\test.txt" // можно fname="d:/test.txt"
if (!FSO.FileExists(fname))
{file=FSO.CreateTextFile("d:\\test.txt");
file.WriteLine("New file");
file.Close ();
}
file=FSO.GetFile(fname);
file.Copy(fname+".copy"); //или так FSO.CopyFile(fname,fname+".copy");
file.Delete();
Предпоследняя строка скрипта демонстрирует, что для копирования, перемещения и удаления файлов воспользоваться как методами объекта FSO, так и объекта
File (см. таблицу 10).
Таблица 10. Методы для работы с файлами
Действие
Метод
Перемещение
File.Move или FileSystemObject.MoveFile
Копирование
File.Copy или FileSystemObject.CopyFile
Удаление
File.Delete или FileSystemObject.DeleteFile
Создание
FSO.CreateTextFile
Набор свойств объекта File предоставляет программисту доступ к основным
характеристикам файла (таблица 11).
Таблица 11. Свойства объекта File
Описание
Свойство
Attributes
Позволяет просмотреть или установить атрибуты файла.
DateCreated
Содержит дату и время создания файла. Доступно только
для чтения
Содержит дату и время последнего обращения. Доступно
только для чтения
Cодержит дату и время последнего изменения. Доступно
только для чтения
Cодержит букву диска для устройства, на котором находится файл. Доступно только для чтения
Позволяет просмотреть и изменить имя файла.
DateLastAccessed
DateLastModified
Drive
Name
Path
Содержит объект Folder для родительского каталога файла.
Доступно только для чтения
Содержит путь к файлу
ShortName
Содержит короткое имя файла (в формате 8.3)
ShortPath
Size
Содержит путь к файлу, состоящий из коротких имен каталогов (в формате 8.3)
Возвращает размер файла в байтах
Type
Возвращает информацию о типе файла
ParentFolder
Следующий пример позволяет получить размер файла запущенного скрипта
и установить его атрибут Только для чтения.
FSO = WScript.CreateObject("Scripting.FileSystemObject");
file1 = FSO.GetFile(WScript.ScriptFullName);
WScript.Echo("Размер файла скрипта ”+ file1.Name +”: "+file1.Size);
file1.Attributes|=1;
Cвойство Attributes представляет собой целое число, описывающее атрибуты
файла согласно таблице 12. Установка или чтение отдельного атрибута выполняются
с использованием двоичной маски и поразрядных логических операций. В приведенном примере младший бит свойства устанавливается в 1, что соответствует установке
атрибута Только для чтения.
Таблица 12. Атрибуты файла в свойстве Attributes объекта File
Атрибут
Значение
Normal
Readonly
Hidden
System
Directory
0
1
2
4
16
Archive
32
Описание
Обычный файл без установленных атрибутов.
Файл с атрибутом «только для чтения». (1-й бит)
Скрытый файл. (2-й бит)
Системный файл. (3-й бит)
Папка или каталог (возможно, с атрибутом «только для чтения»). (5-й бит)
Файл с атрибутом «архивный».(6-й бит)
Alias
Compressed
1024
2048
Ярлык (.Lnk-файл). (11-й бит)
Сжатый файл. (12-й бит).
Для работы с содержимым фала используется объект TextStream и его методы.
Типичными операциями для этого объекта являются чтение и запись информации
из/в файл.
Открытие файла (и создание объекта типа TextStream) может осуществляться
методами CreatetextFile, OpenTextFile и OpenAsTextStream. Метод
OpenAsTextStream принадлежит объекту File, он открывает уже существующий
файл, для которого ранее был получен объект File (методом GetFile). Методы CreateTextFile и OpenTextFile определены в объектах FSO и Folder, они могут открыть файл по имени, причем, если открываемый файл не существует, могут его создать. Оба объекта возвращают ссылку на объект типа TextStream.
Синтаксис вызова метода OpenTextFile:
FSO.OpenTextFile(filename[, iomode[, create[, format]]]), где
filename – имя открываемого файла
iomode – режим открытия файла, который может принимать значения:
1 – файл открывается для чтения, запись запрещена;
2 – файл открывается для записи; если файл существует, его содержимое удаляется;
8 – файл открывается для добавления данных:
create – логическая величина, требующая (при значении true) создавать новый
файл, если файла с указанным именем не существует.
format – кодировка для открытия файла, может принимать значения:
- 2 – открывается с использованием системной кодировки;
- 1 – открывается в кодировке Unicode;
0 – открывается в кодировке ASCII.;
var fso = WScript.CreateObject("Scripting.FileSystemObject")
var ts = fso.OpenTextFile("d:/testfile.txt", 1, True)
Свойства и метода объекта TextStream приведены в таблице 13.
Таблица 13. Свойства и методы объекта TextStream
Свойство
Описание
Attributes
Позволяет просмотреть или установить атрибуты файла.
DateCreated
Содержит дату и время создания файла. Доступно только
для чтения
Содержит дату и время последнего обращения. Доступно
только для чтения
Cодержит дату и время последнего изменения. Доступно
только для чтения
Cодержит букву диска для устройства, на котором находится файл. Доступно только для чтения
Позволяет просмотреть и изменить имя файла.
DateLastAccessed
DateLastModified
Drive
Name
Path
Содержит объект Folder для родительского каталога файла. Доступно только для чтения
Содержит путь к файлу
ShortName
Содержит короткое имя файла (в формате 8.3)
ShortPath
Size
Содержит путь к файлу, состоящий из коротких имен каталогов (в формате 8.3)
Возвращает размер файла в байтах
Type
Возвращает информацию о типе файла
ParentFolder
Метод
Описание
Write(String)
Записывает данные в файл в одну строку
WriteLine(String)
Записывает данные, с переходом на новую строку
WriteBlankLines()
Записывает пустую строку
Read (nChars)
Читает из файла nCars символов
ReadLine()
Читает строку из файла
ReadAll()
Считывает весь файл
Skip(nChars)
Пропускает nChars символов
SkipLine()
Пропускает строку
Close()
Закрывает открытый файл
Рассмотрим пример, в котором для решения конкретной задачи используются
перечисленные методы и свойства объекта TextStream. В следующем примере
скрипт перебирает все строки файла, имя которого передано ему в качестве первого
параметра, и выводит в окно (вместе с порядковым номером) только те из них, в которых нет строки “rem “.
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
if (WScript.Arguments.length>0 &&
FSO.FileExists(WScript.Arguments(0)))
{
var TextStream = FSO.OpenTextFile(WScript.Arguments(0));
var n=1;
while (!TextStream.AtEndOfStream) {
Str = TextStream.ReadLine();
if (Str.indexOf("rem ")==-1)
WScript.Echo(n+" "+Str);
n++;
}
TextStream.Close();
}
else
WScript.Echo("Использование срипта:”+WScript.ScriptFullName +
”имя_файла");
Для работы с папками и их свойствами FSO предоставляет объект Folder и
коллекцию Folders. Объект Folder позволяет работать с заданной папкой. Многие
его методы и свойства схожи по назначению с одноименными в объекте File: методы Copy, Move, Delete, свойства DateCreated, DateLastAccessed, DateLastModified,
Size, Name, Path, Parent и т.д. Соответственно, принципы работы с папками аналогичны работе с файлами (например, наряду с методом FileExist FSO имеет метод
FolderExist, а наряду с методом GetFile можно использовать метод GetFolder). Из
свойств, характерных для объекта Folder необходимо выделить коллекции Files и
SubFolders, содержащие списки файлов и папок заданной папки. С их помощью
можно перебирать содержимое папки.
Следующий пример позволяет вывести в окно список автоматически запукаемых программ из меню Автозагрузка:
var WSHShell = WScript.CreateObject("WScript.Shell");
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var StartFolder=fso.GetFolder(WSHShell.SpecialFolders("Startup"));
var enFiles=new Enumerator(StartFolder.Files);
WScript.Echo ("Список автозагрузки");
for(; !enFiles.atEnd(); enFiles.moveNext()){
var cFile=enFiles.item();
WScript.Echo( cFile.Name);
}
Следующий пример демонстрирует, как можно рекурсивно обойти все подпапки заданной папки (3-й параметр) и найти в них файлы с заданным расширением
(1-й параметр скрипта), которые изменялись в последний раз в заданный месяц (2-й
параметр).
FSO = WScript.CreateObject("Scripting.FileSystemObject");
//рекурсивная функция перебора содержимого папки
function findFiles(cFolder, cExt, cDateMonth)
{ var newFolder=true;
//перебираем все файлы очередной папки
var cFiles=new Enumerator(cFolder.Files);
for(;!cFiles.atEnd(); cFiles.moveNext())
{
var cFile=cFiles.item();
//Создаем объект типа date c датой последней модификации файла
var dateFile=new Date(cFile.DateLastModified);
if(FSO.GetExtensionName(cFile.Name)==cExt &&
dateFile.getMonth()==cDateMonth)
{ if(newFolder)
{
newFolder=false;
WScript.Echo("---- Папка: "+cFolder.Path+" -------");
}
WScript.Echo(cFile.Name);
}
}
//перебираем все подпапки и для каждой рекурсивно вызываем findFiles
var cSubFlds=new Enumerator(cFolder.SubFolders);
for(;!cSubFlds.atEnd(); cSubFlds.moveNext())
{
var cSFld=cSubFlds.item();
findFiles(cSFld, cExt, cDateMonth);
}
}
//точка входа в скрипт
if(WScript.Argiments.length==3)
{
var FileExt=WScript.Arguments(0);
var FileMonth=WScript.Arguments(1);
var workFolder=FSO.GetFolder(WScript.Arguments(2));
findFiles(workFolder,FileExt,FileMonth); }
else {
WScript.Echo(“Использование скрипта:” + WScript.ScriptFullName +
” расширение месяц папка”);}
Для перебора всех дисков компьютера (в том числе сменных и сетевых) можно использовать коллекцию Drives, каждый из элементов которой , являясь экземпляром объекта
Drive, описывает один из дисков. Свойства объекта Drive представлены в таблице 14 (у
этого объекта отсутствуют методы).
Таблица 14. Свойства объекта Drive
Свойство
AvailableSpace
Описание
Объем доступного для пользователя места (в байтах) на диске
DriveLetter
Буква, ассоциированную с локальным устройством или сетевым ресурсом.
Доступно только для чтения
DriveType
Содержит числовое значение, определяющее тип устройства:
0 — неизвестное устройство;
1 — устройство со сменным носителем;
2 — жесткий диск;
3 — сетевой диск;
4 - CD-ROM;(CD-R и CD-RW не различаются)
5 — RAM-диск
FileSystem
Тип файловой системы, использующейся на диске (FAT, NTFS или CDFS)
FreeSpace
Объем свободного места (в байтах) на локальном диске или сетевом ресурсе.
Доступно только для чтения
IsReady
Содержит true, если устройство готово, и false — в противном случае.
Path
Содержит путь к диску
RootFolder
Объект Folder, соответствующий корневому каталогу на диске. Доступно
только для чтения
SerialNumber
Десятичный серийный номер тома заданного диска
ShareName
TotalSize
Сетевое имя для диска. Если объект не является сетевым диском, то в свойстве ShareName содержится пустая строка (" ")
Общий объем в байтах локального диска или сетевого ресурса
VolumeName
Метка тома для диска. Доступно для чтения и записи
В приведенном ниже примере выводится статистика по всем жестким дискам
компьютера (буква диска, метка тома, общий размер диска и объем свободного места на
диске). Одновременно подсчитывается суммарный объем и объем свободного места
для всех дисков.
fso = WScript.CreateObject("Scripting.FileSystemObject");
var totalSize=0, totalAvail=0;
var cDrives=new Enumerator(fso.Drives);
for(;!cDrives.atEnd();cDrives.moveNext())
{
oDrive=cDrives.item();
if(oDrive.DriveType==2)
{ totalSize+=oDrive.TotalSize;
totalAvail+=oDrive.AvailableSpace;
WScript.Echo(oDrive.DriveLetter+" ( Volume:”+ oDrive.VolumeName +
”):total:"+ Math.round(oDrive.TotalSize/1024/1024)+" Mb, avail: "+
Math.round(oDrive.AvailableSpace/1024/1024)+" Mb");
}
}
WScript.Echo("Общий объем: "+Math.round(totalSize/1024/1024)+
" Mb, свободный объем:"+Math.round(totalAvail/1024/1024)+" Mb");
Для работы с объектами локальной сети и сетевого окружения в WSH представлен объект WshNetwork, позволяющий получать информацию об имени пользователя, компьютера, подключать и отключать сетевые диски и принтеры. Свойства и методы этого объекта приведены в таблице 15.
Таблица 15. Свойства и методы объекта WshNetwork
Свойство
Описание
ComputerName
Имя компьютера.
UserName
Имя текущего пользователя
UserDomain
Название домена, в котором зарегистрировался пользователь
Метод
AddPrinterConnection(
strLocalName,strRemoteName
[,bUpdateProfile] [,strUser]
[,strPassword])
EnumNetworkDrives()
EnumPrinterConnections()
Описание
Подключает локальный порт компьютера к сетевому принтеру
Возвращает коллекцию, в которой хранятся буквы и сетевые пути ко всем подключенным сетевым дискам
Возвращает коллекцию, в которой хранятся данные обо
всех подключенных сетевых принтерах
Подключает сетевой ресурс strRemoteName под локальным
именем диска strLocalName
MapNetworkDrive(strLocalName,
strRemoteName,[bUpdateProfile],
[strUser], [strPassword])
Отключает подключенный сетевой диск
RemoveNetworkDrive(strName,
[bForce], [bUpdateProfile])
RemovePrinterConnection(strName, Отключает подключенный сетевой принтер
[bForce], [bUpdateProfile])
Делает заданный сетевой принтер принтером по умолчаSetDefaultPrinter(strPrinterName)
нию
В следующем примере можно посмотреть значения свойств объекта WshNetwork, а
также подключить сетевой диск с именем X: на сетевой путь \\Comp1\discC:
var WshNetwork= WScript.CreateObject("WScript.Network");
var wh=WScript.CreateObject("WScript.Shell");
NoErr=true;
try
{
WshNetwork.MapNetworkDrive("X:","\\\\Comp1\\DiscC");
}
catch (e)
{NoErr=false;
if (e != 0)
{ErrStr="Ошибка: "+e.number+"\nОписание: "+e.description;
WScript.Echo(ErrStr);
wh.LogEvent(1,ErrStr);
}
}
if (NoErr) WScript.Echo("Диск X: подключен");
Помимо иллюстрации возможностей объекта WshNetwork этот скрипт демонстрирует возможности WSH по обработке исключений, широко использующийся для корректной обработки возможных ошибок при работе скрипта. В блок try {…} помещается
фрагмент кода, который может вызвать ошибку на этапе исполнения. В приведенном коде
причиной ошибки может стать, например, недоступность указанного сетевого пути. В
случае возникновении ошибки в защищенной части кода управление получит блок
catch(e) {…}, в котором может быть реализована реакция на ошибку. Объект e хранит
описание произошедшего исключения.
Выполнить скрипт можно и на удаленной машине. Для этого используется объект
WshController и его метод Execute. Вот как можно организовать выполнение WSH-кода
на удаленной машине под названием \\Comp1 (предварительно необходимо разрешить
WSH Remote Scripting создав в системном реестре строковой параметр Remote
равный "1" в ключе реестра HKLM\ SOFTWARE\ Microsoft\ Windows Script Host\
Settings):
var objController = WScript.CreateObject ("WshController");
var objRemoteScript = objController.CreateScript ("1.js", "Comp1");
WScript.ConnectObject( objRemoteScript, "remote_");
objRemoteScript.Execute();
while( objRemoteScript.Status != 1 )
WScript.Sleep( 1000 );
WScript.Echo("Скрипт на удаленной машине выполнен");
Если перед администратором стоят задачи управления пользователями и группами
пользователей, зарегистрированных на локальном компьютере или в сети, то решить их
средствами WSH не удастся: среди перечисленных в таблице 2 объектов нет таких, которые позволяли бы создавать или удалять пользователей или группы, менять пароли, получать список выделенных в общее пользование ресурсов, определять политику безопасности и т.п. Но, как и в случае с объектом FileSystemObject, для решения подобных задач
можно использовать сторонний, не относящийся непосредственно к WSH, объект, а точнее, группу объектов. Речь идет о технологии ADSI (Active Directory Service
Interface) фирмы Microsoft, которая предоставляет набор объектов ActiveX, обеспечивающих единообразный, не зависящий от конкретного сетевого протокола,
доступ к функциям служб каталогов различных ОС, включая Active Directory,
Windows Directory Service и Novell NDS. В скрипте WSH можно создать объект, связать его со службой каталога, а затем, используя свойства и метода этого объекта, контро-
лировать и управлять всеми объектами каталога. Например, список компьютеров в рабочей группе VPI можно получить с помощью скрипта:
var objNameSpace = GetObject("WinNT://VPI")
objNameSpace.Filter = Array("computer");
var comps=new Enumerator(objNameSpace);
for(;!comps.atEnd();comps.moveNext())
WScript.Echo(comps.item().Name);
При работе с ADSI прежде всего необходимо связать программный объект
скрипта с целевым объектом каталога. В качестве примера подобных объектов можно назвать домен, компьютер, группу, пользователя, выделенный в общее пользование ресурс и др. Корневой объект пространства имен каталога именуется
“WinNT://” для службы каталогов в сети Windows NT 4.0 или на локальной рабочей
станции Windows XP/Vista/7 или “LDAP://” для службы каталога на основе LDAP
(например, Active Directory).
Обращение к элементам каталога осуществляется в с помощью строки вида:
"WinNT:[//ComputerName[/ObjectName[,className]]]"
Здесь параметр ComputerName задает имя компьютера, ObjectName — имя целевого объекта (это может быть имя группы, пользователя, принтера, сетевого ресурса, сервиса и т.п.), className — класс объекта (group, user, printer, fileshare,
service).
var objUser = GetObject("WinNT://Comp1/UserName, user");
objUser.SetPassword(“qwerty”);
objUser.SetInfo();
В приведенном примере сначала объект objUser привязывается к пользователю с именем UserName компьютера Comp1, а затем с использованием метода
SetPassword этого объекта происходит смена пароля пользователя и методом
SetInfo сохраняются сделанные изменения. Теперь достаточно получить (например,
в MSDN [4]) перечень свойств и методов объекта objUser (точнее с точки зрения
ADSI – интерфеса IADsUser), чтобы получить возможность получать и изменять
характеристики пользователя.
Некоторые объекты ADSI реализуют интерфейс IADsContainer, выступая
контейнерами для хранения множества объектов других типов. Так, например, имя
домена в пространстве “WinNT://” выступает контейнером объектов user и group,
реализуя интерфейс IADsContainer. Это позволяет создавать (методом Create) и
удалять (методом Delete) пользователей и группы на компьютере:
var objCompCont = GetObject("WinNT://Comp1");
var objUser = objCompCont.Create("user","newUser");
objUser.Description = "ADSI-user";
objUser.SetInfo();
var objGroup = GetObject("WinNT://Comp1/Администраторы, group")
objGroup.Add("WinNT://Comp1/newUser, user");
objGroup.SetInfo();
В таблице 16 перечислены свойства и методы некоторых интерфейсов ADSI, которые могут быть полезны для решения практических задач. Полный список можно получить в документации, при этом многие из них могут быть использованы только при использовании провайдера LDAP в каталоге Active Directory .
Таблица 16. Свойства и методы интерфейсов ADSI
Интерфейс IADsUser
Свойство
Описание
Description (строка)
Позволяет получить и изменить описание пользователя.
Name (строка)
Относительное имя текущего пользователя
LastLogin (дата в формате Date)
Дата и время последнего входа пользователя
LoginScript (строка)
Позволяет получить и изменить путь к сценарию входа
пользователя.
Позволяет отключить или подключить учетную запись
AccountDisabled (bool)
Profile (строка)
ADsPath (строка)
Позволяет получить и изменить путь к профилю пользователя.
Полное ADSI-имя пользователя
Метод
Описание
SetPassword (newPassword)
Устанавливает новый пароль для пользователя
Groups()
SetInfo()
Возвращает коллекцию групп, в которые включен пользователь
Сохранить информацию в каталоге
Get (Prop), Put (Prop, Value)
Получить и изменить свойство по имени
Интерфейс IADsGroup
Свойство
Description, Name, ADsPath
Описание
Аналогично IADsUser.
Метод
Описание
Add (User_ADsPath)
Добавляет пользователя в группу
Remove (User_ADsPath)
Удаляет пользователя из группы
Members()
Возвращает коллекцию членов группы
SetInfo, Get, Put
Аналогично IADsUser
Интерфейс IADsComputer
Свойство
Описание
Description, Name, ADsPath
Аналогично IADsUser.
Processor
Позволяет получить информацию о процессоре
OperatingSystemVersion
Позволяет получить информацию о версии операционной
системы
Позволяет получить и изменить информацию о владельце
компьютера
Позволяет получить информацию об объеме оперативной
памяти компьютера
Позволяет получить информацию об объеме жестких дисков на компьютере
Описание
Owner
MemorySize
StorageCapacity
Метод
SetInfo, Get, Put
Аналогично IADsUser
Помимо перечисленных в таблице 16, ADSI предоставляет ряд дополнительных интерфейсов для доступа к свойствам таких объектов каталога как домен
(IADsDomain), служба (IADsService), файловых ресурсов (IADsFileShare), ресурсами печати (IADsPrintQuee), уже упоминавшийся контейнер для хранения объектов других типов других (IADsContainer) и др. Изучение этих интерфейсов выходит
за рамки настоящего пособия, но общие принципы работы с его свойствами и методами не отличаются от рассмотренных.
Рассмотрим еще один пример, печатающий список всех групп, в которых
состоит пользователь User1.
var objUser = GetObject("WinNT://Comp11/User1, user");
var groups=new Enumerator(objUser.Groups());
for(;!groups.atEnd();groups.moveNext())
{
var group=groups.item();
WScript.Echo(group.Name);
}
Как видно из приведенных выше таблиц и примеров сценариев, для целей администрирования WSH использует большое количество встроенных объектов и COM-объектов
операционной системы. Однако, нельзя не упомянуть еще об одном популярном средстве
автоматизации решения административных задач, поддерживаемых современными версиями операционных систем семейства Windows и доступном из скриптов WSH. Речь идет о
WMI (Windows Management Instrumentation) - адаптированной реализации стандарта WBEM (Web-Based Enterprise Management) принятого многими компаниями
(такими, как BMC Software, Cisco Systems, Intel и Microsoft), в основе которого лежит идея создания универсального интерфейса мониторинга и управления различ-
ными системами и компонентами распределенной информационной среды предприятия с использованием объектно-ориентированных идеологий и протоколов
HTML и XML. В основе структуры данных в WBEM (и в WMI) лежит Common
Information Model (CIM), реализующая объектно-ориентированный подход к
представлению компонентов системы. CIM представляет параметры операционной
системы, устройств и приложений в виде классов, предопределенных типов, при
этом предоставляя возможность разработчикам пополнять модель своими объектами. Одной из основных отличительных особенностей WMI является использования языка запросов WQL (WMI Query Language), являющегося разновидностью
SQL, для доступа к объектам CIM. Следующий пример иллюстрирует возможности
WMI по извлечению текущей информации о состоянии системы, а именно – получения
списка запущенных процессов.
var objWMIService = GetObject("winmgmts:\\\\.\\root\\CIMV2")
var procList= objWMIService.ExecQuery("SELECT * FROM Win32_Process") ;
var colProcess = new Enumerator(procList);
for(;!colProcess.atEnd();colProcess.moveNext())
{
process = colProcess.item();
WScript.Echo("Процесс: " + process.Caption+", запущен из " +
process.ExecutablePath +", объем используемой памяти " +
process.WorkingSetSize);
}
Методы и свойства WMI позволяют не только получать информацию о системе,
устройствах, процессах, службах и т.п, но и изменять ее. Например, так можно изменить
принтер по умолчанию в системе:
var objWMIService = GetObject("winmgmts:\\\\.\\root\\CIMV2");
var objShare = objWMIService.Get("Win32_Printer.DeviceID='hp LaserJet 1320 PCL 6'");
objShare.SetDefaultPrinter();
Еще одной полезной функцией WMI является возможность подписки на события,
когда выполнения некоторого код привязывается к возникновению некоторого события в
системе, причем в качестве события можно определить самые разные возникающие факты
- запуск процесса, уменьшение объема свободной памяти до заданного предела, обращение к ключу реестра, вход нового пользователя и многие другие. Более подробно с возможностями WMI можно познакомиться в [5, 6].
В WSH 2 для хранения скриптов разработан новый формат файлов: wsf (windows
script file). Он представляет собой текстовый файл в формате XML, для которого опреде-
лен набор тегов, позволяющих не только записывать скрипты, но и задавать режимы их
работы: включать режим отладки, самодокументировать сценарий (автоматизировать выдачу справки по ключу /?), давать ссылки на внешние подключаемые сценарии, использовать разные языки для написания фрагментов одного сценария, создавать использующиеся
в коде COM-объекты и многое другое. Простейший пример описания скрипта в wsf-файле
приведен ниже. Необходимо обратить внимание, что в сценарии присутствуют и совместно выполняются фрагменты кода на двух языках – метод на JScript вызвается кодом на
VBScript.
<?XML version="1.0"?>
<!-- Example.wsf -->
<job>
<script language="JScript"><![CDATA[
function Square(x)
{
return x*x;
}
]]></script>
<script language="VBScript"><![CDATA[
WScript.Echo Square(2)
]]></script>
</job>
Скрипты WSH являются мощным средством администрирования компьютеров и сетей под управлением операционных систем семейства Windows. Объекты
WSH во взаимодействии со сторонними COM-объектами предоставляют пользователю мощную среду для создания универсального и эффективного кода без использования дополнительных систем программирования и могут быть использованы для
решения круга административных задач.
2. Порядок выполнения работы
2.1. Ознакомьтесь с теоретическими основами работы WSH ОС Windows в
настоящих указаниях и конспектах лекций.
2.2. Выполните задания 2.2.1-2.2.11.
Все задания необходимо выполнить c использованием объектов WSH или серверов автоматизации COM на языках программирования Jscript или VBScript. Выполнение каждого задания необходимо подтвердить в отчете снимком окна с результатом выполнения скрипта в сопровождении исходного текста скрипта.
2.2.1. Напишите скрипт, выводящий текстовое сообщение методами
WScript.Echo и WshShell.Popup.. Запустите скрипт командами cscript и wscript, сравните результаты вывода.
2.2.2. Определите три новые переменные окружения: в категориях ”System”,
“User”, “Process”. Убедитесь, что переменные окружения категории ”System” и “User” отображаются в окне свойств системы (вкладка Дополнительно). Организуйте
взаимодействие (обмен данными) между двумя скриптами через переменные окружения. Убедитесь, что переменные окружения категории ”Process” уничтожаются
при завершении работы скрипта.
2.2.3. Добавьте в список автозагрузки (специальная папка Автозагрузка)
стандартный калькулятор Windows.
2.2.4. Добавьте в список автоматически загружаемых приложений при входе
всех пользователей в систему (ключ реестра HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\ Windows\ CurrentVersion\ Run) стандартный Блокнот.
2.2.5. Запустите стандартный калькулятор и с использованием метода
WshShell.SendKeys вычислите в нем значение выражения (12345-678)/910.
2.2.6. Для всех файлов заданной папки, имеющих расширение txt, установите
атрибуты Только для чтения и Скрытый.
2.2.7. Напишите скрипт, который при каждом запуске будет дописывать в текстовый файл информацию о текущей дате и времени, а также размере папки, в которой расположен скрипт и количестве файлов в ней.
2.8. Напишите скрипт, который отображает имя диска X: на сетевой ресурс
(по своему выбору), а также создает на рабочем столе для текущего пользователя
ярлык на некоторый web-ресурс (по своему выбору), если он был удален. Сделайте
этот скрипт скриптом входа дл пользователя. Проверьте, что скрипт запускается
при входе пользователя.
2.9. Напишите скрипт, который выводит список пользователей, являющих
членами обеих групп, имена которых передаются скрипту в качестве параметров.
2.2.10. Выполните индивидуальное задание в соответствии с заданием.
Варианты индивидуальных заданий
1.
Написать скрипт, который бы разбирал содержимое папки, задаваемой в
качестве параметра запуска, и создавал бы папки в соответствии с годами создания
файлов (2012, 2011 и т.п.), внутри каждой из этих папок создать папки с названиями
месяцев (январь, февраль, …, декабрь). Каждый файл указанной папки перенести в
соответствующую ему по году и месяцу создания папку.
2.
Написать скрипт, который проверял бы соответствие всех ярлыков на
рабочем столе реальным файлам на диске и уничтожал бы те ярлыки, для которых
файл, на который он ссылается, не существует. Список удаленных ярлыков заносить
в файл в формате “Дата удаления: Имя ярлыка, Путь к связанному файлу” .
3.
Написать скрипт, который при первом запуске сохраняет в файле список
автозагрузки из соответствующей специальной папки, а при повторном запуске восстанавливает его в первоначальном виде, удаляя лишние и добавляя недостающие
ярлыки.
4.
Написать скрипт, который бы разбирал содержимое папки (включая
подпапки), задаваемой в качестве параметра запуска, по расширениям имен файлов.
Если в папке файлов с некоторым расширением 3 и более – скрипт должен создать
папку с названием, соответствующем расширению, и перенести туда все файлы указанного типа. Все файлы с ”непопулярными” расширениями (количеством 2 и менее) переместить в папку с названием Other. Исходные (уже пустые после переноса
файлов) подпапки удалить.
5.
Написать скрипт, который ищет в заданной папке (и ее подпапках) фай-
лы, созданные более чем указанное количество дней назад и переносящие их в один
общий архив. Для архива вести файл-журнал в формате doc, в который добавлять
информацию о каждом добавленном в архив файле: дату добавления, имя файла,
имя папки, из которой он был перенесен, дату создания файла.
6.
Написать скрипт, который перемещает все файлы из папки Мои Доку-
менты, к которым не было обращения более указанного количества дней (первый
параметр скрипта), в указанную папку (второй параметр скрипта), установив при
этом запрет на доступ к этим файлам всем пользователям, кроме администратора
(например, командой cacls).
7.
Написать скрипт, который при запуске с ключом /s:Имя_папки сохраня-
ет список файлов и папок для текущего пользователя в заданной папке, а при запуске с ключом /u:Имя_папки восстанавливает из указанной папки ранее сохраненный
набор объектов на рабочем столе, удаляя лишние (учесть папку AllUsersDesktop!!!)
и восстанавливая удаленные.
8.
Написать скрипт, который определяет, кто из пользователей не заходил
в систему дольше всех (свойство LastLogin интерфейса IADsUser ) и отмечает это в
его описании (свойство Description). Всех пользователей, кто входил за последний
месяц, включить в группу ActiveUsers.
9.
Написать скрипт, который определяет, какая из групп содержит
наибольшее количество пользователей, и отмечает это в ее описании (свойство Description). Отключить все учетные записи (свойство AccountDisabled интефейса
IADsUser) всех пользователей, которые не входили в систему более года.
10. Написать скрипт, который будет автоматически изменять пароли пользователей группы Пользователи используя текстовый файл, в котором сохранены новые пароли пользователей в формате
имя_пользователя: новый пароль
имя_пользователя: новый пароль
…
2.2.11. Представьте отчёт по лабораторной работе преподавателю и отчитайте
работу.
2.3. Содержание отчета
Отчет по лабораторной работе должен содержать следующие сведения:
- название и цель работы;
- протокол выполнения лабораторной работы, содержащий скрипты по каждому пункту заданий, а также результаты их выполнения.
3. Контрольные вопросы
3.1. Что такое технология Windows Script Host и в чем ее преимущества перед
командными файлами?
3.2. Какие языки поддерживает WSH?
3.3. Перечислите основные объекты WSH и объясните назначение каждого из
них.
3.4. Перечислите основные средства интерактивного взаимодействия скрипта
WSH и пользователя.
3.5. Как из WSH-скрипта получить доступ к переменным окружения? Как
определить новую переменную, доступную из других скриптов?
3.6. Как параметры запуска WSH-скрипта можно использовать в его коде?
Объясните различие между объектами WshArguments, WshNamed, WshUnnamed?
Приведите самостоятельные примеры.
3.7. Как из кода скрипта выполнить сторонний скрипт или запустить приложение? Какие средства позволяют управлять сторонним приложением?
3.8. Какими средствами можно получить доступ к объектам файловой системы
из скриптов WSH? Какие объекты для этого используются? Напишите фрагмент
скрипта, создающего папку на рабочем столе текущего пользователя.
3.9. Что такое технология ADSI? Какие административные задачи она помогает решить? Какие объекты для этого используются? Приведите самостоятельный
пример их использования.
3.10. Что такое объект-коллекция? Приведите примеры объектов подобного
типа. Какими средствами располагает использованный вами язык для работы коллекцией? Приведите примеры.
3.11. Как сохранить результаты работы WSH-скрипта в файле? Приведите
примеры.
4.Литература
1. Описание
WSH
на
сайте
MSDN.
http://msdn.microsoft.com/en-
us/library/9bbdkx3k(VS.85).aspx?ppud=4
2. Введение в COM. http://www.rsdn.ru/article/com/introcom.xml
3. Объектная
модель
MS
Word.
http://msdn.microsoft.com/ru-
ru/library/kw65a0we
4. Описание интерфейса ADSI на сайте MSDN. http://msdn.microsoft.com/enus/library/windows/desktop/aa772170(v=vs.85).aspx
5. Попов А., Шикин Е. Администрирование Windows с помощью WMI и
WMIC. СПб.: БХВ-Петербург, 2004г., 752с.
6. Б. Книттель. Windows 7. Скрипты, автоматизация и командная строка.
СПб.: Питер, 2012 г., 764с.
7. У.Р. Станек. Командная строка Microsoft Windows. Справочник администратора. СПб.: Русская редакция, 2009 г., 480с.
Учебное издание
Дмитрий Николаевич Лясин
Сергей Геннадьевич Саньков
Командные файлы операционной системы MS Windows
Методические указания
План электронных изданий 2012 г. Поз. №
Подписано на « Выпуск в свет» . .12. Уч-изд. л.
На магнитоносителе.
.
Волгоградский государственный технический университет.
400131, г. Волгоград, пр. Ленина, 28, корп. 1.
Download