Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОС лабораторная раб 2013

.pdf
Скачиваний:
18
Добавлен:
22.05.2015
Размер:
549.47 Кб
Скачать

этот тип). Например, в результате выполнения следующих двух строк

VBScript-кода:

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run "notepad",3программа Блокнот (notepad.exe) будет запу-

щена в максимизированном (развернутом на весь экран) окне.

Замечание.Метод Run всегда создает новый экземпляр запускаемого процесса, с его помощью нельзя ни повторно активизировать окно запущенного приложения (для этого используется метод AppActivate), ни свернуть-развернуть его.

Другим вариантом запуска из сценария приложения Windows, является применение метода Exec. Этод метод запускает приложение, путь к которому указан как параметр метода, и возвращает объект

WshScriptExec. Например:

Set WshShell = WScript.CreateObject("WScript.Shell") Set theNotepad = WshShell.Exec("notepad");

Замечание. При подобном запуске приложения, в отличие от метода Run, нельзя задать тип окна.

Объект WshScriptExec позволяет контролировать ход выполнения запущенного приложения с помощью свойства Status - если Status равен 0, то приложение выполняется, если Status равен 1, то приложение завершено. Кроме этого, используя метод Terminate, можно принудительно завершить работу того приложения, которому соответствует объект WshScriptExec.

В листинге 7.1 приведен сценарий на языке VBScipt, в котором с помощью метода Exec запускается Блокнот (notepad.exe); ссылка на соответствующий объект WshScriptExec сохраняется в переменной theNotepad:

Set theNotepad = WshShell.Exec("notepad")После этого выполнение сценария приостанавливается на 1 секунду (пауза необходима, для того чтобы окно Блокнота успело появиться на экране), после чего выводится диалоговое окно с информацией о статусе запущенного приложения и вопросом о необходимости закрытия Блокнота. В случае утвердительного ответа происходит закрытие Блокнота с помощью метода Terminate.

'Имя: ExecWinApp.vbs

'Язык: VBScript

'Описание: Запуск и закрытие приложение (объект WshScriptExec)

Option Explicit

Dim WshShell,theNotepad,Res,Text,Title ' Объявляем переменные

' Создаем объект WshShell

Set WshShell = WScript.CreateObject("WScript.Shell")

WScript.Echo "Запускаем Блокнот"

41

' Запускаем приложение (создаем объект WshScriptExec)

Set theNotepad = WshShell.Exec("notepad")

WScript.Sleep 500 ' Приостанавливаем выполнение сценария

Text="Блокнот запущен (Status=" & theNotepad.Status & ")" & vbCrLf _

& "Закрыть Блокнот?"

Title=""

'Выводим диалоговое окно на экран

Res=WshShell.Popup(Text,0,Title,vbQuestion+vbYesNo)

'Определяем, какая кнопка нажата в диалоговом окне

If Res=vbYes Then

theNotepad.Terminate ' Прерываем работу Блокнота

'Приостанавливаем выполнение сценария, для того чтобы Блокнот

'успел закрыться

WScript.Sleep 100

WScript.Echo "Блокнот закрыт (Status=" & theNotepad.Status & ")" End If

'************* Конец * Листинг 7.1. Запуск и принудительное закры-

тие приложения (VBScript) (html, txt)

Переключение между приложениями, имитация нажатий клавиш Производить переключение между окнами нескольких запущенных приложений позволяет метод AppActivate объекта WshScript. В качестве аргумента этого метода нужно указывать либо заголовок активизируемого окна, либо идентификатор процесса (Process ID, PID), который запущен в данном окне. Предпочтительным является использование PID, получаемого с помощью свойства ProcessID объекта WshScriptExec, соответствующего активизируемому приложению. Недостатки применения заголовка окна в методе AppActivate:

при написании сценария необходимо знать точное название заголовка; само приложение может изменить текст в заголовке окна;

вслучае нескольких окон с одинаковыми заголовками AppActivate всегда будет активизировать один и тот же экземпляр, доступ к другим окнам получить не удастся.

Активизировав то или иное окно, в котором выполняется приложение Windows, можно из сценария сымитировать нажатия клавиш в этом окне. Для этого используется метод SendKeys объекта WshShell.

Рассмотрим пример сценария Run&ExecWinApp.vbs (листинг 7.2),

вкотором запускается Калькулятор (calc.exe) и в его окно с помощью SendKeys последовательно посылаются нажатия клавиш <1>, <+>, <2>

и <Enter>:

Set theCalculator = WshShell.Exec("calc") WScript.Sleep 500

42

WshShell.AppActivate theCalculator.ProcessID WshShell.SendKeys "1{+}" WshShell.SendKeys "2")

WshShell.SendKeys "~") ' Клавиша <Enter>

Затем выполнение сценария приостанавливается на 1 секунду, чтобы результат вычислений был виден на экране и результат вычислений (символ "3") копируется в буфер Windows с помощью "нажатия" кла-

виш <Ctrl>+<C>:

WshShell.SendKeys "^c"

После этого на экран выводится сообщение о том, что Калькулятор будет закрыт, в результате чего окно Калькулятора теряет фокус. Для того чтобы вновь активизировать это окно, используется метод AppActivate, параметром которого служит PID Калькулятора:

WshShell.AppActivate theCalculator.ProcessID

Для того чтобы закрыть окно Калькулятора, в него посылаются нажа-

тия клавиш <Alt>+<F4>:

WshShell.SendKeys "%{F4}"

После закрытия Калькулятора запускается Блокнот (notepad.exe) и в него записываются результаты работы Калькулятора (вставка из буфера вычисленной суммы производится с помощью "нажатий" <Ctrl>+<V>):

WshShell.Run "notepad" WScript.Sleep 1000 WshShell.AppActivate "notepad" WshShell.SendKeys "1{+}2=" WshShell.SendKeys "^v"

WshShell.SendKeys " {(}c{)} Calculator"

Листинг 7.2. Запуск двух приложений и обмен данными между ними

(VBScript) (html, txt)

Запуск независимых консольных приложений и команд Windows Для запуска независимых, т. е. работающих в отдельном адресном пространстве и использующих свою копию переменных среды, консольных приложений или внешних (представленных исполняемыми файлами на жестком диске) команд Windows используется метод Run объекта WshShell. При этом выполнение сценария можно приостановить до окончания работы запущенного приложения, а затем проанализировать код выхода этого приложения (для этого третий параметр метода Run должен равняться True). Соответствующий пример сценария приведен в листинге 7.3.

' Имя: RunConApp.vbs

43

'Язык: VBScript

'Описание: Запуск независимого консольного приложения и

'определение его кода выхода

Option Explicit

Dim WshShell, Code ' Объявляем переменные ' Создаем объект WshShell

Set WshShell = WScript.CreateObject("WScript.Shell")

'Запускаем утилиту xcopy с ключом "/?" и ожидаем окончания ее работы

Code=WshShell.Run("xcopy /?",1,true)

'Печатаем полученный код возврата

WScript.Echo "Код возврата: ", Code

'************* Конец *Листинг 7.3. Запуск независимого консольно-

го приложения (VBScript) (html, txt)

Для выполнения внутренней команды Windows нужно запустить командный интерпретатор cmd.exe и передать ему в качестве параметра нужную команду. Для того чтобы при вызове командного интерпретатора не заботиться о полном пути к cmd.exe, нужно использовать переменную среды COMSPEC.

Замечание. Для получения значения переменной среды ее имя нужно окружить знаками % (например, %COMSPEC%).

В листингах 7.4 приведен сценарий, в котором запускаются внутренние команды COPY /? (вызов встроенной справки для COPY) и DIR %WINDIR% (вывод содержимого системного каталога Windows).

При этом окно, в котором выполняется команда COPY /?, не закрывается после завершения этой команды, т. к. при запуске командного интерпретатора был указан ключ /k, а информация, выводимая командой DIR %WINDIR%, перенаправляется в файл windir.txt, после чего командное окно закрывается, т. к. для командного интерпретатора в этом случае был указан ключ /c.

'Имя: RunDOSCom.vbs

'Язык: VBScript

'Описание: Выполнение внутренних команд Windows

Option Explicit

Dim WshShell, Code ' Объявляем переменные ' Создаем объект WshShell

Set WshShell = WScript.CreateObject("WScript.Shell")

'Запускаем внутреннюю команду COPY WshShell.Run "%COMSPEC% /k copy /?",1

'Запускаем внутреннюю команду DIR

WshShell.Run "%COMSPEC% /c dir %WINDIR% > windir.txt",1

44

'************* Конец *Листинг 7.4. Запуск внутренней команды

Windows (VBScript) (html, txt)

Запуск дочерних консольных приложений и команд DOS, использование их входных и выходных потоков

Консольное приложение или команду DOS можно запустить из сценария как дочернюю задачу, т. е. с теми же переменными среды, что у процесса-родителя. При этом информация, выводимая дочерним процессом, на экран дублироваться не будет, однако из родительского сценария можно считывать информацию из выходного потока и посылать данные во входной поток дочерней задачи (это напоминает конвейеризацию команд Windows, при которой данные выходного потока одной команды поступают во входной поток другой команды, например DIR | MORE). Таким образом, из сценария можно запускать ту или иную утилиту командной строки и обрабатывать выводимые ей данные; иногда таким образом получить нужную информацию бывает проще и быстрее, чем при использовании объектной модели WSH или другого сервера автоматизации.

В качестве примера рассмотрим сценарий ExecConApp.vbs (листинг 7.5), который выводит на экран общее количество файлов в текущем каталоге и их имена. Данную информацию можно получить в сеансе команднй строки с помощью команды DIR /B. Поэтому в сценарии мы запустим в качестве дочернего процесса внутреннюю команду DIR с ключом /B:

Set ObjExec=WshShell.Exec("%COMSPEC% /c dir /b")и полностью счи-

татем данные, появляющиеся в выходном потоке этого процесса. Для этого в цикле вызывается метод ReadAll, считывающий всю информацию, имеющуюся к тому времени в потоке StdOut объекта ObjExec, в переменную s:

IsBreak=False

Do While True ' Бесконечный цикл

' Проверяем, достигнут ли конец выходного потока команды DIR

If (Not ObjExec.StdOut.AtEndOfStream) Then

' Считываем полностью выходной поток команды DIR s=s+ObjExec.StdOut.ReadAll

End If

If IsBreak Then

Exit Do ' Выходим из цикла

End If

' Проверяем, не завершилось ли выполнение DIR If ObjExec.Status=1 Then

IsBreak=True

45

Else

WScript.Sleep 100 ' Приостанавливаем сценарий на 0,1 сек

End If Loop

Родительский и дочерний процессы работают асинхронно, поэтому пока команда DIR не перестанет выдавать данные, т. е. пока свойство Status объекта ObjExec не станет равным 1, выполнение сценария с помощью метода WScript.Sleep периодически приостанавливается на 0,1 секунды.

После того как считаны все данные из выходного потока команды DIR (свойство ObjExec.StdOut.AtEndOfStream равно True), происходит вы-

ход из цикла и формирование из переменной s массива выведенных строк:

ArrS=Split(s,vbCrLf) ' Формируем массив строк

Теперь остается подсчитать количество файлов в каталоге, которое на единицу меньше количества строк в массиве ArrS: ColFiles=UBound(ArrS) ' Количество файлов в текущем каталоге

и вывести нужные строки на экран:

WScript.StdOut.WriteLine "Всего файлов в текущем каталоге: " &

ColFiles

For i=0 To ColFiles-1

WScript.StdOut.WriteLine ArrS(i) ' Выводим строки на экран Next

Листинг 7.5. Запуск дочернего консольного приложения (VBScript)

(html, txt)

Использование внешних серверов автоматизации

Одна из наиболее полезных возможностей сценариев WSH - управление работой внешних серверов автоматизации (программ, предоставляющих свои службы и интерфейсы для использования другими приложениями). Самые распространенные и часто используемые серверы автоматизации в Windows - это приложения пакета Microsoft Office.

Мы рассмотрим на примерах, каким образом можно выводить из сценариев WSH информацию в две наиболее распространенные програм-

мы этого пакета: Microsoft Word и Microsoft Excel.

Объектные модели Microsoft Word и Excel

Для того, чтобы использовать из сценариев WSH те возможности, которые поддерживают программы Word и Excel, необходимо знать, какие именно объекты предоставляются для внешнего использования этими серверами автоматизации и как объекты соотносятся друг с дру-

46

гом. Хотя объектные модели различных приложений Microsoft Office довольно сложны, они похожи друг на друга, причем для практических целей достаточно понять принцип работы с несколькими ключевыми объектами. Здесь мы не будем останавливаться на подробном рассмотрении свойств и методов объектов Word и Excel, а лишь кратко упомянем, какие именно объекты будут использоваться в рассмотренных ниже примерах сценариев.

На самом верхнем уровне объектной модели Word находится объект Application, который представляет непосредственно само приложение Word и содержит (в качестве свойств) все остальные объекты. Таким образом, объект Application используется для получения доступа к любому другому объекту Word.

Семейство Documents является свойством объекта Application и содержит набор объектов Document, каждый из которых соответствует открытому в Word документу. Класс Documents понадобится нам в сценариях для создания новых документов. Объект Document содержит в качестве своих свойств семейства различных объектов документа:

символов (Characters), слов (Words), предложений (Sentences), параграфов (Paragraphs), закладок (Bookmarks) и т.д.

Объект Selection позволяет работать с выделенным фрагментом текста (этот фрагмент может быть и пустым). Таким образом, можно сказать, что объект Selection открывает путь в документ, так как он предоставляет доступ к выделенному фрагменту документа. В частности, у объекта Selection имеется метод TypeText(Text), с помощью которого можно вставлять текст в документ. Используя свойства этого объекта (которые, в свою очередь, могут являться объектами со своими свойствами), можно управлять параметрами выделенного фрагмента, например, устанавливать нужный размер и гарнитуру шрифта, выравнивать параграфы по центру и т.п.

Объектная модель Excel построена по тому же принципу, что и объектная модель Word. Основным объектом, содержащим все остальные, является Application. Напомним, что отдельные файлы в Excel называются рабочими книгами. Семейство Workbooks в Excel является аналогом семейства Documents в Word и содержит набор объектов Workbook (аналог объекта Document в Word), каждый из которых соответствует открытой в Excel рабочей книге. Новая рабочая книга создается с помощью метода Add() объекта Workbooks.

Для доступа к ячейкам активного рабочего листа Excel используется свойство Cells объекта Application. Для получения или изменения значения отдельной ячейки применяется конструкция

Cells(row,column).Value, где row и column являются соответственно

47

номерами строки и столбца, на пересечении которых находится данная ячейка.

В Excel, как и в Word, имеется объект Selection, позволяющий работать с выделенным фрагментом электронной таблицы. Самым простым способом выделить диапазон ячеек активного рабочего листа является использование метода Select() объекта Range. Например, выражение Range("A1:C1").Select() позволяет выделить три смежные ячейки: "A1", "B1" и "C1".

Для того, чтобы понять, какой именно объект Word или Excel нужно использовать для решения той или иной задачи, часто проще всего бывает проделать в соответствующем приложении необходимые манипуляции вручную, включив предварительно режим записи макроса. В результате мы получим текст макроса на языке VBA (Visual Basic for Applications), из которого будет ясно, какие методы и с какими параметрами нужно вызывать и какие значения нужно присваивать свойствам объектов. В качестве простой иллюстрации проделаем следующие действия. Запустим Word, запустим Macro Recorder (Сервис|Макрос|Начать запись: (Tools|Macros|Record:)), назовем новый макрос "Пример1" и нажмем на кнопку "Ok". После этого напишем в документе слово "Пример" и прекратим запись макроса. Теперь можно посмотреть содержимое записанного макроса. Для этого нужно выбрать пункт Макросы: (Macroses:) в меню Сервис|Макрос (Tools|Macros), выделить макрос "Пример1" в списке всех доступных макросов и нажать кнопку Изменить (Edit). В открывшемся окне редактора Visual Basic появится текст макроса:

Sub Пример1()

'Пример1 Макрос

'Макрос записан 12.09.07 Андрей Владимирович Попов

Selection.TypeText Text:="Пример" End Sub

Как мы видим, для печати слова в документе был использован метод

TypeText объекта Selection.

Макросы в Excel записываются и редактируются аналогичным образом.

Взаимодействие с Microsoft Word

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

48

спомощью метода CreateObject объекта WScript (объектная модель

WSH);

спомощью конструкции New ActiveXObject (язык JScript);

спомощью функции CreateObject (язык VBScript).

В любом случае в используемый метод или функцию в качестве параметра передается программный идентификатор объекта (ProgID), заключенный в скобки. Пример на языке VBScript:

Set WA=WScript.CreateObject("Word.Application")

Перед точкой в ProgID стоит имя библиотеки типов (type library) для объекта, которая может существовать как в виде отдельного файла с расширением tlb, так и в виде части файла с исполняемым кодом объекта (библиотека типов, содержащая сведения о COM-объекте, регистрируется в системном реестре при установке приложения, использующего этот объект). После точки в ProgID указывается имя класса, содержащего свойства и методы, доступные для использования другими приложениями.

Выполняя метод CreateObject, интерпретатор сценария через ProgID получает из системного реестра путь к файлам нужной библиотеки типов. Затем с помощью этой библиотеки в память загружается экземпляр запрашиваемого объекта, и его интерфейсы становятся доступными для использования в сценарии. Ссылка на созданный объект сохраняется в переменной; в дальнейшем, используя эту переменную, мы получаем доступ к свойствам и методам объекта, а также к его вложенным объектам (если они имеются).

Примеры управления приложением Microsoft Word из сценариев приведен в листинге 7.6. Сначала создается главный объект

Word.Application, который запускает приложение Microsoft Word:

Set WA=WScript.CreateObject("Word.Application")

Затем создается новый пустой документ, в результате в переменную WD заносится ссылка на объект Document:

Set WD=WA.Documents.Add()

Наконец, в переменную Sel заносится ссылка на объект Selection, с помощью которого можно задать тип и размер шрифта, тип выравнивания абзацев и напечатать в документе строки текста:

Set Sel=WA.Selection;

В результате выполнения сценария PrintInWord.vbs в новом документе Microsoft Word печатаются две строки текста, после чего с помощью метода PrintOut объекта Document содержимое документа выводится на принтер:

WD.PrintOut();

49

Листинг 7.6. Использование сервера автоматизации Microsoft Word

(VBScript) (html, txt)

Взаимодействие с Microsoft Excel

Вкачестве примера управления сервером автоматизации Microsoft Excel рассмотрим сценарий PrintInExcel.vbs (листинг 7.7). Как и в случае с Microsoft Word, здесь сначала создается главный объект

Excel.Application, который запускает приложение Microsoft Excel:

Set XL=WScript.CreateObject("Excel.Application")

Затем открывается новая рабочая книга:

XL.WorkBooks.Add

Ширина первого и второго столбца делается равной 40 пунктам, а третьей - 10 пунктам:

'Устанавливаем нужную ширину колонок

XL.Columns(1).ColumnWidth = 40 XL.Columns(2).ColumnWidth = 40 XL.Columns(3).ColumnWidth = 10

Встолбцы первой строки записываются обозначения столбцов ("Фамилия", "Имя", "Телефон"), причем данный текст выделяется полужирным шрифтом:

'Печатаем в ячейки текст

XL.Cells(1,1).Value="Фамилия" XL.Cells(1,2).Value="Имя" XL.Cells(1,3).Value="Телефон" 'Выделяем три ячейки

XL.Range("A1:C1").Select

'Устанавливаем полужирный текст для выделенного диапазона

XL.Selection.Font.Bold = true

Во вторую строку заносятся данные для каждого столбца: 'Печатаем в ячейки текст

XL.Cells(2,1).Value="Иванов" XL.Cells(2,2).Value="Иван"

XL.Cells(2,3).Value="555555"Листинг 7.7. Использование сервера ав-

томатизации Microsoft Excel (VBScript) (html, txt)

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

Сценарии WSH, использующие ADSI

Рассматривается стандартная для операционной системы Windows

служба каталогов Active Directory Service Interface (ADSI). Приводятся примеры сценариев WSH, использующих ADSI для управления учетными записями пользователей и групп

50

Сценарии WSH для доступа к службе каталогов АDSI Обсудим сначала термины "каталог" и "служба каталога", которые

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

Что касается компьютерных сетей (локальных или глобальных), здесь также уместно говорить о каталогах, содержащих объекты разных типов: зарегистрированные пользователи, доступные сетевые принтеры и очереди печати и т.д. Для пользователей сети важно уметь находить и использовать такие объекты (а их в крупной сети может быть огромное количество), администраторы же сети должны поддерживать эти объекты в работоспособном состоянии. Под службой каталога (directory service) понимается та часть распределенной компьютерной системы (компьютерной сети), которая предоставляет средства для поиска и использования имеющихся сетевых ресурсов. Другими словами, служба каталога - это единое образование, объединяющее данные об объектах сети и совокупность служб, осуществляющих манипуляцию этими данными.

В гетерогенной (неоднородной) компьютерной сети могут одновременно функционировать несколько различных служб каталогов,

например, NetWare Bindery для Novell Netware 3.x, NDS для Novell NetWare 4.x/5.x, Windows Directory Service для Windows NT 4.0 или Active Directory для Windows 2000/2003. Естественно, для прямого доступа к разным службам каталогов приходится использовать разные инструментальные средства, что усложняет процесс администрирования сети в целом. Для решения этой проблемы можно применить тех-

нологию ADSI (Active Directory Service Interface) фирмы Microsoft, ко-

торая предоставляет набор объектов ActiveX, обеспечивающих единообразный, не зависящий от конкретного сетевого протокола, доступ к функциям различных каталогов. Объекты ADSI включаются в операцинные системы Windows 2000/XP и выше.

Для того, чтобы находить объекты в каталоге по их именам, необходимо определить для этого каталога пространство имен (namespace). Скажем, файлы на жестком диске находятся в пространстве имен файловой системы. Уникальное имя файла определяется расположением этого файла в пространстве имен, например:

C:\Windows\Command\command.com

51

Пространство имен службы каталогов также предназначено для нахождения объекта по его уникальному имени, которое обычно определяется расположением этого объекта в каталоге, где он ищется. Разные службы каталогов используют различные виды имен для объектов, которые они содержат. ADSI определяет соглашение для имен, с помощью которых можно однозначно идентифицировать любой объект в гетерогенной сетевой среде. Такие имена называются строками связывания (binding string) или строками ADsPath и состоят из двух частей. Первая часть имени определяет, к какой именно службе каталогов (или, другими словами, к какому именно провайдеру ADSI) мы обращаемся, например:

"LDAP://" - для службы каталогов, созданной на основе протокола

LDAP (Lightweight Directory Access Protocol), в том числе для Active Directory в Windows 2000/2003;

"WinNT://" - для службы каталогов в сети Windows NT 4.0 или на локальной рабочей станции Windows XP/2000;

"NDS://" - для службы каталогов NetWare NDS (Novell Directory Service);

"NWCOMPAT://" - для службы каталогов NetWare Bindery.

Вторая часть строки ADsPath определяет расположение объекта в конкретном каталоге. Приведем несколько примеров полных строк

ADsPath:

"LDAP://ldapsrv1/CN=Popov,DC=DEV,DC=MSFT,DC=COM"

"WinNT://Domain1/Server1,Computer"

"WinNT://Domain1/Popov"

"NDS://TreeNW/O=SB/CN=Kazakov"

"NWCOMPAT://NWServer/MyNw3xPrinter"

В этом разделе мы подробно рассмотрим несколько простых сценариев, использующих объекты ADSI для автоматизации некоторых распространенных задач администрирования на отдельной рабочей станции с операционной системой Windows XP; поняв принцип их работы, вы без труда сможете написать аналогичные сценарии для локальной сети, которая функционирует, скажем, под управлением Active Directory или контроллера домена с Windows NT 4.0. Напомним, что на выделенном компьютере с Windows XP имеется база данных, содержащая информацию обо всех локальных пользователях этого компьютера. Пользователи компьютера определяются своими атрибутами (имя регистрации, полное имя, пароль и т.п.) и могут объединяться в группы. Ниже мы приведем примеры сценариев WSH, с помощью которых можно:

получить список имеющихся в локальной сети доменов;

52

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

просмотреть атрибуты пользователя и изменить его пароль. Связывание с нужным объектом каталога Первым шагом для доступа к пространству имен любого каталога в

целях получения информации о его объектах или изменения свойств этих объектов, является связывание (binding) с нужным объектом

ADSI.

Рассмотрим вначале, каким образом формируется строка связывания для доступа к объектам отдельной рабочей станции с операционной системой Windows XP. В общем виде эта строка имеет следующий формат:

"WinNT:[//ComputerName[/ObjectName[,className]]]"

Здесь параметр ComputerName задает имя компьютера, ObjectName - имя объекта (это может быть имя группы, пользователя, принтера, сервиса и т.п.), className - класс объекта. Возможными значениями параметра className являются, например, group (группа пользователей), user (пользователь), printer (принтер) или service (сервис Windows XP).

Указав в качестве строки ADsPath просто "WinNT:", можно выполнить связывание с корневым объектом-контейнером, содержащим все остальные объекты службы каталога.

Приведем несколько примеров строк связывания для доступа к различным объектам компьютера Windows XP (табл. 8.1).

Таблица 8.1. Варианты строк связывания на компьютере Windows XP Строка ADsPath Описание

"WinNT:" Строка для связывания с корневым объектом пространства имен

"WinNT://404_Popov" Строка для связывания с компьютером

404_Popov

"WinNT://404_Popov/Popov,user" Строка для связывания с пользователем Popov компьютера 404_Popov

"WinNT://404_Popov/BankUsers, group" Строка для связывания с группой BankUsers на компьютере 404_Popov

Для того, чтобы из сценария WSH использовать объект ADSI, соответствующий сформированной строке связывания, необходимо применить функцию GetObject языка JScript или VBScript, которая возвращает ссылку на объект ActiveX, находящийся во внешнем каталоге. Напри-

мер (язык VBScript):

Set objNameSpace = GetObject("WinNT:") 53

Set objComputer = GetObject("WinNT://404_Popov") Set objUser = GetObject("WinNT://Popov/Popov,user")

Set objGroup = GetObject("WinNT://Popov/BankUsers, group")Замечание Во всех рассмотренных ранее сценариях для создания объектов ActiveX мы пользовались методами CreateObject и GetObject объекта WScript или объектом ActiveXObject языка JScript. Для связывания же с объектом ADSI нужно использовать именно функцию GetObject язы-

ка JScript (или VBScript)!

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

Список всех доступных доменов в локальной сети

Влистинге 8.1 приведен сценарий ListDomains.vbs, в котором создается список всех доменов, доступных в сети.

Врассматриваемом сценарии производятся следующие действия. Сначала создается корневой объект objNameSpace класса Namespace для провайдера Windows NT, который содержит все остальные объекты службы каталога:

Set objNameSpace = GetObject("WinNT:")

Затем с помощью свойства Filter из коллекции NameSpaceObj выделяются все содержащиеся в ней объекты класса Domain: objNameSpace.Filter = Array("domain")

Вцикле For Each : In : выполняется перебор всех элементов коллекции, которые являются объектами класса Domain; название домена, хранящееся в свойстве Name, добавляется (вместе с символом разрыва строки) в переменную List. Сформированная таким образом переменная List выводится на экран с помощью метода Echo объекта WScript. Листинг 8.1. Вывод на экран списка всех доменов локальной сети

(html, txt)

Создание пользователя и группы на рабочей станции

В сценарии AddUser.vbs, который приведен в листинге 8.2, для создания нового пользователя на рабочей станции выполняются следующие шаги. Во-первых, производится связывание с нужным компьютером (в нашем примере это рабочая станция с именем Popov), то есть создается экземпляр objComputer объекта Computer:

Set objComputer = GetObject("WinNT://Popov")

Во-вторых, создается экземпляр UserObj объекта User для нового пользователя. Для этого используется метод Create() объекта Computer; в качестве параметров этого метода указывается имя класса "user" и имя создаваемого пользователя (в нашем примере это имя хранится в пере-

менной strUser):

54

Set objUser = objComputer.Create("user",strUser)

Замечание Для создания пользователя или группы у вас в системе должны быть назначе-

ны права, которыми обладает администратор.

Для созданного пользователя в свойство Description мы помещаем текст описания:

UserObj.Description="

Этот пользователь создан из сценария ADSI"Для сохранения информации о новом пользователе в базе данных пользователей вызывается метод SetInfo объекта User.

'Имя: AddUser.vbs

'Язык: VBScript

'Описание: Создание нового пользователя компьютера

Option Explicit

'Объявляем переменные

Dim objComputer

' Экземпляр объекта Computer

Dim objUser

' Экземпляр объекта User

Dim strUser

' Имя создаваемого пользователя

'Задаем имя пользователя strUser = "XUser"

'Связываемся с компьютером Popov

Set objComputer = GetObject("WinNT://Popov") ' Создаем объект класса User

Set objUser = objComputer.Create("user",strUser)

' Добавляем описание созданного пользователя

objUser.Description = "Этот пользователь создан из сценария ADSI"

'Сохраняем информацию на компьютере objUser.SetInfo

'************* Конец *Листинг 8.2. Создание нового локального пользователя на рабочей станции (html, txt)

Группа на рабочей станции создается аналогичным образом (листинг

8.3).

'Имя: AddGroup.vbs

'Язык: VBScript

'Описание: Создание новой группы на компьютере

Option Explicit

'Объявляем переменные

Dim objComputer

' Экземпляр объекта Computer

Dim objGroup

' Экземпляр объекта Group

Dim strGroup

' Имя создаваемой группы

' Задаем имя пользователя strGroup = "XGroup"

55

' Связываемся с компьютером Popov

Set objComputer = GetObject("WinNT://Popov") ' Создаем объект класса Group

Set objGroup = objComputer.Create("group",strGroup)

'Сохраняем информацию на компьютере objGroup.SetInfo

'************* Конец *Листинг 8.3. Создание новой локальной группы на рабочей станции (html, txt)

Вывод информации о пользователе и смена его пароля

В листинге 8.4 приведен сценарий UserInfo.vbs, в котором выводится на экран информация о созданном в сценарии AddUser.vbs пользователе XUser. Для получения этой информации мы производим связывание с нужным пользователем, т.е. создаем экземпляр objUser объекта User и читаем данные из полей этого объекта:

'Связываемся с пользователем XUser компьютера Popov

Set objUser = GetObject("WinNT://Popov/XUser,user")

' Формируем строку с информацией о пользователе

strResult = "Информация о пользователе XUser" & vbCrLf &_ "Имя: " & objUser.Name & vbCrLf & _

"Описание: " & objUser.Description & vbCrLf

'Выводим сформированную строку на экран

WScript.Echo strResult

После этого в сценарии выдается запрос на изменение пароля пользователя XUser. Для этого мы используем метод Popup() объекта

WshShell:

'Создаем объект WshShell

Set WshShell = WScript.CreateObject("WScript.Shell")

' Запрос на изменение пароля

Res = WshShell.Popup("Изменить пароль у XUser?",0,_ "Администрирование пользователей",vbQuestion+vbYesNo)

В случае утвердительного ответа пароль изменяется с помощью метода SetPassword объекта User, после чего все произведенные изменения сохраняются на рабочей станции с помощью метода SetInfo:

If Res=vbYes Then ' Нажата кнопка Да

'Устанавливаем новый пароль objUser.SetPassword "NewPassword"

'Сохраняем сделанные изменения objUser.SetInfo

Листинг 8.4. Вывод информации о пользователе компьютера и смена его пароля (html, txt)

Удаление пользователя и группы на рабочей станции

56

Для удаления созданных с помощью сценариев AddUser.vbs и AddGroup.vbs пользователя XUser и группы XGroup, мы создадим сценарий DelUserAndGroup.vbs, который представлен в листинге 8.5.

Замечание Для удаления пользователя или группы у вас в системе должны быть назначе-

ны права, которыми обладает администратор.

В принципе, удалить пользователя и группу так же просто, как и создать - нужно связаться с объектом Computer:

Set objComputer = GetObject("WinNT://Popov")и вызвать метод Delete,

указав в качестве первого параметра класс объекта, который мы хотим удалить, и в качестве второго параметра - имя этого объекта:

' Удаляем пользователя

objComputer.Delete "user", strUserОднако здесь могут возникнуть ошибки (например, мы не запускали предварительно сценарий AddUser.vbs и у нас на компьютере не зарегистрирован пользователь, которого мы хотим удалить). Поэтому в сценарии DelUserAndGroup.vbs предусмотрена обработка исключительных ситуаций с помощи стандартного объекта Err:

If Err.Number <> 0 Then

strMess="Ошибка при удалении пользователя " & strUser & vbCrLf & "Код ошибки: " & Err.number & "Описание: " & Err.description

WshShell.Popup strMess,0,"Удаление пользователя",vbCritical

' Очищаем свойства объекта Err

Err.Clear Else

' Все в порядке

strMess = "Пользователь " & strUser & " удален"

WshShell.Popup strMess,0,"Удаление пользователя",vbInformation

End If

Как мы видим, если при вызове метода Delete произойдет какая-либо ошибка, то на экран с помощью метода Popup объекта WshShell выведется соответствующее сообщение. Если же удаление прошло успешно (свойство Number объекта Err равно нулю), то на экран также выведется ссответствующее диалоговое окно.

Процесс удаления группы в сценарии проходит аналогично. Листинг 8.5. Удаление пользователя и группы на рабочей станции

(html, txt)

Список всех групп на рабочей станции Принцип формирования списка всех групп рабочей станции остается

тем же, что и для рассмотренного выше списка всех доступных доменов локальной сети, однако первоначальное связывание нужно произ-

57

водить не с корневым объектом класса Namespace, а с нужным объектом класса Computer.

В приведенном в листинге 8.6 сценарии ListAllGroups.vbs для связывания с компьютером Popov мы создаем объект-контейнер objComputer, в котором содержатся все объекты рабочей станции Popov:

Set objComputer = GetObject("WinNT://Popov")Затем в сценарии ини-

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

strResult = "На компьютере Popov созданы группы:" & vbCrLf & vbCrLf

После этого в цикле For Each : In : из коллеции objComputer выбираются лишь объекты класса Group, то есть те объекты, у которых в поле Class записана строка "Group"; в strResult заносятся названия групп из поля Name:

For Each objGroup In objComputer

' Выделяем объекты класса Group If objGroup.Class = "Group" Then

'Формируем строку с именами групп

strResult = strResult & objGroup.Name & vbCrLf End If

Next

После окончания цикла сформированная строка выводится на экран. Листинг 8.6. Вывод на экран имен всех локальных групп заданной рабочей станции (html, txt)

Список всех пользователей в группе

В листинге 8.7 приведен сценарий ListUsers.vbs, в котором формируется список всех пользователей, входящих в группу "Пользователи" на компьютере Popov.

Для связывания с группой "Пользователи" рабочей станции Popov создается объект objGroup; коллекция пользователей этой группы формируется с помощью метода Members объекта Group:

Set objGroup = GetObject("WinNT://Popov/Пользователи,group")

После инициализации переменной strResult мы обрабатываем в цикле For Each : In : все элементы полученной коллекции пользователей группы (данная коллекция формируется с помощью метода Members объекта Group); на каждом шаге цикла к переменной strResult добавляется имя текущего пользователя (поле Name в объекте objUser - текущем элементе коллекции):

strResult = "Все пользователи группы Пользователи на компьютере Popov:" & vbCrLf

58

' Перебираем элементы коллекции

For Each objUser In objGroup.Members()

' Формируем строку с именами пользователей strResult = strResult & objUser.Name & vbCrLf

Next

После выхода из цикла сформированная строка strResult выводится на экран.

Листинг 8.7. Вывод на экран имен всех пользователей заданной группы

(html, txt)

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

Сценарии WSH как XML-документы. Схема WS XML

Описывается XML-формат сценариев WSH (схема WS XML). Обсуждаются возможности подключения внешних файлов сценариев, использования в одном сценарии нескольких языков и доступа к константам внешних COM-объектов. Даются примеры сценариев WSH с разметкой XML

Сценарии WSH как XML-документы. Схема WS XML

До сих пор мы рассматривали простые одиночные файлы сценариев, в которых мог использоваться язык JScript или VBScript. В версии WSH 1.0 это был единственный поддерживаемый тип сценариев, причем используемый язык определялся по расширению файла: js для JScript и vbs для VBScript. Начиная с WSH 2.0 появилась возможность создавать сценарии, в которых можно применять оба языка одновременно. Для таких сценариев в операционной системе регистрируется расширение wsf; wsf-файлы мы будем далее называть просто WS-файлами. Новый тип сценариев (WS-файл) имеет еще несколько важных преимуществ перед одиночными файлами сценариев WSH 1.0:

поддерживаются вложенные файлы; возможен доступ из сценария к внешним мнемоническим константам,

которые определены в библиотеках типов используемых объектов

ActiveX;

в одном WS-файле можно хранить несколько отдельных, независимых друг от друга, сценариев; сценарий становится самодокументируемым, т. е. вывод информации

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

59

Понятно, что для обеспечения новых возможностей необходимо иметь больше информации, чем ее может предоставить отдельный сценарий. В самом файле сценария должна присутствовать некоторая дополнительная информация, скажем, имя этого сценария (подобная информация содержится, например, в заголовках HTML-страниц). Другими словами, для сценариев WSH должен использоваться уже некий специальный формат, а не просто отдельные jsили vbs-файлы. В качестве такого формата разработчики Microsoft выбрали язык XML (Extensible Markup Language), который уже использовался ими для определения информационной модели в технологии Windows Script Components (WSC), которая позволяет с помощью языков сценариев создавать и регистрировать полноценные COM-объекты.

Таким образом, теперь сценарии WSH не просто содержат в текстовом виде ActiveX-совместимый сценарий, а являются XML-приложениями, поддерживающими схему WS XML (Windows Script XML), которая, в свою очередь, опирается на схему WSC XML. Поэтому для понимания двух технологий (WSC и WSH) достаточно освоить одну схему XML. WS-файл рассматривается сервером сценариев как файл с разметкой XML, который должен соответствовать схеме WS XML. Новый тип файла и формат XML обеспечивают более мощную среду для написания сценариев.

Для того чтобы использовать язык XML в сценариях WSH, вовсе не обязательно вникать во все тонкости этого языка, однако основные принципы XML понимать, конечно, нужно.

Основные принципы XML

Проявляемый в настоящее время большой интерес к языку XML объясняется тем, что он предоставляет возможности, позволяющие в текстовой форме описывать структурированные данные. Точнее говоря, XML является метаязыком для создания различных языков разметки, которые способны определять произвольные структуры данных - двоичные данные, записи в базе данных или сценарии. Прежде всего, XML используется в Internet-приложениях при работе браузеров, которые отображают информацию, находящуюся на Web-серверах. При этом пользователю отдельно передаются данные в виде XMLдокумента, и отдельно - правила интерпретации этих данных для отображения с помощью, например, языков сценариев JScript или

VBScript.

Как и HTML, XML является независимым от платформы промышленным стандартом. Полные спецификации XML и связанных с ним языков доступны на официальной странице корпорации World Wide Web Consorctum (W3C) по адресу http://www.w3c.org/xml.

60