Идёт загрузка страницы...

htp://aptem.net.ru






Инструменты управления Windows: помощник системного администратора

Боб Уэллс, Журнал "Windows 2000 Magazine"

В предыдущих статьях я уже рассказывал о нескольких сценариях WMI (Windows
Management Instrumentation), которые дают некоторое представление о
мощности библиотеки сценариев WMI. В №4(7) Windows 2000 Magazine/RE за
2000 г. в статье «Файлы Windows Script в действии» приводился пример
анализатора журнала событий (т. е. eventlog.wsf и library.vbs). Библиотека
WMI предоставляет разнообразные возможности для обработки журнала событий
(Event Log), и один из способов обработки журнала показан в eventlog.wsf.
Для дополнительного изучения возможностей сценариев WMI рекомендую
обратиться к Microsoft Windows 2000 Professional Resource Kit или
Microsoft Windows 2000 Server Resource Kit. Там можно найти более 50
сценариев WMI для управления или создания отчетов о чем угодно, начиная с
параметров загрузки компьютера и заканчивая учетными записями
пользователей. Файлы VBScript (.vbs) можно просмотреть в каталоге, куда
установлен Resource Kit, но для того, чтобы освоить WMI, нужно изучить
внутренний механизм работы сценариев.
WMI-сценарии 101


Сценарии WMI – это библиотека интерфейсов автоматизации, которые
располагаются над Common Information Model Object Manager (CIMOM).
COM-совместимые языки сценариев (например, Windows Script, WS, ActivePerl)
используют интерфейсы автоматизации для доступа к инфраструктуре WMI.
Библиотека Wbemdisp.dll наследует WMI объекты автоматизации, методы и
свойства.
Для доступа к WMI через библиотеку сценариев WMI нужно сделать три шага,
которые являются общими для большинства сценариев WMI. Первое – необходимо
подключиться к службе Windows Management service, второе – получить
экземпляры управляемых объектов WMI, третье – вызвать метод или получить
доступ к свойствам управляемого объекта. После знакомства с интерфейсами,
которые используются для выполнения этих трех шагов, гораздо увереннее
чувствуешь себя на пути к вершине искусства написания сценариев.
Рассмотрим WMI-сценарий, демонстрирующий все три шага в действии. В
Листинге 1 приведен WMI-сценарий Winmgmts.vbs.
Сценарий инициализирует две строковые переменные – strComputer и
strProcsToKill. Имя целевого компьютера находится в переменной
strComputer, а переменной strProcsToKill присвоено имя процесса, которое
используется в сценарии для обнаружения и остановки всех текущих процессов
с таким именем. В приведенном примере имя текущего процесса notepad.exe.
В Листинге 1 (см. код, выделенный меткой A) для подключения к WMI на
целевом компьютере и доступа ко всем экземплярам класса Win32_Process
используется WMI-моникер (moniker) winmgmts. (Моникер – специальный
COM-объект, который отыскивает в сети или создает и инициализирует
экземпляр объекта и возвращает клиенту указатель на него.) Для повышения
безопасности WMI моникер использует встроенные средства аутентификации, а
также позволяет устанавливать дополнительные маршруты к объектам. (Более
подробно с синтаксисом WMI-моникера можно ознакомиться на
http://msdn.microsoft.com/library/psdk/wmisdk/scintro_6tpv.htm.)
Сценарий возвращает каждый экземпляр Win32_ Process как SWbemObject из
коллекции SwbemObjectSet. SWbemObjectSet и SWbemObject – это лишь два из
нескольких интерфейсов, которые предоставляет библиотека сценариев WMI.
Так как SWbemObjectSet является коллекцией, то доступ к ее элементам можно
организовать при помощи конструкции For...Each языка сценариев VBScript
(см. Листинг 1, метка B).
Меткой B выделена часть сценария, которая выполняет последний шаг для
доступа к WMI. Внутри цикла For...Each организован доступ к двум свойствам
и одному методу, которые определены в классе Win32_Process. Сначала, при
выполнении сценария, для каждого экземпляра Win32_ Process выводятся его
идентификатор процесса ProcessID и имя Name. Затем имя текущего экземпляра
процесса Win32_Process Name сравнивается со значением переменной
strProcsToKill. Если эти значения совпадают, то в сценарии вызывается
определенный в классе Win32_ Process метод уничтожения текущего экземпляра
процесса.
В Листинге 1 демонстрируются два различных набора методов и свойств.
Первый набор состоит из методов и свойств, которые предоставляют
интерфейсы библиотеки WMI для того, чтобы подключиться к WMI, извлечь
экземпляры классов и подписаться на события. Второй набор состоит из
методов и свойств, предоставляемых классами Win32 Common Information Model
(CIM) (например, Win32_ Process, Win32_NTEventLog).
Чтобы понять, как работают свойства и методы более чем 300 классов,
входящих в CIM Win32, рассмотрим свойства и методы класса Win32_ Process.
Напомню, что класс – это шаблон, который определяет свойства и поведение
каждого экземпляра класса. CIM содержит все определения классов для
управляемого окружения. В winmgmts.vbs каждый экземпляр процесса
использует методы и свойства класса Win32_Process, как собственные, так и
унаследованные. Это справедливо для всех классов, определенных в CIM.
Исследовать классы, определенные в CIM, достаточно просто при помощи
программы wbemtest.exe. Информацию о классах можно найти в документации
WMI SDK.
Модель объектов WMI


На Рисунке 1 модели объектов WMI показаны основные объекты библиотеки
сценариев WMI. Объекты модели предоставляют методы и свойства,
использующиеся в сценариях для доступа и извлечения объектов WMI.
Рассмотрим по шагам, как winmgmts.vbs использует объекты, которые
предоставляет данная модель.

Рисунок 1. Модель объектов сценариев WMI.

Шаг 1: подключение к WMI. Для подключения к WMI в сценарии применяется
моникер winmgmts. Он возвращает объект SwbemServices. Вместо создания
ссылки на объект Swbem Services в сценарии немедленно вызывается метод
InstancesOf объекта SwbemServices.
Шаг 2: выборка экземпляров класса. Метод SwbemServices InstancesOf
возвращает экземпляры указанного класса. В Листинге 1 метод SWbemServices
InstancesOf возвращает экземпляры Win32_Process в SwbemObjectSet.
Отношения между объектами показаны на Рисунке 1. В сценарии
инициализируется переменная-ссылка wbemObject Set для указания на
коллекцию SWbemObjectSet, которую возвращает метод SWbem Services
InstancesOf.
Шаг 3: доступ к методам и свойствам класса. Коллекция SwbemObjectSet
содержит экземпляры класса CIM, представленные SwbemObject. Для доступа к
каждому экземпляру Win32_Process, который является членом коллекции
SwbemObjectSet, можно использовать цикл For...Each. При каждом проходе
цикла (см. Листинг 1, метка B) переменная-ссылка wbemObject связывается с
очередным экземпляром Win32_Process в коллекции. SwbemObject используется
для доступа к методам и свойствам экземпляра класса CIM.
В Таблице 1 приведено краткое описание каждого объекта модели WMI
Scripting Object Model и указаны ссылки на Web-сайт Microsoft, где можно
найти подробную информацию о методах и свойствах соответствующего объекта.
В Листинге 2 приведен сценарий locator.vbs, который выполняет ту же
задачу, что и winmgmts.vbs. Основное различие между двумя примерами в том,
что locator.vbs для доступа к объекту SwbemServices использует объект
SwbemLocator, а не WMI-моникер. Это объясняет, почему locator.vbs
применяет VBScript-функцию CreateObject, в то время как winmgmts.vbs
использует функцию GetObject. Winmgmts.vbs использует GetObject для работы
с моникерами. Программный идентификатор Wbem Scripting.SWbemLocator в
locator.vbs указывает функции CreateObject, что необходимо создать объект
SWbem sLocator.
Хотя сценарии, приведенные в Листингах 1 и 2, функционально одинаковы, они
демонстрируют действие различных механизмов, заложенных в библиотеке WMI.
Новичкам может показаться, что синтаксис моникера излишне запутан, поэтому
вначале они могут поработать с SWbem Locator. С точки зрения
функциональности метод Connect Server, который предоставляет SWbemLocator,
позволяет распределять полномочия, необходимые для проведения
аутентификации WMI соединения. Синтаксис моникера предоставляет
возможность выполнения нескольких действий в одной строке кода.
Объекты, которые предоставляет библиотека сценариев WMI, позволяют
основательно подойти к разработке данных WMI. В следующей статье я
планирую рассмотреть объекты библиотеки WMI с еще более богатой
функциональностью. А пока я хотел бы предложить читателям в качестве
тренировки модифицировать любой из двух листингов так, чтобы извлечь
другие классы Win32. Подсказка: помимо изменения имени класса, которое
передается методу InstancesOf, необходимо модифицировать тело цикла For...
Each так, чтобы применяемые в цикле методы и свойства совпадали с методами
и свойствами выбранного класса.
Об авторе


Боб Уэллс- консультант по программному обеспечению; специализируется на
вопросах проектирования и реализации инфрастуктуры информационных систем,
основанных на NT. Имеет сертификаты MCSE и MCT. С ним можно связаться по
адресу bobwells@ winntmag.com.

СОДЕРЖАНИЕ