Копилка знаний

2.1.34 Методы управления компьютерной сетью: Windows Management Interface

Введение в Windows Management Instrumentation (WMI)

Технология WMI (Windows Management Instrumentation) — это одна из базовых технологий Microsoft для централизованного управления и слежения за работой различных частей компьютерной сети под управлением Windows. WMI пригодится прежде всего администраторам Windows, а также разработчикам программного обеспечения. Технология WMI — это реализация модели управления предприятием на базе Web (Web-Based Enterprise Management, WBEM), которая в свою очередь разработана при участии не только компании Microsoft, но и целого ряда других компаний. Задачей WBEM является разработка таких стандартов удалённого управления информационной средой предприятия, которые не зависят от конкретного оборудования, сетевой инфраструктуры, операционной системы, файловой системы и т.д. В рамках WBEM была предложена схема Common Information Model (CIM), которая представляет структуру компьютерной системы в виде единой расширяемой объектно-ориентированной модели и поддерживается в WMI.

Можно автоматизировать работу с WMI с помощью сценариев Windows Script Host (WSH), используя при этом совместно с WMI и другие ActiveX-технологии (например, ActiveX Data Object (ADO) для доступа к базам данных или Active Directory Service Interface (ADSI) для работы со службами каталогов), получив таким образом мощный и удобный инструмент для системного администратора и программиста. Все примеры сценариев WSH в настоящей статье будут приводиться на языке VBScript. Имейте в виду, что сценарии, приведённые в настоящей статье, написаны не для практического применения, а лишь для иллюстрации излагаемого материала (например, в сценариях отсутствует какая-либо обработка ошибок, что совершенно не годится для настоящих рабочих сценариев). Кроме того, вы не найдёте здесь много готовых рецептов для решения конкретных задач администрирования, поскольку цель приведённых примеров — опять же, лишь ознакомление со структурой и возможностями WMI.

Технология WMI реализована для всех 32-разрядных версий Windows, начиная с Windows 95 OSR 2 и заканчивая Windows Server 2003. В операционных системах Windows Me/2000/XP и Windows Server 2003 никакой дополнительной установки WMI не требуется, здесь уже функционирует ядро WMI версии 1.5. Для операционных систем Windows 9x/NT необходимо обновить ядро WMI до версии 1.5. Необходимый для этого инсталяционный файл wmicore.exe можно скачать с сервера Microsoft.

Общая структура WMI

WMI состоит из следующих частей:

  • Менеджер объектов CIM (Common Information Model Object Manager, CIMOM), который обеспечивает обработку всех запросов конечных приложений к WMI и доставку информации от WMI к конечным приложениям. Все провайдеры WMI (см. ниже) должны быть зарегистрированы с помощью CIMOM для правильного перенаправления полученных от конечного приложения запросов к нужному провайдеру. Функциональность CIMOM обеспечивает файл winmgmt.exe, который находится в каталоге %SystemRoot%\System32\Wbem\. Этот файл запускается как сервис.
  • Репозиторий (хранилище классов) CIM. Объекты-экземпляры таких классов создаются провайдером WMI (см. ниже) по запросу потребителя. В Windows Server 2003 и Windows XP репозиторий физически располагается в каталоге %SystemRoot%\System32\Wbem\Repositiry\FS\ в файлах objects.data(репозиторий), index.btr (индексный файл), index.map и object.map(файлы контроля над транзакциями). В более ранних версиях Windows репозиторий располагается в файле cim.rep.
  • Провайдеры WMI, которые скрывают детали внутренней реализации управляемых объектов, позволяя CIMOM обращаться к этим объектам единообразно, используя WMI API. Фактически провайдеры являются COM-серверами, которые представлены dll-библиотеками в каталоге %SystemRoot%\System32\Wbem\. WMI включает множество встроенных провайдеров, которые предназначены для получения данных из различных источников, например, журналов событий, системного реестра и т.д.
  • Библиотека поддержки сценариев (WMI scripting library), которая располагается в файле wbemdisp.dll в каталоге %SystemRoot%\System32\Wbem\.

Ваше приложение может обратиться с запросом к любой удалённой машине, на которой установлен WMI. При этом происходит соединение с CIMOM на удалённой машине, после чего запросы обрабатываются точно также, как и на локальной машине. CIMOM проверяет права пользователя, который пытается воспользоваться сервисами WMI на локальном или удалённом компьютере. Потребители WMI (конечные приложения) могут обращаться к управляемым объектам с помощью специального языка запросов WMI Query Language (WQL). CIMOM позволяет создавать обработчики событий управ О ляемых объектов (например, снижение объёма дискового пространства до заданного значения, запуск определённого процесса и т.п.). Для этого CIMOM периодически опрашивает нужный объект (интервал опроса задаётся в конечном приложении) и в случае необходимости генерирует событие.

Количество классов CIM зависит от версии операционной системы. Например, для Windows Server 2003 в CIM хранится около 5000 классов. Классы, составляющие CIM, находятся в иерархической зависимости друг от друга, и классы-потомки могут наследовать, переопределять и добавлять свойства родительских классов. Классы CIM группируются в пространства имён (namespaces), которые упорядочены иерархически. Корневое пространство имён обозначается как Root. В любом варианте установки WMI имеются четыре пространства имён, которые находятся на один уровень ниже корневого пространства имён: CIMV2, Default, Security и WMI.

Общие сведения о классах WMI

Все классы внутри одного пространства должны иметь уникальные имена (при этом имена классов из разных пространств могут совпадать). Класс не может иметь предка или потомка из другого пространства имён.

Полный путь к классу CIM имеет следующую структуру:

\\ComputerName\Namespace:ClassName.KeyProperty1=Value1, KeyProperty2=Value2 …

Здесь:

  • ComputerName — сетевое имя компьютера. Для задания локального компьютера можно использовать символ «.».
  • Namespace — название пространства имён.
  • ClassName — имя класса.
  • KeyProperty1=Value1, KeyProperty2=Value2 … — список ключевых пар «свойство-значение» объекта.

Например, экземпляр класса Win32_Process из пространства имён CIMV2 с идентификатором 4, запущенный на локальной машине, определяет такой путь:

\\.\Root\CIMV2:Win32_Process.Handle=4

Всякому ресурсу, управляемому с помощью WMI, соответствует свой класс. Каждый класс имеет свойства, методы и квалификаторы. Также свои квалификаторы могут быть у каждого свойства и метода.

Типы классов по способу хранения информации об управляемых ресурсах:

  • Абстрактный класс (abstract class) — шаблон для образования классов-потомков (абстрактных и неабстрактных), не может использоваться для получения экземпляра управляемого ресурса.
  • Статический класс (static class) — моделирует данные, которые физически хранятся в репозитории CIM (например, данные о собственных настройках WMI). Доступ к экземплярам статических классов осуществляется без помощи каких-либо провайдеров.
  • Динамический класс (dynamic class) — моделирует данные управляемого ресурса через соответствующего провайдера.

Ассоциативный класс (association class) — это класс, который описывает логическую связь между классами или управляющими ресурсами. Может быть абстрактным, статическим или динамическим.

Типы классов по принадлежности к информационным моделям:

  • Системные классы — служат для задания конфигурации и выполнения внутренних функций WMI (обеспечение безопасности, регистрация провайдеров, подписка на события и пр.). Могут быть абстрактными или статическими. Имена всех системных классов начинаются с символов «__» (двойное подчёркивание).
  • Классы модели ядра (core model) — абстрактные классы, которые обеспечивают интерфейс со всеми областями управления (например, абстрактный класс CIM_LogicalElement, который описывает логический управляемый ресурс, например, файл или каталог). Имена таких классов начинаются с префикса «CIM_».
  • Классы общей модели (common model) — классы для специфических задач управления, но не зависящие от версии операционной системы. Имена таких классов тоже начинаются с префикса «CIM_».
  • Классы модели расширения (extension model) — классы для специфических задач управления. Например, классы, соответствующие ресурсам среды Win32, начинающиеся с префикса «Win32_».

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

Свойства классов используются для однозначной идентификации экземпляра класса, представляющего конкретный управляемый ресурс, а также для описания текущего состояния этого ресурса. В основном в WMI свойства классов доступны только для чтения, но значения определённых свойств некоторых классов можно изменять методом Put_(). Возможность изменения конкретного свойства может зависеть от версии операционной системы. Чтобы узнать, является ли свойство доступным для записи, можно проверить значение квалификатора write этого свойства (о квалификаторах см. ниже).

Методы класса позволяют выполнить те или иные действия над управляемым ресурсом, которому соответствует этот класс. Так как не над каждым ресурсом можно производить какие-либо операции, то не у всякого класса есть методы.

Квалификаторы содержат дополнительную информацию о классе, свойстве или методе, в котором они определены.

Квалификаторы классов предоставляют информацию о классе в целом, например, тип класса (квалификаторы Abstract, Dynamic, Association, которые могут принимать булевы значения), имя провайдера класса (квалификатор Provider), информацию о том, поддерживает ли класс создание, уничтожение, изменение экземпляров (квалификаторы SupportsCreate, SupportsDelete, SupportsUpdate которые могут принимать булевы значения), UUID класса (квалификатор UUID), названия методов создания, уничтожения экземпляров (квалификаторы CreateBy, DeleteBy) и т.п.

Квалификаторы свойств позволяют определить тип данного свойства (квалификатор CIMType), доступность для чтения (квалификатор Read), доступность для записи (квалификатор Write), набор допустимых значений для свойства (квалификатор ValueMap) и т.п.

Квалификаторы методов могут описывать множество значений, которые будут возвращаться методом (квалификатор ValueMap), права, которые необходимы для вызова метода (квалификатор Privileges) и т.п. Выполнять можно только те методы, у которых есть квалификатор Implemented со значением True.

Общие сведения о событиях в WMI

Одной из наиболее мощных возможностей WMI является так называемая подписка на извещения о событиях WMI, т.е. создание собственных обработчиков определённых событий WMI. Примерами событий могут послужить снижение объёма дискового пространства на сервере до заданного значения, появление в журнале событий определённого сообщения, запуск или завершение работы определённого приложения и т.д.

События в WMI разделяются на внутренние, внешние и события таймера. Внешние события представлены классом __ExtrinsicEvent, события таймера — классом __TimerEvent, а внутренние события — классами __NamespaceOperationEvent, __ClassOperationEvent и __InstanceOperationEvent. При наступлении события WMI автоматически создаёт экземпляр того класса, которому соответствует это событие.

Внутренние события позволяют контролировать изменения в состоянии тех управляемых ресурсов, которые представлены отдельным классом WMI, а также изменения в структуре самого репозитория CIM. Событиям, которые связаны с управляемыми ресурсами, соответствуют классы, которые порождены от класса __InstanceOperationEvent. Это классы __InstanceCreationEvent, __InstanceModificationEvent и __InstanceDeleionEvent, отвечающие за создание, модификацию и удаление экземпляра класса.

Для подписки на извещения о внутренних событиях применяются запросы специального вида на языке WQL.

Если возникает необходимость контроля состояния какого-либо объекта, для которого в CIM не предусмотрено отдельного класса, используются внешние события. Пример внешнего события — изменение значения определённого ключа в реестре. Для создания внешнего события необходимо, чтобы данное событие поддерживалось соответствующим провайдером WMI.

Для подписки на извещения о внешнем событии из сценария WSH нужно с помощью метода ExecNotificationQueryAsync класса SWbemServices выполнить асинхронный WQL-запрос специального вида.

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

Потребители событий могут быть временными и постоянными.

Временные потребители событий — это приложения, которые получают извещения о событиях только во время своей активности. Такими потребителями могут быть сценарии WSH.

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

Безопасность при работе с WMI

По умолчанию с помощью утилит и сценариев WMI пользователь может на определённой машине выполнить только те действия, на которые ему даны разрешения на этой машине. Таким образом реализуется безопасность WMI на уровне операционной системы. Дополнительно политика безопасности в WMI реализована на уровнях пространств имён и протокола DCOM (Distributed COM).

Каждый объект операционной системы, доступ к которому определяет система безопасности (файл, процесс, служба и т.д.), имеет дескриптор безопасности (Security Descriptor, SD), в котором хранится таблица контроля доступа (Access Control List, ACL) для этого объекта. Каждое пространство имён может иметь собственный дескриптор безопасности, в котором хранится таблица контроля доступа. Каждая запись в таблице контроля доступа содержит информацию о том, какие права имеет определённый пользователь при выполнении определённых операций в этом пространстве имён. Список разрешений:

Разрешение Описание
Выполнение методов (Execute Methods) Позволяет вызывать методы классов этого пространства имён. Если пользователь имеет это разрешение, но не имеет разрешения на выполнение операции, которую производит метод, в операционной системе, произойдёт отказ при выполнении метода.
Полная запись (Full Write) Позволяет создавать и модифицировать подпространства имён, системные классы и экземпляры классов.
Частичная запись (Partial Write) Позволяет создавать и модифицировать любые статические классы и экземпляры несистемных классов.
Запись поставщика (Provider Write) Позволяет записывать в репозиторий CIM классы провайдеров WMI и экземпляры этих классов.
Включить учётную запись (Enable Account) Право чтения данных WMI.
Включить удалённо (Remote Enable) Право доступа к WMI на удалённом компьютере. По умолчанию это разрешение есть только у администраторов.
Прочесть безопасность (Read Security) Позволяет читать дескриптор безопасности этого пространства имён.
Изменение правил безопасности (Edit Security) Позволяет изменять дескриптор безопасности этого пространства имён.

Все записи таблицы контроля доступа сохраняются в репозитории WMI. Разрешения WMI для конкретного пространства имён наследуются для всех подпространств имён и классов этого пространства имён. Собственных разрешений безопасности для отдельных классов не существует.

В Windows NT/2000/XP по умолчанию группа администраторов обладает всеми разрешениями. Остальные пользователи обладают разрешениями Включить учётную запись (Enable Account), Выполнение методов (Execute Methods) и Запись поставщика (Provider Write).

Изменить вышеописанные разрешения уровня пространств имён можно запустив элемент управления WMI. Для этого нужно выполнить команду wmimgmt.msc либо в командной строке, либо в меню «Пуск» — «Выполнить». В Windows 9x/Me для открытия элемента управления WMI нужно запустить программу wbemcntl.exe. Если необходимо подключиться к WMI на удалённом компьютере, в открывшейся консоли нужно выбрать меню «Действие» — «Подключение к другому компьютеру…». Для входа в режим просмотра и изменения параметров WMI нужно выбрать меню «Действие» — «Свойства». Примечание: к WMI на локальном компьютере можно получить доступ только от имени текущего пользователя. Чтобы задать разрешения WMI, в окне свойств следует выбрать вкладку «Безопасность», выбрать нужное пространство имён и нажать кнопку «Безопасность». В том же окне свойств можно задать пространство имён WMI, используемое по умолчанию для написания сценариев (вкладка «Дополнительно»).

Для доступа к WMI на удалённом компьютере используется протокол DCOM (Distributed COM). Пользователь, который запускает сценарий или подключается к WMI с помощью специальных утилит, выступает в качестве клиента, а объект WMI, к которому идёт обращение, является сервером. Для того, чтобы определить, какие права будут применяться при работе с WMI на удалённом компьютере, используются уровни олицетворения протокола DCOM:

Уровень Описание
Анонимный доступ (Anonymous, 1) Объект-сервер не может получить информацию о клиенте (не может олицетворить клиента). Этот уровень олицетворения в WMI не используется.
Идентификация (Identify, 2) Объект-сервер может получить информацию о клиенте, но не может олицетворить клиента. Этот уровень олицетворения не позволяет запускать сценарии WMI на удалённых машинах.
Олицетворение (Impersonate, 3) Объект-сервер может пользоваться всеми правами клиента.
Делегирование (Delegate, 4) Объект-сервер может обратиться от имени клиента к другому объекту-серверу.

Уровень олицетворения протокола DCOM, выбираемый по умолчанию при обращении к серверу DCOM, зависит от версии WMI на целевом компьютере. Чтобы изменить уровень по умолчанию, необходимо записать его наименование в следующий ключ реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\Scripting\Default Impersonation Level

В сценариях WSH нужный уровень олицетворения можно указать в явном виде в момент соединения с WMI.

Протокол DCOM позволяет также установить определённый уровень аутентификации (проверки подлинности). Возможные уровни:

Уровень Описание
Отсутствует (None, 1) Проверка подлинности отсутствует.
По умолчанию (Default, 0) Используются стандартные настройки безопасности, заданные на сервере.
Подключений (Connect, 2) Клиент проходит проверку подлинности только во время подключения к серверу. После того, как соединение установлено, никаких проверок не производится.
Вызовов (Call, 3) Клиент проходит проверку подлинности в начале каждого вызова во время приёма запросов сервером. Заголовки пакетов подписываются, но содержимое пакетов не подписывается и не шифруется.
Пакетов (Pkt, 4) То же, что и предыдущее, но проверке подлинности подвергаются все пакеты, поступающие от клиента.
Целостности пакетов (PktIntegrity, 5) Все пакеты проходят проверку подлинности и целостности (т.е. проверяется, что содержимое пакета не было изменено во время передачи). Данные подписываются, но не шифруются.
Секретности пакетов (PktPrivacy, 6) То же, что и предыдущее, но данные шифруются.

В сценариях WSH нужный уровень аутентификации можно указать в явном виде в момент соединения с WMI. При локальной работе с WMI DCOM всегда использует уровень секретности пакетов (PktPrivacy).

Подключение к WMI в сценариях WSH с помощью объекта SWbemLocator

Для подключения к WMI с помощью сценариев WSH существуют два варианта: с использованием объекта SWbemLocator и с помощью WMI-моникера (WMI moniker) «WinMgmts:».

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

Set objSWbemLocator = CreateObject(«WbemScripting.SWbemLocator»)

Единственный метод ConnectServer объекта SWbemLocator позволяет подключиться к WMI и получить ссылку на объект SWbemServices. Синтаксис вызова метода:

objSWbemServices = objSWbemLocator.ConnectServer([strServer], [strNamespace], [strUser], [strPassword], [strLocale], [strAuthority], [iSecurityFlags], [objWbemNamedValueSet])

Параметры метода:

  • strServer — имя компьютера. Если не указано, подключение будет производиться к локальному компьютеру.
  • strNamespace — пространство имён. Если не указано, будет использовано пространство имён, заданное по умолчанию.
  • strUser — имя пользователя в формате Domain\Username. Если не указано, будет использована текущая учётная запись. Если параметр указан для локального соединения, произойдёт ошибка (к локальному компьютеру можно подключаться только от имени текущей учётной записи).
  • strPassword — пароль пользователя.
  • strLocale — код локализации. Если не указан, будет использован текущий регион (язык). Формат строки — «MS_xxxx», где xxxx — строка в шестнадцатеричной форме, которая указывает LCID. Например, американский английский указывается как «MS_409».
  • strAuthority — имя домена. Если домен уже определен в параметре strUser, повторное указание домена в этом параметре приведёт к ошибке. Если этот параметр начинается со строки «kerberos:», будет использована идентификация Kerberos.
  • iSecurityFlags — влияет на время ожидания подключения. Если параметр установлен в 0, управление будет передано на следующую строку программы (скрипта) только после того, как подключение к серверу будет установлено. Если параметр установлен в 128, максимальное время ожидания подключения — 2 минуты.
  • objWbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.

Единственное свойство Security_ объекта SWbemLocator содержит объект SWbemSecurity, который служит для чтения и установки параметров безопасности (привилегий, уровня олицетворения и уровня аутентификации). Свойства объекта SWbemSecurity:

Свойство Описание
AuthenticationLevel Целое число, которое определяет уровень аутентификации. Возможные значения — см. выше описание уровней аутентификации DCOM.
ImpersonationLevel Целое число, которое определяет уровень олицетворения. Возможные значения — см. выше описание уровней олицетворения DCOM.
Privileges Объект SWbemPrivilegeSet, определяющий различные разрешения.

Свойства и методы объекта SWbemPrivilegeSet:

Свойство / метод Описание
Count Содержит число элементов в коллекции. Только чтение.
Add(iPrivilege, [bIsEnabled = True]) Добавляет в коллекцию объект SWbemPrivilege и возвращает его. Если объект с таким именем уже существует в коллекции, он перезаписывается. Параметр iPrivilege задаёт целое число, определяющее разрешение. Параметр bIsEnabled — булево значение, включающее или запрещающее это разрешение. Возможные значения параметра iPrivilege:
  • 1 (wbemPrivilegeCreateToken, SeCreateTokenPrivilege) — возможность создавать первичный маркер.
  • 2 (wbemPrivilegePrimaryToken, SeAssignPrimaryTokenPrivilege) — возможность назначать первичный маркер процесса.
  • 3 (wbemPrivilegeLockMemory, SeLockMemoryPrivilege) — возможность блокировать физические страницы в памяти.
  • 4 (wbemPrivilegeIncreaseQuota, SeIncreaseQuotaPrivilege) — возможность увеличивать квоту, назначенную на процесс.
  • 5 (wbemPrivilegeMachineAccount, SeMachineAccountPrivilege) — возможность создавать учетную запись машины.
  • 6 (wbemPrivilegeTcb, SeTcbPrivilege) — идентифицирует держателя как часть доверенной компьютерной базы (trusted computer base).
  • 7 (wbemPrivilegeSecurity, SeSecurityPrivilege) — исполняет множество связанных с безопасностью функций, типа управления и рассмотрения сообщений аудита. Эта привилегия идентифицирует ее держателя как оператора безопасности (security operator).
  • 8 (wbemPrivilegeTakeOwnership, SeTakeOwnershipPrivilege) — возможность монопольного использования объекта без предоставления контролируемого доступа.
  • 9 (wbemPrivilegeLoadDriver, SeLoadDriverPrivilege) — возможность загрузки и выгрузки драйвера устройства.
  • 10 (wbemPrivilegeSystemProfile, SeSystemProfilePrivilege) — возможность сбора информации профилирования (profiling information) для всей системы.
  • 11 (wbemPrivilegeSystemtime, SeSystemtimePrivilege) — возможность изменять системное время.
  • 12 (wbemPrivilegeProfileSingleProcess, SeProfileSingleProcessPrivilege) — возможность сбора информации профилирования (profiling information) для отдельного процесса.
  • 13 (wbemPrivilegeIncreaseBasePriority, SeIncreaseBasePriorityPrivilege) — возможность увеличивать базовый приоритет процесса.
  • 14 (wbemPrivilegeCreatePagefile, SeCreatePagefilePrivilege) — возможность создавать файл подкачки.
  • 15 (wbemPrivilegeCreatePermanent, SeCreatePermanentPrivilege) — возможность создавать постоянный объект.
  • 16 (wbemPrivilegeBackup, SeBackupPrivilege) — возможность исполнять операции резервного копирования.
  • 17 (wbemPrivilegeRestore, SeRestorePrivilege) — возможность исполнять операции восстановления, возможность установить любого допустимого пользователя или идентификатор безопасности группы (SID) как владельца объекта.
  • 18 (wbemPrivilegeShutdown, SeShutdownPrivilege) — возможность завершать работу локальной системы.
  • 19 (wbemPrivilegeDebug, SeDebugPrivilege) — возможность отладки процесса.
  • 20 (wbemPrivilegeAudit, SeAuditPrivilege) — возможность генерировать элементы лога аудита.
  • 21 (wbemPrivilegeSystemEnvironment, SeSystemEnvironmentPrivilege) — возможность изменять энергонезависимую RAM память систем, чтобы использовать этот тип памяти для хранения информации конфигурации.
  • 22 (wbemPrivilegeChangeNotify, SeChangeNotifyPrivilege) — возможность получать уведомления об изменениях файлов и каталогов. Это допускается по умолчанию для всех пользователей.
  • 23 (wbemPrivilegeRemoteShutdown, SeRemoteShutdownPrivilege) — возможность удалённо завершать работу системы.
  • 24 (wbemPrivilegeUndock, SeUndockPrivilege) — возможность удалять портативный компьютер из док-станции.
  • 25 (wbemPrivilegeSyncAgent, SeSyncAgentPrivilege) — возможность синхронизировать данные службы каталога.
  • 26 (wbemPrivilegeEnableDelegation, SeEnableDelegationPrivilege) — возможность разрешать учётные записи компьютера и пользователя для доверенного делегирования.
AddAsString(strPrivilege, [bIsEnabled = True]) Добавляет в коллекцию объект SWbemPrivilege и возвращает его. Параметр strPrivilege задаёт строку, определяющую разрешение. Например, для использования разрешения завершать работу локальной системы нужно использовать строку SeShutdownPrivilege. Возможные значения строк — см. выше описание метода Add(). Параметр bIsEnabled — булево значение, включающее или запрещающее это разрешение.
Item(iPrivilege) Возвращает объект SWbemPrivilege. Параметр iPrivilege задаёт целое число, определяющее разрешение. Возможные значения — см. выше описание метода Add().
DeleteAll() Очищает коллекцию.
Remove(iPrivilege) Удаляет разрешение из коллекции. Параметр iPrivilege задаёт целое число, определяющее разрешение. Возможные значения — см. выше описание метода Add().

Свойства объекта SWbemPrivilege:

Свойство Описание
DisplayName Содержит краткое описание разрешения. Только чтение.
Identifier Содержит идентификатор разрешения (целое число). Только чтение. Возможные значения — см. выше описание метода Add() объекта SWbemPrivilegeSet.
IsEnabled Содержит булево значение, определяющее, включено или запрещено это разрешение.
Name Содержит имя разрешения. Только чтение. Возможные значения — см. выше описание метода Add() объекта SWbemPrivilegeSet. Например, имя разрешения завершать работу локальной системы будет строкой «SeShutdownPrivilege».

Пример подключения:

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
'Уровень аутентификации - уровень секретности пакетов:
objSWbemLocator.Security_.AuthenticationLevel = 6
'Уровень олицетворения - олицетворение:
objSWbemLocator.Security_.ImpersonationLevel = 3
'Добавление разрешения завершать работу локальной системы:
objSWbemLocator.Security_.Privileges.AddAsString("SeShutdownPrivilege")
'Вывод краткого описания добавленного разрешения:
WScript.Echo "Добавлено разрешение:"
WScript.Echo objSWbemLocator.Security_.Privileges.Item(18).DisplayName
'Подключение:
Set objSWbemServices = objSWbemLocator.ConnectServer(".", "Root\CIMV2",,,,, 128)

Подключение к WMI в сценариях WSH с помощью WMI-моникера «WinMgmts:»

Для подключения к WMI с помощью сценариев WSH существуют два варианта: с использованием объекта SWbemLocator и с помощью WMI-моникера (WMI moniker) «WinMgmts:».

Моникер — это строка определённой структуры, задающая путь к объекту, экземпляр которого должен быть создан. Моникер передаётся в качестве параметра функции GetObject(). Моникер состоит из следующих частей:

  • Обязательный префикс «winmgmts:».
  • Необязательные параметры настройки безопасности WMI.
  • Необязательный путь к нужному объекту WMI.

Регистр символов префикса «winmgmts:» неважен. Самый простой моникер состоит только из этого префикса. Такой моникер подключается к пространству имён по умолчанию (как правило, это Root\CIMV2) на локальном компьютере:

Set objService = GetObject(«winmgmts:»)

Связь WMI-моникера «winmgmts:» с библиотекой поддержки сценариев WMI осуществляется с помощью такого раздела реестра:

HKEY_CLASSES_ROOT\WINMGMTS\CLSID

В значении по умолчанию вышеуказанного раздела записан идентификатор, указывающий на другой раздел реестра:

HKEY_CLASSES_ROOT\CLSID\<Идентификатор>\InProcServer32

В значении по умолчанию последнего раздела записан полный путь к библиотеке поддержки сценариев WMI.

После префикса «winmgmts:» можно указать в фигурных скобках следующие параметры безопасности:

  • Уровень олицетворения DCOM, например «winmgmts:{impersonationLevel=Impersonate}».
  • Уровень аутентификации DCOM, например «winmgmts:{authenticationLevel=pktPrivacy}».
  • Источник проверки подлинности (домен), например «winmgmts:{authority=NTLMDomain:Domain1}» или «winmgmts:{authority=Kerberos:Domain1\Server1}». Возможно использование протокола Kerberos или NT LAN Manager (NTLM). При установке связи с WMI на локальном компьютере параметр authority не указывается.
  • Назначенные и отозванные привилегии в дополнительных круглых скобках, например «winmgmts:{(Shutdown, !RemoteShutdown)}». Возможные значения привилегий — см. выше описание метода Add() объекта SWbemPrivilegeSet. При указании привилегий префикс «Se» и суффикс «Privilege» отбрасываются, т.е. например, «SeShutdownPrivilege» указывается как «Shutdown». Отозванные привилегии предваряются восклицательным знаком.

Пример совместного указания параметров безопасности:

«winmgmts:{impersonationLevel=Impersonate, authenticationLevel=pktPrivacy, authority=NTLMDomain:Domain1, (Shutdown, RemoteShutdown)}»

Способы задания пути к нужному объекту WMI описаны выше в разделе «Общие сведения о классах WMI». Если параметры безопасности указаны, путь к объекту предваряется восклицательным знаком, например:

«winmgmts:{impersonationLevel=Impersonate, (Shutdown, RemoteShutdown)}!\\.\Root\CIMV2:Win32Process.Handle=4»

Если параметры безопасности не указаны, путь к объекту записывается без восклицательного знака, например:

«winmgmts:\\.\Root\CIMV2:Win32Process.Handle=4»

Пример подключения:

Set objSWbemServices = GetObject(«winmgmts:{impersonationLevel=Impersonate}!\\.\Root\CIMV2»)

Работа с объектом SWbemServices

В результате подключения к WMI (как с помощью объекта SWbemLocator, так и с помощью моникера) можно получить объект SWbemServices, который обладает рядом свойств и методов. Объект SWbemServices возвращается в случае, если подключение производится к пространству имён.

Большинство операций в сценариях WMI можно выполнять в трёх режимах: синхронном, полусинхронном и асинхронном. При запуске метода в синхронном режиме выполнение сценария не продолжается до тех пор, пока метод не будет полностью выполнен. В синхронном режиме рекомендуется выполнять операции, которые не возвращают больших объёмов данных. В асинхронном режиме после вызова метода управление сразу передаётся обратно в сценарий. При использовании асинхронных методов нужно обрабатывать события, возникающие при выполнении и завершении асинхронной операции. В полусинхронном режиме после вызова метода управление сразу передаётся обратно в сценарий, и можно начать работать с возвращаемыми данными, не дожидаясь полного завершения их формирования.

Некоторые свойства и методы объекта SWbemServices (полное описание свойств и методов — см. MSDN):

Свойство / метод Описание
Security_ Содержит объект SWbemSecurity, который служит для чтения и установки параметров безопасности (привилегий, уровня олицетворения и уровня аутентификации). Описание этого объекта было приведено выше в разделе «Подключение к WMI в сценариях WSH с помощью объекта SWbemLocator».
InstancesOf(strClass, [iFlags = 16], [objWbemNamedValueSet = null]) Возвращает коллекцию SWbemObjectSet объектов указанного класса согласно критериям выбора. Этот метод осуществляет простой запрос. Более сложные запросы могут потребовать использования метода ExecQuery(). Метод InstancesOf() работает в синхронном и полусинхронном режиме. Параметры:
  • strClass — имя класса.
  • iFlags — опции, комбинация флагов. Некоторые возможные значения (подробнее — см. MSDN):
    • wbemFlagReturnImmediately (16) — значение по умолчанию для этого параметра. Приводит к немедленному возврату результатов запроса (полусинхронный режим).
    • wbemFlagForwardOnly (32) — возвращает коллекцию типа forward-only (навигация только вперёд). Максимальная производительность и экономия памяти.
  • objWbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.

Пример использования метода — см. ниже текст скрипта, который выводит перечень всех доступных пространств имён WMI на указанном компьютере.

Get([strObjectPath = «» ], [iFlags = 0], [objWbemNamedValueSet = null]) Возвращает определение класса или экземпляр управляемого ресурса (объект SWbemObject). Метод работает в синхронном режиме. Параметры:
  • strObjectPath — путь к объекту в WMI. Если параметр не задан, возвращается пустой объект.
  • iFlags — опции, комбинация флагов. Возможные значения — см. MSDN.
  • objWbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.

Пример использования метода:
‘подключение к пространству имён
Set objService = GetObject(«winmgmts:\\.\Root\CIMV2»)
‘получение экземпляра класса с заданным ключевым свойством
Set objProcess = objService.Get(«Win32_Process.Handle=4»)

ExecQuery(strQuery, [strQueryLanguage = «WQL»], [iFlags = 16], [objWbemNamedValueSet = null]) Выполняет запрос на языке WQL (WMI SQL) и возвращает коллекцию SWbemObjectSet. Синтаксис языка WQL напоминает SQL и полностью описан в MSDN. Метод работает в синхронном и полусинхронном режиме. Параметры:
  • strQuery — текст запроса.
  • strQueryLanguage — используемый язык запросов. Если параметр задан, его значение должно быть всегда «WQL».
  • iFlags — опции, комбинация флагов. Некоторые возможные значения (подробнее — см. MSDN):
    • wbemFlagReturnImmediately (16) — значение по умолчанию для этого параметра. Приводит к немедленному возврату результатов запроса (полусинхронный режим).
    • wbemFlagForwardOnly (32) — возвращает коллекцию типа forward-only (навигация только вперёд). Максимальная производительность и экономия памяти.
  • objWbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.

Пример использования метода:
‘подключение к пространству имён
Set objService = GetObject(«winmgmts:\\.\Root\CIMV2»)
‘получение всех экземпляров класса с заданным свойством
Set colProcesses = objService.ExecQuery(«Select * from Win32_Process Where Handle = 4»)

SubclassesOf([strSuperclass = «»], [iFlags = 16], [objWbemNamedValueSet = null]) Возвращает коллекцию SWbemObjectSet, содержащую совокупность подклассов указанного класса. Метод работает в синхронном и полусинхронном режиме. Параметры:
  • strSuperclass — Имя класса, подклассы которого требуется получить. Если параметр не указан, будут возвращены все классы верхнего уровня, т.е. классы не имеющие родительского класса (если параметр iFlags содержит флаг wbemQueryFlagShallow), или вообще все классы в пределах текущего пространства имён.
  • iFlags — опции, комбинация флагов. Некоторые возможные значения (подробнее — см. MSDN):
    • wbemQueryFlagShallow (1) — включать только непосредственные подклассы указанного класса.
    • wbemFlagReturnImmediately (16) — значение по умолчанию для этого параметра. Приводит к немедленному возврату результатов запроса (полусинхронный режим).
  • objWbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.

Пример использования метода — см. ниже текст скрипта, который выводит перечень всех доступных классов выбранного пространства имён WMI.

Delete(strObjectPath, [iFlags = 0], [objWbemNamedValueSet = null]) Удаляет экземпляр управляемого ресурса. Не у всякого класса можно удалять экземпляры. Признаком того, что класс поддерживает удаление своих экземпляров, является, как правило, наличие у класса квалификатора SupportsDelete со значением True. Метод Delete() работает в синхронном режиме. Параметры:
  • strObjectPath — путь к объекту.
  • iFlags — зарезервировано. Параметр должен содержать ноль.
  • objWbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.

Пример использования метода:
Set objService = GetObject(«winmgmts:\\.\Root\CIMV2»)
objService.Delete(«__EventFilter.Name=’MonitoringServices’»)

ExecMethod(strObjectPath, strMethodName, [objWbemInParams = null], [iFlags = 0], [objWbemNamedValueSet = null]) Исполняет указанный метод указанного объекта. Работает в синхронном режиме. Параметры:
  • strObjectPath — путь к объекту.
  • strMethodName — имя метода.
  • objWbemInParams — объект SWbemObject, который содержит входные параметры для выполняемого метода.
  • iFlags — зарезервировано. Параметр должен содержать ноль.
  • objWbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.

Пример использования метода:
‘подключение к пространству имён
Set objService = GetObject(«winmgmts:\\.\Root\CIMV2»)
‘получение указателя на класс
Set objProcess = objService.Get(«Win32_Process»)
‘создание коллекции входных параметров метода
Set objInParams = objProcess.Methods_(«Create»).InParameters.SpawnInstance_
‘указание входного параметра — командной строки
objInParams.CommandLine = «calc.exe»
‘выполнение метода (запуск процесса)
Set objOutParams = objService.ExecMethod(«Win32_Process», «Create», objInParams)
‘получение идентификатора запущенного процесса
WScript.Echo objOutParams.ProcessId

Описанные выше методы объекта SWbemServices работают в синхронном и полусинхронном режимах. Существуют аналогичные методы, работающие в асинхронном режиме. Названия этих методов включают суффикс «Async»: InstancesOfAsync(), GetAsync(), ExecQueryAsync(), SubclassesOfAsync(), DeleteAsync(), ExecMethodAsync(). Асинхронные методы в основном похожи на вышеописанные, но включают дополнительные первый и последний параметры: в первом параметре передаётся ссылка на специальный объект SWbemSink, события которого потом обрабатываются в сценарии, а в последнем параметре — ссылка на специальный объект SWbemNamedValueSet, который используется, если делаются множественные асинхронные запросы с одним и тем же объектом SWbemSink (последний параметр необязателен и здесь не рассматривается, а его исчерпывающее описание можно найти в MSDN). Кроме того, параметр iFlags в асинхронных методах имеет несколько иной набор допустимых значений (подробнее — см. MSDN).

Объект SWbemSink создаётся следующим образом:

Set objSink = WScript.CreateObject(«WbemScripting.SWbemSink», «Sink_»)

Функция CreateObject() объекта WScript позволит в дальнейшем обрабатывать события объекта, а строка «Sink_» является префиксом для функций — обработчиков событий, которые будут описаны в сценарии.

Полное описание событий и методов объекта SWbemSink можно найти в MSDN, здесь же будут рассмотрены два основных события, обработка которых необходима для асинхронных вызовов: это события OnObjectReady() и OnCompleted(). Событие OnObjectReady() происходит, когда возвращается очередной объект, порождённый тем или иным запросом и получает этот объект в качестве одного из своих параметров. Событие OnCompleted() происходит после полного завершения асинхронной операции и получает, помимо прочего, код возврата асинхронной операции (в случае успеха — 0).

В качестве примера приведём скрипт, который получает асинхронно все процессы, запущенные на компьютере:

'подключение к пространству имён
Set objService = GetObject("winmgmts:\\.\Root\CIMV2")
'создание объекта SWbemSink
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
'асинхронный запрос
bdone = False
objService.ExecQueryAsync objSink, "Select * from Win32_Process"
'цикл ожидания, пока выполнится запрос
While Not bdone
    WScript.Sleep 1000
Wend
'обработчик события OnObjectReady
Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext)
    WScript.Echo objWbemObject.Name 'имя процесса
End Sub
'обработчик события OnCompleted
Sub Sink_OnCompleted(iHResult, objWbemErrorObject, objWbemAsyncContext)
    If iHResult=0 Then 'проверка кода возврата запроса
        WScript.Echo "Запрос завершён успешно."
    End If
    bdone = True 'флаг завершения запроса
End Sub

Работа с объектами SWbemObjectSet и SWbemObject

Рассмотренные выше методы объекта SWbemServices возвращают коллекции объектов SWbemObjectSet или «одиночные» объекты SWbemObject. Объекты SWbemObjectSet и SWbemObject в свою очередь обладают набором специфических свойств и методов.

Коллекция SWbemObjectSet содержит объекты SWbemObject, которые можно перебрать в цикле «For Each» (что продемонстрировано во многих примерах скриптов в этой статье), а также имеет следующие свойства и методы:

Свойство / метод Описание
Item(strObjectPath) Возвращает объект SWbemObject из коллекции. Параметр strObjectPath задаёт относительный путь к объекту. Это достаточно ресурсоёмкий метод.
Count Содержит количество элементов коллекции. Только чтение. Использование этого свойства достаточно ресурсоёмко. Если объект SWbemObjectSet был получен с флагом wbemFlagForwardOnly, при обращении к свойству произойдёт ошибка.
Security_ Содержит объект SWbemSecurity, который служит для чтения и установки параметров безопасности (привилегий, уровня олицетворения и уровня аутентификации). Описание этого объекта было приведено выше в разделе «Подключение к WMI в сценариях WSH с помощью объекта SWbemLocator».

Объект SWbemObject поддерживает два типа свойств и методов: универсальные свойства и методы, присущие любому объекту этого типа, а также набор свойств и методов, присущий определённому классу, которому соответствует объект в данный момент. Универсальные методы свойства заканчиваются конечным символом подчеркивания («_»), чтобы дифференцировать их от методов и свойств конкретного класса. Примечание: если вы изменяете свойства объекта SWbemObject, все изменения будут записаны в WMI только после вызова специального метода Put_(). Вот некоторые универсальные свойства и методы объекта SWbemObject (полное описание свойств и методов объекта SWbemObject можно найти в MSDN):

Свойство / метод Описание
Instances_([iFlags = 16], [objWbemNamedValueSet = null]) Возвращает объект SWbemObjectSet, который содержит экземпляры текущего класса. Этот метод осуществляет простой запрос. Более сложные запросы могут потребовать использования метода ExecQuery() объекта SWbemServices. Параметры:
  • iFlags — опции, комбинация флагов. Некоторые возможные значения (подробнее — см. MSDN):
    • wbemFlagReturnImmediately (16) — значение по умолчанию для этого параметра. Приводит к немедленному возврату результатов запроса (полусинхронный режим).
    • wbemFlagForwardOnly (32) — возвращает коллекцию типа forward-only (навигация только вперёд). Максимальная производительность и экономия памяти.
  • objWbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.

Пример использования метода:
‘подключение к классу:
Set objSWbemObject = GetObject(«winmgmts:\\.\Root\CIMV2:Win32_Process»)
‘получение коллекции экземпляров класса:
Set colProcesses = objSWbemObject.Instances_(16+32)
‘перебор экземпляров класса:
For Each objProcess In colProcesses
WScript.Echo objProcess.Name
Next

ExecMethod_(strMethodName, [objwbemInParams = null], [iFlags = 0], [objwbemNamedValueSet = null]) Исполняет указанный метод объекта. Параметры:
  • strMethodName — имя метода.
  • objwbemInParams — объект SWbemObject, который содержит в своей коллекции Properties_ входные параметры для выполняемого метода.
  • iFlags — зарезервировано. Параметр должен содержать ноль.
  • objwbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.

Пример использования метода:
‘подключение к классу «Win32_Process»:
Set objProcess = GetObject(«winmgmts:\\.\Root\CIMV2:Win32_Process»)
‘получение объекта, содержащего входные параметры метода «Create» класса «Win32_Process»:
Set objInParams = objProcess.Methods_(«Create»).InParameters.SpawnInstance_
‘задание командной строки
objInParams.CommandLine = «Notepad.exe»
‘запуск процесса
Set objOutParams = objProcess.ExecMethod_(«Create», objInParams)
‘проверка результатов запуска
If objOutParams.ReturnValue = 0 Then
WScript.echo «Метод «»Create()»» исполнен успешно.»
Else
If IsNull(objOutParams.ReturnValue) Then
WScript.echo «Не удалось исполнить метод «»Create()»».»
Else
WScript.echo «Метод «»Create()»» исполнен с ошибкой 0x» & hex(objOutParams.ReturnValue)
End If
End If

SpawnInstance_([iFlags = 0]) Cоздаёт новый пустой экземпляр класса. Параметр iFlags зарезервирован и должен содержать ноль. Пример использования — см. выше описание метода ExecMethod_().
Clone_() Возвращает новый объект, который является копией текущего объекта. Это полезно, когда нужно сохранить оригинальную копию объекта для резервных целей, изменяя при этом новую копию. Например, Вы можете использовать метод SpawnInstance_(), чтобы создать стартовый образец, а затем использовать метод Clone_(), чтобы быстро воспроизвести 100 копий образца.
CompareTo_(objWbemObject, [iFlags = 0]) Сравнивает два объекта SWbemObject. Возвращает True, если объекты совпадают, и False, если объекты не совпадают. Параметры:
  • objWbemObject — объект SWbemObject для сравнения.
  • iFlags — опции сравнения, комбинация флагов. Некоторые возможные значения (подробнее — см. MSDN):
    • wbemComparisonFlagIncludeAll(0) — полное сравнение.
    • wbemComparisonFlagIgnoreQualifiers(1) — игнорирует все квалификаторы при сравнении.
    • wbemComparisonFlagIgnoreObjectSource(2) — игнорирует при сравнении источники объектов, т.е. сервер и пространство имён.
    • wbemComparisonFlagIgnoreClass(8) — предполагает, что сравниваемые объекты — образцы того же самого класса, т.е. сравнивается только информация, связанная с экземпляром. Используйте этот флажок, чтобы оптимизировать выполнение.
    • wbemComparisonFlagIgnoreCase(16) — сравнивает строки без учета регистра. Это применяется и к значениям квалификаторов. Имена квалификаторов всегда сравниваются без учета регистра, определен ли этот флажок или нет.
Delete_([iFlags = 0], [objwbemNamedValueSet = null]) Удаляет текущий класс или экземпляр класса, если такое действие с этим классом поддерживается провайдером. Признаком того, что провайдер динамического класса поддерживает процедуру удаления своих экземпляров, является, как правило, наличие у класса квалификатора SupportsDelete со значением True. Параметры:
  • iFlags — зарезервировано. Параметр должен содержать ноль.
  • objwbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.
Put_([iFlags = 0], [objwbemNamedValueSet = null]) Создаёт или обновляет класс или экземпляр класса после того, как вы изменяете его любые свойства и возвращает объект SWbemObjectPath. Примечание: чтобы узнать, является ли свойство изменяемым, нужно проверить квалификатор Write этого свойства — если данный квалификатор имеется и его значение равно True, свойство доступно для записи. Параметры:
  • iFlags — опции, комбинация флагов. Некоторые возможные значения (подробнее — см. MSDN):
    • wbemChangeFlagUpdateOnly(1) — только обновление. Для успешного исполнения класс или образец должны существовать.
    • wbemChangeFlagCreateOnly(2) — только создание. Для успешного исполнения класс или образец ещё не должны существовать.
    • wbemFlagReturnImmediately(16) — немедленный возврат результата (полусинхронный режим).
  • objwbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.

Пример использования метода:
‘подключение к пространству имён
Set objService = GetObject(«winmgmts:\\.\Root\CIMV2»)
‘получение объекта логического диска «D:»
Set colDisks = objService.ExecQuery(«Select * from Win32_LogicalDisk Where DeviceID = ‘D:’»)
For Each objDisk In colDisks
WScript.Echo objDisk.VolumeName
‘смена метки тома
objDisk.VolumeName = «New»
‘запись изменений
objDisk.Put_
WScript.Echo objDisk.VolumeName
Next

Methods_ Содержит коллекцию методов класса (объект SWbemMethodSet). Только чтение. Пример использования — см. ниже скрипт, который выводит перечень всех доступных свойств, методов и квалификаторов выбранного класса WMI.
Properties_ Содержит коллекцию свойств класса (объект SWbemPropertySet). Только чтение. Пример использования — см. ниже скрипт, который выводит перечень всех доступных свойств, методов и квалификаторов выбранного класса WMI.
Qualifiers_ Содержит коллекцию квалификаторов класса (объект SWbemQualifierSet). Только чтение. Пример использования — см. ниже скрипт, который выводит перечень всех доступных свойств, методов и квалификаторов выбранного класса WMI.
Security_ Содержит объект SWbemSecurity, который служит для чтения и установки параметров безопасности (привилегий, уровня олицетворения и уровня аутентификации). Описание этого объекта было приведено выше в разделе «Подключение к WMI в сценариях WSH с помощью объекта SWbemLocator».
Path_ Содержит объект SWbemObjectPath, предоставляющий набор свойств и методов для получения различной информации об объекте. Пример использования:
‘подключение к пространству имён
Set objService = GetObject(«winmgmts:\\.\Root\CIMV2»)
‘получение объекта логического диска «D:»
Set colDisks = objService.ExecQuery(«Select * from Win32_LogicalDisk Where DeviceID = ‘D:’»)
For Each objDisk In colDisks
WScript.Echo objDisk.Path_.Class
WScript.Echo objDisk.Path_.Namespace
WScript.Echo objDisk.Path_.Path
WScript.Echo objDisk.Path_.Server
Next

Также существуют методы, аналогичные вышеописанным, но работающие в асинхронном режиме. Названия этих методов включают суффикс «Async»: DeleteAsync(), ExecMethodAsync_(), InstancesAsync_(), PutAsync_() и подобные. Асинхронные методы в основном похожи на вышеописанные, но включают дополнительные первый и последний параметры: в первом параметре передаётся ссылка на специальный объект SWbemSink, события которого потом обрабатываются в сценарии, а в последнем параметре — ссылка на специальный объект SWbemNamedValueSet, который используется, если делаются множественные асинхронные запросы с одним и тем же объектом SWbemSink (последний параметр необязателен и здесь не рассматривается, а его исчерпывающее описание можно найти в MSDN). Кроме того, параметр iFlags в асинхронных методах имеет несколько иной набор допустимых значений (подробнее — см. MSDN). Работа с объектом SWbemSink и способы вызова асинхронных методов описаны выше в разделе «Работа с объектом SWbemServices».

Исследование доступных пространств имён и классов с помощью сценариев WSH

Следующий сценарий выводит перечень всех доступных пространств имён WMI на указанном компьютере:

'Рекурсивная функция вывода всех подпространств имён
'в указанном пространстве имён. Параметры:
'strR  - результат (текст для вывода).
'strNS - выбранное пространство имён.
'strC  - имя компьютера.
Sub Namespace(strR, strNS, strC)
    'Формирование строки результата
    strR = strR & "    " & strNS & vbCrLf
    'Подключение к выбранному пространству имён WMI
    Set objService = GetObject("winmgmts:\\" & strC & "\" & strNS)
    'Получение коллекции подпространств имён выбранного пространства имён
    Set colNamespaces = objService.InstancesOf("__NAMESPACE")
    'Перебор коллекции
    For Each objNamespace In colNamespaces
        'Рекурсивный вызов
        Call Namespace(strR, strNS & "\" & objNamespace.Name, strC)
    Next
End Sub
'==========================================================
strComputer = "."   'имя компьютера
strRes = ""         'результат (текст для вывода)
strBeginNS = "Root" 'имя начального пространства имён
'==========================================================
Call Namespace(strRes, strBeginNS, strComputer)
WScript.Echo strRes

Следующий сценарий выводит перечень всех доступных классов выбранного пространства имён WMI:

strComputer = "."      'имя компьютера
strNS = "Root\Default" 'имя пространства имён
'==========================================================
'Подключение к выбранному пространству имён WMI
Set objService = GetObject("winmgmts:\\" & strComputer & "\" & strNS)
'Получение коллекции классов выбранного пространства имён
Set colClasses = objService.SubclassesOf()
'Перебор коллекции классов
For Each objClass In colClasses
    WScript.Echo objClass.Path_.Class
Next

Следующий сценарий выводит перечень всех доступных свойств, методов и квалификаторов выбранного класса WMI:

strComputer = "."             'имя компьютера
strNS       = "Root\CIMV2"    'имя пространства имён
strClass    = "Win32_Process" 'имя класса
'==========================================================
'Подключение к выбранному классу WMI
Set objClass = GetObject("winmgmts:\\" & strComputer & "\" & strNS & ":" & strClass)
'Перебор свойств класса
WScript.Echo "Свойства класса " & strNS & ":" & strClass
For Each objProperty In objClass.Properties_
    WScript.Echo objProperty.Name
Next
'Пустая строка (разделитель)
WScript.Echo
'Перебор методов класса
WScript.Echo "Методы класса " & strNS & ":" & strClass
For Each objMethod In objClass.Methods_
    WScript.Echo objMethod.Name
Next
'Пустая строка (разделитель)
WScript.Echo
'Перебор квалификаторов класса
WScript.Echo "Квалификаторы класса " & strNS & ":" & strClass
For Each objQualifier In objClass.Qualifiers_
    If IsArray(objQualifier.Value) Then
        WScript.Echo objQualifier.Name & " = " & Join(objQualifier.Value)
    Else
        WScript.Echo objQualifier.Name & " = " & objQualifier.Value
    End If
Next

Следующий сценарий выводит перечень всех доступных квалификаторов выбранного свойства выбранного класса WMI:

strComputer = "."             'имя компьютера
strNS       = "Root\CIMV2"    'имя пространства имён
strClass    = "Win32_Process" 'имя класса
strProperty = "Caption"       'имя свойства
'==========================================================
'Подключение к выбранному классу WMI
Set objClass = GetObject("winmgmts:\\" & strComputer & "\" & strNS & ":" & strClass)
'Перебор квалификаторов свойства
For Each objQualifier In objClass.Properties_(strProperty).Qualifiers_
    If IsArray(objQualifier.Value) Then
        WScript.Echo objQualifier.Name & " = " & Join(objQualifier.Value)
    Else
        WScript.Echo objQualifier.Name & " = " & objQualifier.Value
    End If
Next

Следующий сценарий выводит перечень всех доступных квалификаторов выбранного метода выбранного класса WMI:

strComputer = "."             'имя компьютера
strNS       = "Root\CIMV2"    'имя пространства имён
strClass    = "Win32_Process" 'имя класса
strMethod   = "Create"        'имя метода
'==========================================================
'Подключение к выбранному классу WMI
Set objClass = GetObject("winmgmts:\\" & strComputer & "\" & strNS & ":" & strClass)
'Перебор квалификаторов метода
For Each objQualifier In objClass.Methods_(strMethod).Qualifiers_
    If IsArray(objQualifier.Value) Then
        WScript.Echo objQualifier.Name & " = " & Join(objQualifier.Value)
    Else
        WScript.Echo objQualifier.Name & " = " & objQualifier.Value
    End If
Next

Создание временных потребителей событий WMI

Общие положения об обработке событий в WMI были приведены выше в разделе «Общие сведения о событиях в WMI». Здесь же будут приведены примеры скриптов, подписывающихся на события. Сценарии, являющиеся временными потребителями событий WMI, должны произвести подписку на нужные события, после чего данные сценарии начнут получать извещения о наступлении этих событий. После завершения работы временного потребителя событий ни одно из зарегистрированных в нём событий больше не обрабатывается.

Пример скрипта, обрабатывающего событие изменения состояния (запуск-останов) какой-либо службы Windows:

'подключение к пространству имён
Set objService = GetObject("winmgmts:\\.\Root\CIMV2")
'подписка на событие изменения состояния службы
Set objEventSource = objService.ExecNotificationQuery( _
"SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Service'")
'получение извещения о событии
Set objEvent = objEventSource.NextEvent
'обработка события
If objEvent.TargetInstance.State <> objEvent.PreviousInstance.State Then
	WScript.Echo Date & " " & Time & vbCrLf & _
	             objEvent.TargetInstance.DisplayName & vbCrLf & _
	             "Текущее состояние: " & objEvent.TargetInstance.State & vbCrLf & _
	             "Предыдущее состояние: " & objEvent.PreviousInstance.State
End If

Чтобы проверить работу скрипта, запустите скрипт, а затем запустите или остановите какую-нибудь службу, например MSSQLSERVER. После запуска скрипт начнёт ожидать событие. При наступлении события скрипт обработает его и завершит работу.

Запрос на языке WQL, осуществляющий подписку на событие, выполняется с помощью специального метода ExecNotificationQuery() объекта SWbemServices. Метод возвращает ссылку на объект SWbemEventSource. Вызов метода NextEvent() объекта SWbemEventSource приводит к ожиданию события и возврату в конечном итоге объекта SWbemObject, который содержит описание события. В данном случае свойства PreviousInstance и TargetInstance этого объекта представляют из себя также объекты SWbemObject, которые описывают предыдущее и текущее состояние управляемого ресурса.

Ключевое слово «WITHIN» языка запросов WQL определяет временной интервал опроса о наступлении события (в нашем примере — 5 секунд). Ключевое слово «ISA» языка запросов WQL определяет имя целевого класса (в нашем примере — «Win32_Service»). Мы использовали в запросе класс __InstanceModificationEvent, поскольку нас интересовало событие модификации экземпляра класса (существуют также классы __InstanceCreationEvent и __InstanceDeleionEvent, отвечающие за создание и удаление экземпляра класса).

Подписка на событие была произведена в полусинхронном режиме, т.к. третий параметр метода ExecNotificationQuery() (параметр iFlags, который был опущен) имеет значение по умолчанию, равное 16+32.

Метод ExecNotificationQuery() объекта SWbemServices имеет следующий синтаксис:

ExecNotificationQuery(strQuery, [strQueryLanguage = «WQL»], [iFlags = (16+32)], [objWbemNamedValueSet = null])

Параметры:

  • strQuery — строка, текст запроса на языке WQL.
  • strQueryLanguage — язык запроса. Если задан, должен быть всегда равен «WQL».
  • iFlags — опции, комбинация флагов. Возможные значения:
    • wbemFlagReturnImmediately(16) — немедленный возврат результата (полусинхронный режим).
    • wbemFlagForwardOnly(32) — возвращает коллекцию типа forward-only (навигация только вперёд). Максимальная производительность и экономия памяти.
  • objWbemNamedValueSet — объект SWbemNamedValueSet, элементы которого представляют контекстную информацию, которая может использоваться провайдером, который обслуживает запрос. Провайдер, который поддерживает или требует такую информацию, должен документировать имена и типы данных возможных значений. Как правило, этот параметр остаётся пустым.

Обработка событий может производиться и в асинхронном режиме:

'время выполнения скрипта в секундах, после чего скрипт будет остановлен
WScript.Timeout = 3600
'подключение к пространству имён
Set objService = GetObject("winmgmts:\\.\Root\CIMV2")
'создание объекта SWbemSink
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
'подписка на событие изменения состояния службы
Call objService.ExecNotificationQueryAsync(objSink, _
"SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Service'")
'приостанавливаем выполнение сценария
While 1=1
	WScript.Sleep 1000
Wend
'**************************************************************************************************
Sub Sink_OnObjectReady(objEvent, objContext)
	If objEvent.TargetInstance.State <> objEvent.PreviousInstance.State Then
		WScript.Echo Date & " " & Time & vbCrLf & _
		             objEvent.TargetInstance.DisplayName & vbCrLf & _
		             "Текущее состояние: " & objEvent.TargetInstance.State & vbCrLf & _
		             "Предыдущее состояние: " & objEvent.PreviousInstance.State
	End If
End Sub

Работа с объектом SWbemSink и обработка его событий, а также отличия асинхронных методов (с суффиксом «Async») от «обычных» методов были рассмотрены в предыдущих разделах, поэтому здесь останавливаться на этом не будем. По вышеприведённому скрипту остаётся только добавить, что он будет обрабатывать события в течение часа, после чего его работа будет автоматически завершена.

Создание постоянных потребителей событий WMI

Общие положения об обработке событий в WMI были приведены выше в разделе «Общие сведения о событиях в WMI». Здесь же будет приведён пример скрипта, создающего постоянного потребителя событий.

Для постоянной обработки событий WMI нужно выполнить три операции:

  • Зарегистрировать нужный фильтр событий.
  • Зарегистрировать потребителя событий.
  • Установить связь между фильтром и потребителем.

Для регистрации своего фильтра событий нужно создать новый экземпляр класса __EventFilter и заполнить его свойства Query, QueryLanguage и Name. Постоянный потребитель событий должен быть представлен экземпляром одного из потомков класса __EventConsumer. В приведённом ниже скрипте создаётся экземпляр класса LogFileEventConsumer, который позволяет производить запись в текстовый файл. Установка связи между фильтром и потребителем осуществляется путём создания экземпляра ассоциативного класса __FilterToConsumerBinding. В свойства Filter и Consumer экземпляра этого класса записываются «пути» объекта-фильтра и объекта-потребителя (объекты SWbemObjectPath, хранящиеся в свойстве Path_ этих объектов). Создадим постоянного потребителя событий, который будет отслеживать изменения состояний (запуск-останов) служб Windows. Текст скрипта:

'подключение к пространству имён
Set objService = GetObject("winmgmts:\\.\Root\CIMV2")
'создание экземпляра класса __EventFilter (фильтр событий)
Set objFilter = objService.Get("__EventFilter").SpawnInstance_()
'установка свойств фильтра событий
objFilter.Name = "MonitoringServices"
objFilter.QueryLanguage = "WQL"
objFilter.Query = "SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Service'"
'запись фильтра событий
objFilter.Put_
'создание экземпляра класса LogFileEventConsumer (потребитель событий)
Set objConsumer = objService.Get("LogFileEventConsumer").SpawnInstance_()
'установка свойств потребителя событий
objConsumer.Name = "ServiceLog"
objConsumer.FileName = "C:\ServiceLog.txt"
objConsumer.Text = "Service: %TargetInstance.DisplayName%, state: %TargetInstance.State%."
'запись потребителя событий
objConsumer.Put_
'**************************************************************************************************
Set objFilter = objService.Get("__EventFilter.Name=""MonitoringServices""")
Set objConsumer = objService.Get("LogFileEventConsumer.Name=""ServiceLog""")
'создание экземпляра класса __FilterToConsumerBinding (связка)
Set objBinding = objService.Get("__FilterToConsumerBinding").SpawnInstance_()
'установка свойств связки
objBinding.Filter = objFilter.Path_
objBinding.Consumer = objConsumer.Path_
'запись связки
objBinding.Put_

В строке, записываемой в свойство Text экземпляра класса LogFileEventConsumer, присутствуют шаблонные символы «%». В место строки, ограниченное этими символами, при выполнении скрипта будут подставлены значения, возвращаемые кодом, который содержится между символами «%». Таким образом, можно сказать, что свойство Text класса LogFileEventConsumer поддерживает шаблонные символы. Примечание: если у какого-либо свойства имеется квалификатор Template со значением True, то это свойство поддерживает шаблонные символы.

Ещё одно важное замечание: по умолчанию не все стандартные классы устанавливаются в репозиторий CIM. Для использования стандартных классов постоянных потребителей (например, LogFileEventConsumer), скорее всего, придётся сначала установить их. MOF-файлы с описанием этих классов находятся в каталоге %SystemRoot%\system32\Wbem\. Скомпилировать эти файлы можно с помощью утилиты mofcomp.exe. Пример команды компиляции:

mofcomp -N:root\cimv2 %SystemRoot%\system32\Wbem\Wbemcons.mof

Текст скрипта, который удаляет фильтр событий и постоянного потребителя событий WMI, созданные в предыдущем скрипте:

'подключение к пространству имён
Set objService = GetObject("winmgmts:\\.\Root\CIMV2")
'получение нужных экземпляров
Set objFilter = objService.Get("__EventFilter.Name=""MonitoringServices""")
Set objConsumer = objService.Get("LogFileEventConsumer.Name=""ServiceLog""")
'удаление полученных экземпляров
objFilter.Delete_
objConsumer.Delete_
Exit mobile version