МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ ВОЛЖСКИЙ ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ (ФИЛИАЛ) ФЕДЕРАЛЬНОГО ГОСУДАРСТВЕННОГО БЮДЖЕТНОГО ОБРАЗОВАТЕЛЬНОГО УЧРЕЖДЕНИЯ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» КАФЕДРА «ИНФОРМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ» Д.Н. Лясин, С.Г. Саньков Автоматизация выполнения административных задач в ОС 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.