В предыдущих статьях я уже рассказывал о нескольких сценариях 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 так, чтобы применяемые в цикле методы и свойства совпадали с методами и свойствами выбранного класса.