Учимся составлять команды для сжатого описания управляемых объектов WMI


Технология WMI (Windows Management Instrumentation) располагает двумя раздельными механизмами для связи с WMI и считывания системной информации в WMI-сценарии: объект SWbemLocator библиотеки WMI Scripting Library и WMI-моникер, "winmgmts:". Моникер считается более мощным средством, так как позволяет единственной строкой описать считываемый и подлежащий управлению WMI-объект или набор WMI-объектов. Обратной стороной медали оказались трудности при построении сложных строк WMI-моникеров. В данной статье рассматриваются компоненты, используемые для построения WMI-моникеров, и некоторые удачные приемы для составления WMI-сценариев с применением WMI-моникеров.

Я надеюсь, что читателям известны основные принципы и термины WMI. Быстро ознакомиться с WMI можно, прочитав статьи, перечисленные во врезке "В предыдущих выпусках".

ЧТО ТАКОЕ МОНИКЕР?

Прежде чем углубиться в рассмотрение индивидуальных компонентов, используемых для построения строк WMI-моникеров, необходимо дать точное определение моникеру, так как этот термин незнаком многим системным администраторам. Термин "моникер" заимствован из COM-программирования. Моникер - это строка, иначе называемая отображаемым именем (display name), содержащая информацию о местонахождении и отличительных признаках объекта, экземпляр которого требуется создать в сценарии. Для программистов, работающих исключительно с COM, моникер - просто еще один программный идентификатор (ProgID), связанный с идентификатором класса (CLSID), который в свою очередь указывает на DLL, содержащую целевой объект программирования. Подобно всем другим объектам программирования, экземпляры которых могут быть созданы в сценариях, вся регистрационная информация о WMI-моникере удобно сохранена в ветви реестра HKEY_CLASSES_ROOT.

Синтаксис моникера зависит от конкретной реализации. Это значит, что разработчики технологии программирования определяют синтаксис, структуру и поведение любого моникера, распознаваемого и функционирующего в рамках данной технологии. Например, Microsoft Active Directory Service Interfaces (ADSI) и WMI. В обеих технологиях моникеры используются для описания объектов в сценариях. Однако в каждой из этих технологий применяется особый стиль и синтаксис. Строка моникера ADSI содержит полезные сведения для службы каталогов. В строке WMI собрана самая разнообразная системная информация. Для системного администратора моникер - просто строка, переданная функции GetObject сценария VBScript. Содержимое строки определяет, какая информация будет передана вызывающему сценарию, а эти данные, в свою очередь, управляют контекстом, в котором моникер может использоваться в сценарии.

Можно составить WMI-моникер, извлекающий ссылку на объект SWbemServices библиотеки WMI Scripting Library для вызова одного из методов SWbemServices (например, ExecQuery, Get, InstancesOf). Можно построить моникер, который передаст ссылку на SWbemObjectSet, представляющий собой набор объектов WMI для управления. Можно создать моникер, возвращающий ссылку на конкретный объект SWbemObject. То обстоятельство, что синтаксис WMI-моникера позволяет извлекать объекты всех этих типов, доказывает, что моникеры - мощные и в то же время гибкие средства.

ОСНОВЫ WMI-МОНИКЕРОВ

WMI-моникеры могут состоять из трех частей: одного обязательного и двух факультативных компонентов. Обязательный компонент - префикс "winmgmts:". Все WMI-моникеры должны начинаться с "winmgmts:", как в следующем операторе:


Set wmiServices =_
  GetObject("winmgmts:")

В данном случае моникер представляет собой строку "winmgmts:", переданную функции GetObject сценария VBScript. В данном примере все символы строки - строчные, но можно использовать любой регистр. Записи "WinMgmts:", "WINMGMTS:" и "winmgmts:" равнозначны.

WMI-моникер простейшего формата состоит исключительно из префикса "winmgmts:". Он всегда указывает на объект SWbemServices библиотеки WMI Scripting Library, обеспечивающий связь со службой WMI на локальном компьютере. Моникер "winmgmts:" неявно отображается на раздел HKEY_CLASSES_ROOT\WINMGMTS, отображаемый на HKEY_CLASSES_ROOT\CLSID\{172BDDF8-CEEA-11D1-8B05-00600806D9B6}, который в свою очередь указывает на C:\winnt\system32\wbem\wbemdisp.dll, файл, содержащий библиотеку WMI Scripting Library.

Создав этот указатель, можно вызвать один из методов SWbemServices, чтобы углубиться в WMI Scripting Object Model, как показано в Листинге 1. В данном примере моникер "winmgmts:" используется для инициализации переменной с именем wmiServices. Затем wmiServices вызывает метод InstanceOf, предоставленный объектом SWbemServices. Данный пример совершенно корректен, но в действительности для извлечения всех экземпляров Win32_LogicalDisk не нужны две строки. Эту задачу можно решить с помощью одной строки сценария, показанной в Листинге 2.

В Листинге 2 использована способность моникера "winmgmts:" немедленно вызвать метод SWbemServices InstanceOf, который возвратит объект SWbemServices. В обоих примерах будут получены одинаковые результаты в виде набора объектов SWbemObjectSet, содержащего все экземпляры класса Win32_LogicalDisk на локальном компьютере. С таким же успехом можно вызвать метод SWbemServices ExecQuery или любой другой метод, предоставляемый объектом SWbemServices. В действительности, если цель сценария заключается в том, чтобы просто перечислить и отобразить все экземпляры Win32_LogicalDisk, то достаточно операторов, показанных в Листинге 3. Поняв основные связи WMI-моникера с библиотекой WMI Scripting Library, можно приступать к составлению мощных и кратких операторов WMI.

ПАРАМЕТРЫ БЕЗОПАСНОСТИ WMI

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

  • уровень имперсонализации, например,
    "winmgmts:{impersonationLevel=Value}"
  • уровень аутентификации, например,
    "winmgmts:{authenticationLevel=Value}"
  • источник аутентификации, например,
    "winmgmts:{authority=ntlmdomain:DomainName} или "winmgmts:{authority=kerberos:DomainName\ServerName}"
  • назначение или снятие полномочий, например,
    "winmgmts:{Security,!RemoteShutdown)}"

    Первые два параметра, impersonationLevel и authenticationLevel, не относятся к числу уникальных особенностей WMI, а заимствованы из модели DCOM (Distributed COM). DCOM используется для доступа к инфраструктуре WMI на удаленных компьютерах. В контексте WMI имперсонализация управляет уровнем взаимодействия сценария и удаленной WMI-службы при выполнении функции. DCOM обеспечивает четыре уровня имперсонализации: Anonymous, Identify, Impersonate и Delegate.

    В режиме Anonymous полномочия скрываются, а на уровне Identify удаленному объекту разрешено запросить их; ни один из этих уровней не обеспечивает имперсонализации удаленным объектом контекста безопасности пославшего запрос пользователя. Сценарии WMI, в которых для доступа к удаленным компьютерам используется один из этих двух режимов, как правило, завершаются неудачно. Значение Impersonate позволяет удаленной службе WMI использовать контекст безопасности обратившегося пользователя для выполнения запрошенной операции. Удаленный запрос WMI со значением Impersonate обычно выполняется успешно, если пользователь имеет соответствующие полномочия. На уровне Delegate удаленная служба WMI передает полномочия запросившего пользователя другим объектам и, как правило, этот вариант считается рискованным.

    Параметр impersonationLevel иногда вызывает путаницу, так как выбираемый по умолчанию режим имперсонализации WMI зависит от версии WMI на целевом компьютере. В версиях WMI, предшествовавших версии 1.5, параметру impersonationLevel по умолчанию присваивается значение Identify. В результате сценарии WMI, устанавливающие соединение с удаленным компьютером, содержат в любой строке моникера запись impersonationLevel=Identify. В WMI 1.5 для Windows 2000, принимаемое по умолчанию значение параметра impersonationLevel изменено на Impersonate. Отыскать и изменить этот параметр можно в подразделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ WBEM\Scripting\Default Impersonation Level.

    Если сценарии WMI связаны только с компьютерами, имеющими WMI версии 1.5, то нет нужды явно задавать значение impersonationLevel=Impersonate. Однако если эта запись отсутствует, то сценарии, обращающиеся к компьютерам с ранними версиями WMI, будут выполняться неверно. Для совместимости с прежними и, возможно, будущими версиями WMI необходимо всегда явно указывать значение impersonationLevel.

    Параметр authenticationLevel позволяет запросить уровень аутентификации и конфиденциальности DCOM, который должен быть назначен соединению WMI. Семь допустимых значений - Default, None, Connect, Call, Pkt, PktIntegrity и PktPrivacy. DCOM не обязательно предоставит запрошенное значение. Например, локальные соединения используют параметр authenticationLevel=PktPrivacy.

    Параметр authority указывает протокол безопасности, используемый WMI для аутентификации соединения WMI. Можно выбрать NT LAN Manager (NTLM) или Kerberos. Чтобы использовать NTLM, следует указать authority=ntlmdomain: DomainName, где DomainName идентифицирует действительное имя домена NTLM. Для перехода к Kerberos нужно записать authority=kerberos: DomainName\ServerName. Параметр authority нельзя указывать в WMI-моникерах, обращающихся к локальному компьютеру.

    Последний параметр безопасности дает возможность назначать или отменять полномочия в строке WMI-моникера. Например, можно назначить себе привилегию Security для доступа к журналу Windows 2000 или Windows NT Security. Разрешается переопределять следующие полномочия:

    CreateToken, PrimaryToken, LockMemory, IncreaseQuota, MachineAccount, Tcb, Security, TakeOwnership, LoadDriver, SystemProfile, SystemTime, ProfileSingleProcess, IncreaseBasePriority, CreatePagefile, CreatePermanent, Backup, Restore, ShutDown, Debug, Audit, SystemEnvironment, ChangeNotify, RemoteShutDown, Udock, SyncAgent и EnableDelegation.

    Чтобы предоставить пользователю полномочия, следует указать его имя. Для отмены полномочий нужно поставить перед именем восклицательный знак (!).

    В Листинге 4 показан общий формат, используемый для ввода значений параметров безопасности в моникерах WMI. Компонент безопасности следует немедленно за двоеточием (:) в префиксе "winmgmts:" и заключен в скобки. Несколько параметров необходимо разделить запятыми; переопределяемые полномочия следует дополнительно выделить скобками и также разделить запятыми.

    ПУТЬ К ОБЪЕКТУ WMI

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

  • удаленный компьютер;
  • пространство имен WMI;
  • класс CIM (Common Information Model) в пространстве имен;
  • конкретные экземпляры класса CIM в пространстве имен.

    Формат пути к объекту слегка меняется в зависимости от того, указана ли определенная часть компонента безопасности. Если параметры безопасности указаны, то путь к объекту следует за закрывающей скобкой компонента безопасности и отделяется от него восклицательным знаком, как показывает оператор в Листинге 5. Если параметры безопасности опущены, то путь к объекту следует за двоеточием префикса "winmgmts:" без восклицательного знака, как показано в Листинге 6.

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

    - WMI устанавливает связь с локальным компьютером, если имя целевого компьютера не указано или вместо него стоит точка (.) (например, "winmgmts://./root/cimv2"). Если целевое пространство имен опущено, то WMI обращается к принимаемому по умолчанию пространству имен, которое указано в подразделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ WBEM\Scripting\Default Namespace. Принимаемое по умолчанию пространство имен для сценариев - root/cimv2. Изменить это значение можно на закладке Advanced оснастки WMI Control консоли Microsoft Management Console (MMC).
    - Нельзя опускать целевое пространство имен в WMI-моникерах, в которых приведено имя целевого компьютера и имя класса CIM.
    - Значения, используемые для идентификации конкретных экземпляров класса, должны соответствовать разделу класса CIM. Например, раздел для класса Win32_LogicalDisk - DeviceID. Таким образом, при идентификации конкретного экземпляра класса Win32_LogicalDisk необходимо указать соответствующее значение для свойства DeviceID. Чтобы определить разделы класса CIM, следует воспользоваться программой wbemtest.exe или WMI CIM Studio, или просмотреть файл Managed Object Format (MOF), содержащий определение соответствующего класса.

    КАК РАБОТАТЬ С МОНИКЕРАМИ

    Несколько важных замечаний о работе с WMI-моникерами и их компонентами:

    1. Всегда явно указывайте значение impersonationLevel. Не полагайтесь на значение Default Impersonation Level в разделе реестра.
    2. Всегда явно идентифицируйте целевое пространство имен, не полагаясь на подраздел реестра Default NameSpace. Если принимаемое по умолчанию значение будет изменено без вашего ведома, то последствия будут самыми серьезными.
    3. Если сценарий извлекает данные из нескольких CIM-классов, создайте одну ссылку на объект SWbemServices и многократно используйте ее.
    4. Если необходимо указать имя пользователя и пароль, то WMI-моникер применять нельзя. Вместо него следует использовать объект SWbemLocator библиотеки WMI Scripting Library.

    Более подробную информацию о WMI-моникере можно получить в библиотеке Microsoft Developer Network (MSDN) Online Library по адресам: http://msdn.microsoft.com/library/ psdk/wmisdk/scintro_6tpv.htm и http://msdn.microsoft.com/library/ psdk/wmisdk/hmmapp_2z8z.htm. Здесь вы найдете полезную информацию и многочисленные примеры моникеров, которые можно использовать в практических сценариях.


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