Командная строка и сценарии Windows

Сценарии WSH для работы с объектной моделью WMI

Разбить на страницы
Показывать лекцию целиком

Сценарии WSH для работы с объектной моделью WMI

Здесь мы подробно остановимся на механизме работы подобных сценариев, в основе которого лежит библиотека поддержки сценариев WMI (WMI Scripting Library), а также рассмотрим на примерах все основные типы сценариев WMI.

Сразу отметим, что все сценарии данной лекции написаны на языке VBScript, который позволяет напрямую работать с выходными параметрами методов объектов WMI, а также обрабатывать элементы коллекций без создания дополнительного объекта Enumerator.

Объектная модель библиотеки поддержки сценариев WMI

Итак, для того чтобы получить доступ к WMI с помощью сценариев, необходима специальная библиотека поддержки сценариев WMI (WMI Scripting Library), которая располагается в файле wbemdisp.dll в каталоге %SystemRoot%\System32\Wbem (в Windows Server 2003, Windows XP, Windows 2000 и Windows NT) или в каталоге %WinDir%\System\Wbem (в Windows Me и Windows 9x). В этой библиотеке определяются несколько связанных друг с другом объектов–серверов автоматизации (например, в Windows XP и Windows Server 2003 число этих объектов равно двадцати четырем), позволяющих из сценария осуществить авторизованное подключение к службе WMI на локальном или удаленном компьютере и получить доступ к классам и объектам из определенного пространства имен.

При этом связь между репозиторием CIM и объектами библиотеки поддержки сценариев WMI реализована следующим образом: после подключения к службе WMI и получения с помощью этих объектов доступа к экземпляру управляемого ресурса WMI, из сценария становится возможным напрямую использовать все свойства и методы, описанные в соответствующем этому ресурсу классе CIM, как если бы эти свойства и методы были частью библиотеки поддержки сценариев WMI. Это достигается с помощью полиморфного объекта SWbemObject, который может представлять либо экземпляр управляемого ресурса WMI, либо определение класса WMI. Полиморфным этот объект называется из-за того, что набор его свойств зависит от управляемого ресурса (класса CIM), которому он сопоставлен. Например, для класса Win32_Process объект SWbemObject будет среди прочих иметь свойства Handle и ExecutionState, а для класса Win32_Service — свойства ServiceType и StartMode.

В таблице 12.1 кратко описаны основные объекты библиотеки поддержки сценариев WMI, которые мы будем наиболее часто использовать в наших примерах.

Основные объекты библиотеки поддержки сценариев WMI
Объект Описание
SWbemLocator Используется для установления связи с пространством имен WMI на локальном или удаленном компьютере. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта WScript
SWbemServices Позволяет выполнять действия над классами и объектами в пространстве имен WMI (создание, получение доступа, изменение и удаление классов или экземпляров классов). В языках VBScript и JScript создается с помощью функции GetObject, в WSH — с помощью метода GetObject объекта WScript
SWbemObjectSet Коллекция объектов SWbemObject, которая может быть получена путем вызова методов других объектов библиотеки поддержки сценариев WMI (например, методов ExecQuery или InstancesOf объекта SWbemservices )
SWbemObject Представляет либо экземпляр управляемого ресурса WMI, либо определение класса WMI. В языках VBScript и JScript создается с помощью функции GetObject, в WSH — с помощью метода GetObject объекта Wscript
SWbemMethodSet Коллекция объектов SWbemMethod. Хранится в свойстве Methods_ соответствующего объекта SWbemObject, не может быть создана в сценарии напрямую с помощью CreateObject или GetObject
SWbemMethod Позволяет получить описание метода объекта WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
SWbemPropertySet Коллекция объектов SWbemProperty. Хранится в свойстве Properties_ соответствующего объекта SWbemObject, не может быть создана в сценарии напрямую с помощью CreateObject или GetObject
SWbemProperty Представляет одно свойство управляемого объекта WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
SWbemQualifierSet Коллекция объектов SWbemQualifier. Хранится в свойстве Qualifiers_ соответствующего объекта SWbemObject, SWbemProperty или SWbemMethod. Эта коллекция не может быть создана в сценарии напрямую с помощью CreateObject или GetObject
SWbemQualifier Представляет либо квалификатор класса или экземпляра класса WMI, либо квалификатор свойства или метода объекта WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
SWbemObjectPath Позволяет построить и проверить путь к объекту WMI. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта WScript
SWbemNamedValueSet Коллекция объектов SWbemNamedValue. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта Wscript
SWbemNamedValue Используется для передачи дополнительной информации при некоторых вызовах WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
SWbemLastError Содержит расширенную информацию о произошедшей ошибке WMI. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта Wscript
SWbemSecurity Позволяет читать или записывать информацию об установках безопасности для определенного объекта WMI. Хранится в свойстве Security_ объектов SWbemLocator, SWbemServices, SWbemObjectSet, SWbemObject, SWbemObjectPath, SWbemLastError, SWbemEventSource
SWbemPrivilegeSet Коллекция объектов SWbemPrivilege. Хранится в свойстве Privileges объекта WbemSecurity
SWbemPrivilege Позволяет установить или удалить привилегию, необходимую для доступа к объекту WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
SWbemEventSource Соответствует событию WMI, которое задается с помощью метода ExecNotificationQuery объекта SWbemServices. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
SWbemSink Используется для получения результатов выполнения асинхронных методов. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта Wscript

Соединение с подсистемой WMI

Первым шагом при работе с WMI из сценария является получение доступа к подсистеме WMI на локальном или удаленном компьютере. Для этого существуют два различных варианта: с использованием объекта SWbemLocator и с помощью так называемого WMI-моникера (WMI moniker) "WinMgmts:".

Соединение с помощью объекта SWbemLocator

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

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

Set objSWbemLocator = CreateObject
 ("WbemScripting.SWbemLocator")

Единственный имеющийся у SWbemLocator метод ConnectServer позволяет подключиться к службе WMI на указанном компьютере и получить ссылку на соответствующий объект SWbemServices. Имя компьютера, с которым следует произвести соединение, указывается в качестве первого параметра этого метода, а имя пространства имен WMI — в качестве второго. Например, чтобы подключиться к пространству имен Root\CIMV2 на компьютере POPOV, в сценарии следует выполнить следующие строки:

Set objLocator = CreateObject
  ("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer
  ("POPOV", "Root\CIMV2")

При этом будет произведена попытка соединения от имени текущей учетной записи. В качестве третьего и четвертого параметров метода ConnectServer можно при необходимости указать имя пользователя и пароль для связи с нужным пространством имен. Например, для подключения к пространству имен Root\CIMV2 на компьютере POPOV от имени учетной записи Popov домена Domain1 с паролем MyPassword, в сценарии следует выполнить следующие строки:

Set objLocator = CreateObject
  ("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer
 ("POPOV", "Root\CIMV2", "Domain1\Popov", "MyPassword")

Естественно, можно не указывать явно пароль в тексте сценария, а вводить его с клавиатуры в какую-либо переменную, которую затем подставить в метод ConnectServer. Напомним, что для ввода строки с клавиатуры в консольном режиме выполнения сценариев используются стандартные входной и выходной потоки WScript.StdIn и WScript.StdOut, а в графическом режиме — функция InputBox() языка VBScript. Кроме этого, в Windows XP и Windows Server 2003 имеется объект ScriptPW, позволяющий выполнять ввод текста с клавиатуры в консольном режиме без дублирования вводимых символов на экране. В листинге 12.1 приведен сценарий InputPassw.vbs (запускать этот сценарий нужно обязательно с помощью cscript.exe), в котором запрашивается пароль пользователя и производится соединение со службой WMI на удаленном компьютере с использованием этого пароля, после чего на экран выводится описание роли компьютера в домене (при этом сам введенный пароль на экране не отображается).

'*******************************************************************
' Имя: InputPassw.vbs
' Язык: VBScript
' Описание: Ввод пароля без отображения на экране для соединения 
'           с WMI на удаленном компьютере
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim strUser           ' Имя пользователя 
Dim strPassw          ' Пароль пользователя 
Dim objPassw          ' Объект ScriptPW
Dim objLocator        ' Объект SWbemLocator
Dim objService        ' Объект SWbemServices
Dim colInstances      ' Коллекция экземпляров класса WMI
Dim objInstance       ' Элемент коллекции
Dim strComputerRole   ' Роль компьютера в домене

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "POPOV"
strNamespace = "Root\CIMV2"
strClass = "Win32_ComputerSystem"
strUser = "POPOV\404_Popov"

'Создаем объект ScriptPW
Set objPassw = CreateObject("ScriptPW.Password")
' Выводим подсказку для ввода пароля
WScript.StdOut.Write "Введите пароль для "  strUser  ": "
'Вводим пароль
strPassw = objPassw.GetPassword()

'Создаем объект SWbemLocator
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
'Соединяемся с пространством имен WMI от имени заданной учетной записи
Set objService = objLocator.ConnectServer(strComputer, strNamespace, strUser, strPassw)

' Создаем коллекцию экземпляров класса Win32_ComputerSystem
Set colInstances = objService.InstancesOf(strClass)

' Перебираем элементы коллекции 
For Each objInstance In colInstances
    ' Определяем описание роли
    Select Case objInstance.DomainRole 
        Case 0 
            strComputerRole = "Standalone Workstation"
        Case 1        
            strComputerRole = "Member Workstation"
        Case 2
            strComputerRole = "Standalone Server"
        Case 3
            strComputerRole = "Member Server"
        Case 4
            strComputerRole = "Backup Domain Controller"
        Case 5
            strComputerRole = "Primary Domain Controller"
    End Select
    
    ' Выводим результат на экран
    Wscript.Echo "Роль компьютера "  strComputer  ": "  strComputerRole
Next
'************************* Конец ***********************************

Соединение посредством моникера WMI

Альтернативным вариантом получения доступа к подсистеме WMI на локальном или удаленном компьютере является использование WMI-моникеров. Понятие моникер относится к COM-объектам, где под этим термином понимается строка (отображаемое имя, display name ), задающая путь к объекту, экземпляр которого должен быть создан в клиентском приложении. В контексте сценариев VBScript моникер WMI — это строка определенной структуры, передаваемая в качестве параметра функции GetObject, в результате выполнения которой возвращается ссылка на определенный объект или конкретный экземпляр объекта библиотеки поддержки сценариев WMI.

Например, можно задать WMI-моникер, извлекающий, как и при использовании метода ConnectServer объекта SWbemLocator, ссылку на объект SWbemServices. Можно построить моникер, обеспечивающий доступ к объекту SWbemObjectSet, содержащему набор объектов WMI. Наконец, с помощью моникера можно получить ссылку на конкретный экземпляр объекта SWbemObject.

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

  • WMI-моникеры по соображениям безопасности нельзя использовать внутри сценариев, встроенных в HTML-страницы;
  • обращение к подсистеме WMI с помощью моникеров происходит всегда от имени текущей учетной записи, т. е. здесь нельзя явно указать имя пользователя и пароль, как это было возможно при использовании метода ConnectServer объекта SWbemLocator.
  • Формат строки WMI-моникера похож на стандартный путь к объектам WMI. При этом моникеры могут состоять из трех частей:

  • обязательный префикс "WinMgmts:" ;
  • необязательные параметры, определяющие настройки безопасности при работе с WMI ;
  • необязательный путь к нужному объекту WMI.
  • Рассмотрим каждую из частей моникера более подробно.

    Префикс "WinMgmts:"

    Все моникеры WMI должны начинаться со строки "WinMgmts:", причем регистр символов здесь неважен, т. е. в сценарии можно писать "winmgmts:", "WINMGMTS:" и т. д. Самый простой WMI-моникер совпадает с этой строкой, позволяя получить доступ к пространству имен по умолчанию на локальном компьютере (как правило, таким пространством является Root\CIMV2):

    Set objService = GetObject("WinMgmts:")

    В переменной objService после выполнения этой строки сценария будет храниться ссылка на объект SWbemServices, причем методы объекта SWbemServices можно вызывать в той же строке, в которой записан моникер, например:

    Set colProcess = GetObject("WinMgmts:").InstancesOf("Win32_Process")

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

    Set objService = GetObject("WinMgmts:")
    Set colProcess = objService.InstancesOf("Win32_Process")

    Если перед нами стоит задача перебора коллекции, построенной с помощи WMI-моникера, то функцию GetObject() можно использовать внутри цикла For Each … In. Например, для вывода на экран названий всех процессов, запущенных в системе, достаточно выполнить сценарий, состоящий всего из трех строк:

    For Each objProcess In GetObject("WinMgmts:")
    objService.InstancesOf("Win32_Process")
      WScript.Echo objProcess.Name
    Next

    Связь WMI-моникера "WinMgmts:" с библиотекой поддержки сценариев WMI осуществляется с помощью раздела HKEY_CLASSES_ROOT\WINMGMTS, в подразделе CLSID которого записан идентификатор, указывающий, в свою очередь, на раздел HKEY_CLASSES_ROOT\CLSID\{172BDDF8-CEEA-11D1-8B05-00600806D9B6}. Раздел же HKEY_CLASSES_ROOT\CLSID\{172BDDF8-CEEA-11D1-8B05-00600806D9B6} содержит подраздел InProcserver32, значением которого по умолчанию является полный путь к файлу wbemdisp.dll, содержащему библиотеку поддержки сценариев WMI и реализующему объект SWbemServices.

    Настройки безопасности в моникере

    После префикса "WinMgmts:" в моникере WMI можно указать следующие параметры безопасности, которые будут применяться при работе с подсистемой WMI:

  • уровень олицетворения DCOM (DCOM Impersonation Level), например, "WinMgmts:{impersonationLevel=Impersonate}" ;
  • уровень проверки подлинности DCOM (DCOM Authentication Level), например, "WinMgmts:{authenticationLevel=pktPrivacy}" ;
  • источник проверки подлинности (Authority), например, "WinMgmts:{authority=NTLMDomain:Domain1}" ;
  • назначенные или отозванные привилегии, например, "WinMgmts:{(Shutdown, !RemoteShutdown)}".
  • Замечание

    Смысл и значение параметров, задающих уровень олицетворения и проверки подлинности DCOM, был объяснен ранее в разделе "Безопасность при работе с WMI" лекции 10.

    Параметр authority определяет протокол безопасности (NT LAN Manager — NTLM, или Kerberos), который будет использоваться WMI при выполнении проверки подлинности. В случае NTLM в качестве значения параметра authority задается ключевое слово NTLMDomain и имя нужного домена, например:

    "WinMgmts:{authority=NTLMDomain:Domain1}"

    Для перехода к Kerberos в моникере указыватся ключевое слово Kerberos и путь к нужному серверу, например:

    "WinMgmts:{authority=Kerberos:Domain1\Server1}"

    Замечание

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

    Последняя составная часть параметров безопасности в строке WMI-моникера позволяет назначать и отменять привилегии, необходимые для выполнения определенных задач (например, для удаленного выключения рабочей станции). Для того чтобы назначить ту или иную привилегию сценарию, нужно указать имя этой привилегии в списке. Для отмены привилегии перед ее именем ставится восклицательный знак (!). С помощью моникера WMI можно назначить или отменить следующие привилегии: 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.

    Все параметры безопасности в строке WMI-моникера следуют непосредственно за префиксом "WinMgmts:" и заключаются в фигурные скобки. Несколько параметров следует разделять запятыми, например:

    "WinMgmts:{impersonationLevel=Impersonate, 
     authenticationLevel=pktPrivacy,authority=NTLMDomain:Domain1}"

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

    "WinMgmts:{impersonationLevel=Impersonate, authenticationLevel=pktPrivacy, 
      (Shutdown, !RemoteShutdown)}"

    Путь к объекту WMI в моникере

    Напомним сначала, что любой класс или экземпляр класса WMI определяется путем к объекту WMI, который может состоять из сетевого имени компьютера, имени пространства имен, имени класса и набора ключевых свойств объекта вместе с их значениями (см. разд. "Путь к классам и объектам CIM" лекции 10).

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

    Если параметры безопасности указаны, то путь к объекту следует за закрывающей скобкой параметров безопасности и отделяется от нее восклицательным знаком. Например, следующий моникер будет в сценарии определять путь к экземпляру класса Win32_Service, у которого в ключевом свойстве Name записана строка Alerter, и который расположен в пространстве CIMV2 на компьютере с именем POPOV:

    "WinMgmts:{impersonationLevel=Impersonate}!\\POPOV\Root\CIMV2:
      Win32_Service.Name='Alerter'"

    Если же параметры безопасности в моникере опущены, то путь к объекту записывается после двоеточия в префиксе "WinMgmts:" без восклицательного знака:

    "WinMgmts:\\POPOV\Root\CIMV2:Win32_Service.Name='Alerter'"

    Замечание

    Для правильной идентификации объектов в пути к ним должны указываться имена и значения ключевых свойств (например, в классе Win32_Service таковым является свойство Name, а в классе Win32_Process — свойство Handle). Для того чтобы узнать, какое свойство у класса является ключевым, можно воспользоваться тестером WMI (wbemtest.exe) или утилитой WMI CIM Studio.

    В принципе, в WMI-моникере можно указывать не полный путь к объекту, а лишь нужные фрагменты, например "WinMgmts:\Root\CIMV2", "WinMgmts:\\POPOV" и т. п. При этом если опущено имя компьютера или вместо него стоит точка (.), то будет производиться обращение к подсистеме WMI локального компьютера. Если опущено пространство имен, то WMI будет работать с пространством имен по умолчанию, которое извлекается из подраздела HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\WBEM\Scripting\Default Namespace системного реестра рабочей станции, к которой производится обращение.

    Замечание

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

    Практически во всех приведенных далее сценариях соединение с подсистемой WMI будет производиться с помощью моникера "WinMgmts:".

    Страницы:

    Сценарии WSH для работы с объектной моделью WMI

    Здесь мы подробно остановимся на механизме работы подобных сценариев, в основе которого лежит библиотека поддержки сценариев WMI (WMI Scripting Library), а также рассмотрим на примерах все основные типы сценариев WMI.

    Сразу отметим, что все сценарии данной лекции написаны на языке VBScript, который позволяет напрямую работать с выходными параметрами методов объектов WMI, а также обрабатывать элементы коллекций без создания дополнительного объекта Enumerator.

    Объектная модель библиотеки поддержки сценариев WMI

    Итак, для того чтобы получить доступ к WMI с помощью сценариев, необходима специальная библиотека поддержки сценариев WMI (WMI Scripting Library), которая располагается в файле wbemdisp.dll в каталоге %SystemRoot%\System32\Wbem (в Windows Server 2003, Windows XP, Windows 2000 и Windows NT) или в каталоге %WinDir%\System\Wbem (в Windows Me и Windows 9x). В этой библиотеке определяются несколько связанных друг с другом объектов–серверов автоматизации (например, в Windows XP и Windows Server 2003 число этих объектов равно двадцати четырем), позволяющих из сценария осуществить авторизованное подключение к службе WMI на локальном или удаленном компьютере и получить доступ к классам и объектам из определенного пространства имен.

    При этом связь между репозиторием CIM и объектами библиотеки поддержки сценариев WMI реализована следующим образом: после подключения к службе WMI и получения с помощью этих объектов доступа к экземпляру управляемого ресурса WMI, из сценария становится возможным напрямую использовать все свойства и методы, описанные в соответствующем этому ресурсу классе CIM, как если бы эти свойства и методы были частью библиотеки поддержки сценариев WMI. Это достигается с помощью полиморфного объекта SWbemObject, который может представлять либо экземпляр управляемого ресурса WMI, либо определение класса WMI. Полиморфным этот объект называется из-за того, что набор его свойств зависит от управляемого ресурса (класса CIM), которому он сопоставлен. Например, для класса Win32_Process объект SWbemObject будет среди прочих иметь свойства Handle и ExecutionState, а для класса Win32_Service — свойства ServiceType и StartMode.

    В таблице 12.1 кратко описаны основные объекты библиотеки поддержки сценариев WMI, которые мы будем наиболее часто использовать в наших примерах.

    Основные объекты библиотеки поддержки сценариев WMI
    Объект Описание
    SWbemLocator Используется для установления связи с пространством имен WMI на локальном или удаленном компьютере. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта WScript
    SWbemServices Позволяет выполнять действия над классами и объектами в пространстве имен WMI (создание, получение доступа, изменение и удаление классов или экземпляров классов). В языках VBScript и JScript создается с помощью функции GetObject, в WSH — с помощью метода GetObject объекта WScript
    SWbemObjectSet Коллекция объектов SWbemObject, которая может быть получена путем вызова методов других объектов библиотеки поддержки сценариев WMI (например, методов ExecQuery или InstancesOf объекта SWbemservices )
    SWbemObject Представляет либо экземпляр управляемого ресурса WMI, либо определение класса WMI. В языках VBScript и JScript создается с помощью функции GetObject, в WSH — с помощью метода GetObject объекта Wscript
    SWbemMethodSet Коллекция объектов SWbemMethod. Хранится в свойстве Methods_ соответствующего объекта SWbemObject, не может быть создана в сценарии напрямую с помощью CreateObject или GetObject
    SWbemMethod Позволяет получить описание метода объекта WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
    SWbemPropertySet Коллекция объектов SWbemProperty. Хранится в свойстве Properties_ соответствующего объекта SWbemObject, не может быть создана в сценарии напрямую с помощью CreateObject или GetObject
    SWbemProperty Представляет одно свойство управляемого объекта WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
    SWbemQualifierSet Коллекция объектов SWbemQualifier. Хранится в свойстве Qualifiers_ соответствующего объекта SWbemObject, SWbemProperty или SWbemMethod. Эта коллекция не может быть создана в сценарии напрямую с помощью CreateObject или GetObject
    SWbemQualifier Представляет либо квалификатор класса или экземпляра класса WMI, либо квалификатор свойства или метода объекта WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
    SWbemObjectPath Позволяет построить и проверить путь к объекту WMI. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта WScript
    SWbemNamedValueSet Коллекция объектов SWbemNamedValue. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта Wscript
    SWbemNamedValue Используется для передачи дополнительной информации при некоторых вызовах WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
    SWbemLastError Содержит расширенную информацию о произошедшей ошибке WMI. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта Wscript
    SWbemSecurity Позволяет читать или записывать информацию об установках безопасности для определенного объекта WMI. Хранится в свойстве Security_ объектов SWbemLocator, SWbemServices, SWbemObjectSet, SWbemObject, SWbemObjectPath, SWbemLastError, SWbemEventSource
    SWbemPrivilegeSet Коллекция объектов SWbemPrivilege. Хранится в свойстве Privileges объекта WbemSecurity
    SWbemPrivilege Позволяет установить или удалить привилегию, необходимую для доступа к объекту WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
    SWbemEventSource Соответствует событию WMI, которое задается с помощью метода ExecNotificationQuery объекта SWbemServices. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject
    SWbemSink Используется для получения результатов выполнения асинхронных методов. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта Wscript

    Соединение с подсистемой WMI

    Первым шагом при работе с WMI из сценария является получение доступа к подсистеме WMI на локальном или удаленном компьютере. Для этого существуют два различных варианта: с использованием объекта SWbemLocator и с помощью так называемого WMI-моникера (WMI moniker) "WinMgmts:".

    Соединение с помощью объекта SWbemLocator

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

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

    Set objSWbemLocator = CreateObject
     ("WbemScripting.SWbemLocator")

    Единственный имеющийся у SWbemLocator метод ConnectServer позволяет подключиться к службе WMI на указанном компьютере и получить ссылку на соответствующий объект SWbemServices. Имя компьютера, с которым следует произвести соединение, указывается в качестве первого параметра этого метода, а имя пространства имен WMI — в качестве второго. Например, чтобы подключиться к пространству имен Root\CIMV2 на компьютере POPOV, в сценарии следует выполнить следующие строки:

    Set objLocator = CreateObject
      ("WbemScripting.SWbemLocator")
    Set objService = objLocator.ConnectServer
      ("POPOV", "Root\CIMV2")

    При этом будет произведена попытка соединения от имени текущей учетной записи. В качестве третьего и четвертого параметров метода ConnectServer можно при необходимости указать имя пользователя и пароль для связи с нужным пространством имен. Например, для подключения к пространству имен Root\CIMV2 на компьютере POPOV от имени учетной записи Popov домена Domain1 с паролем MyPassword, в сценарии следует выполнить следующие строки:

    Set objLocator = CreateObject
      ("WbemScripting.SWbemLocator")
    Set objService = objLocator.ConnectServer
     ("POPOV", "Root\CIMV2", "Domain1\Popov", "MyPassword")

    Естественно, можно не указывать явно пароль в тексте сценария, а вводить его с клавиатуры в какую-либо переменную, которую затем подставить в метод ConnectServer. Напомним, что для ввода строки с клавиатуры в консольном режиме выполнения сценариев используются стандартные входной и выходной потоки WScript.StdIn и WScript.StdOut, а в графическом режиме — функция InputBox() языка VBScript. Кроме этого, в Windows XP и Windows Server 2003 имеется объект ScriptPW, позволяющий выполнять ввод текста с клавиатуры в консольном режиме без дублирования вводимых символов на экране. В листинге 12.1 приведен сценарий InputPassw.vbs (запускать этот сценарий нужно обязательно с помощью cscript.exe), в котором запрашивается пароль пользователя и производится соединение со службой WMI на удаленном компьютере с использованием этого пароля, после чего на экран выводится описание роли компьютера в домене (при этом сам введенный пароль на экране не отображается).

    '*******************************************************************
    ' Имя: InputPassw.vbs
    ' Язык: VBScript
    ' Описание: Ввод пароля без отображения на экране для соединения 
    '           с WMI на удаленном компьютере
    '*******************************************************************
    Option Explicit
     
    ' Объявляем переменные
    Dim strComputer       ' Имя компьютера
    Dim strNamespace      ' Имя пространства имен
    Dim strClass          ' Имя класса 
    Dim strUser           ' Имя пользователя 
    Dim strPassw          ' Пароль пользователя 
    Dim objPassw          ' Объект ScriptPW
    Dim objLocator        ' Объект SWbemLocator
    Dim objService        ' Объект SWbemServices
    Dim colInstances      ' Коллекция экземпляров класса WMI
    Dim objInstance       ' Элемент коллекции
    Dim strComputerRole   ' Роль компьютера в домене
    
    '********************** Начало *************************************
    ' Присваиваем начальные значения переменным
    strComputer = "POPOV"
    strNamespace = "Root\CIMV2"
    strClass = "Win32_ComputerSystem"
    strUser = "POPOV\404_Popov"
    
    'Создаем объект ScriptPW
    Set objPassw = CreateObject("ScriptPW.Password")
    ' Выводим подсказку для ввода пароля
    WScript.StdOut.Write "Введите пароль для "  strUser  ": "
    'Вводим пароль
    strPassw = objPassw.GetPassword()
    
    'Создаем объект SWbemLocator
    Set objLocator = CreateObject("WbemScripting.SWbemLocator")
    'Соединяемся с пространством имен WMI от имени заданной учетной записи
    Set objService = objLocator.ConnectServer(strComputer, strNamespace, strUser, strPassw)
    
    ' Создаем коллекцию экземпляров класса Win32_ComputerSystem
    Set colInstances = objService.InstancesOf(strClass)
    
    ' Перебираем элементы коллекции 
    For Each objInstance In colInstances
        ' Определяем описание роли
        Select Case objInstance.DomainRole 
            Case 0 
                strComputerRole = "Standalone Workstation"
            Case 1        
                strComputerRole = "Member Workstation"
            Case 2
                strComputerRole = "Standalone Server"
            Case 3
                strComputerRole = "Member Server"
            Case 4
                strComputerRole = "Backup Domain Controller"
            Case 5
                strComputerRole = "Primary Domain Controller"
        End Select
        
        ' Выводим результат на экран
        Wscript.Echo "Роль компьютера "  strComputer  ": "  strComputerRole
    Next
    '************************* Конец ***********************************

    Соединение посредством моникера WMI

    Альтернативным вариантом получения доступа к подсистеме WMI на локальном или удаленном компьютере является использование WMI-моникеров. Понятие моникер относится к COM-объектам, где под этим термином понимается строка (отображаемое имя, display name ), задающая путь к объекту, экземпляр которого должен быть создан в клиентском приложении. В контексте сценариев VBScript моникер WMI — это строка определенной структуры, передаваемая в качестве параметра функции GetObject, в результате выполнения которой возвращается ссылка на определенный объект или конкретный экземпляр объекта библиотеки поддержки сценариев WMI.

    Например, можно задать WMI-моникер, извлекающий, как и при использовании метода ConnectServer объекта SWbemLocator, ссылку на объект SWbemServices. Можно построить моникер, обеспечивающий доступ к объекту SWbemObjectSet, содержащему набор объектов WMI. Наконец, с помощью моникера можно получить ссылку на конкретный экземпляр объекта SWbemObject.

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

  • WMI-моникеры по соображениям безопасности нельзя использовать внутри сценариев, встроенных в HTML-страницы;
  • обращение к подсистеме WMI с помощью моникеров происходит всегда от имени текущей учетной записи, т. е. здесь нельзя явно указать имя пользователя и пароль, как это было возможно при использовании метода ConnectServer объекта SWbemLocator.
  • Формат строки WMI-моникера похож на стандартный путь к объектам WMI. При этом моникеры могут состоять из трех частей:

  • обязательный префикс "WinMgmts:" ;
  • необязательные параметры, определяющие настройки безопасности при работе с WMI ;
  • необязательный путь к нужному объекту WMI.
  • Рассмотрим каждую из частей моникера более подробно.

    Префикс "WinMgmts:"

    Все моникеры WMI должны начинаться со строки "WinMgmts:", причем регистр символов здесь неважен, т. е. в сценарии можно писать "winmgmts:", "WINMGMTS:" и т. д. Самый простой WMI-моникер совпадает с этой строкой, позволяя получить доступ к пространству имен по умолчанию на локальном компьютере (как правило, таким пространством является Root\CIMV2):

    Set objService = GetObject("WinMgmts:")

    В переменной objService после выполнения этой строки сценария будет храниться ссылка на объект SWbemServices, причем методы объекта SWbemServices можно вызывать в той же строке, в которой записан моникер, например:

    Set colProcess = GetObject("WinMgmts:").InstancesOf("Win32_Process")

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

    Set objService = GetObject("WinMgmts:")
    Set colProcess = objService.InstancesOf("Win32_Process")

    Если перед нами стоит задача перебора коллекции, построенной с помощи WMI-моникера, то функцию GetObject() можно использовать внутри цикла For Each … In. Например, для вывода на экран названий всех процессов, запущенных в системе, достаточно выполнить сценарий, состоящий всего из трех строк:

    For Each objProcess In GetObject("WinMgmts:")
    objService.InstancesOf("Win32_Process")
      WScript.Echo objProcess.Name
    Next

    Связь WMI-моникера "WinMgmts:" с библиотекой поддержки сценариев WMI осуществляется с помощью раздела HKEY_CLASSES_ROOT\WINMGMTS, в подразделе CLSID которого записан идентификатор, указывающий, в свою очередь, на раздел HKEY_CLASSES_ROOT\CLSID\{172BDDF8-CEEA-11D1-8B05-00600806D9B6}. Раздел же HKEY_CLASSES_ROOT\CLSID\{172BDDF8-CEEA-11D1-8B05-00600806D9B6} содержит подраздел InProcserver32, значением которого по умолчанию является полный путь к файлу wbemdisp.dll, содержащему библиотеку поддержки сценариев WMI и реализующему объект SWbemServices.

    Настройки безопасности в моникере

    После префикса "WinMgmts:" в моникере WMI можно указать следующие параметры безопасности, которые будут применяться при работе с подсистемой WMI:

  • уровень олицетворения DCOM (DCOM Impersonation Level), например, "WinMgmts:{impersonationLevel=Impersonate}" ;
  • уровень проверки подлинности DCOM (DCOM Authentication Level), например, "WinMgmts:{authenticationLevel=pktPrivacy}" ;
  • источник проверки подлинности (Authority), например, "WinMgmts:{authority=NTLMDomain:Domain1}" ;
  • назначенные или отозванные привилегии, например, "WinMgmts:{(Shutdown, !RemoteShutdown)}".
  • Замечание

    Смысл и значение параметров, задающих уровень олицетворения и проверки подлинности DCOM, был объяснен ранее в разделе "Безопасность при работе с WMI" лекции 10.

    Параметр authority определяет протокол безопасности (NT LAN Manager — NTLM, или Kerberos), который будет использоваться WMI при выполнении проверки подлинности. В случае NTLM в качестве значения параметра authority задается ключевое слово NTLMDomain и имя нужного домена, например:

    "WinMgmts:{authority=NTLMDomain:Domain1}"

    Для перехода к Kerberos в моникере указыватся ключевое слово Kerberos и путь к нужному серверу, например:

    "WinMgmts:{authority=Kerberos:Domain1\Server1}"

    Замечание

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

    Последняя составная часть параметров безопасности в строке WMI-моникера позволяет назначать и отменять привилегии, необходимые для выполнения определенных задач (например, для удаленного выключения рабочей станции). Для того чтобы назначить ту или иную привилегию сценарию, нужно указать имя этой привилегии в списке. Для отмены привилегии перед ее именем ставится восклицательный знак (!). С помощью моникера WMI можно назначить или отменить следующие привилегии: 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.

    Все параметры безопасности в строке WMI-моникера следуют непосредственно за префиксом "WinMgmts:" и заключаются в фигурные скобки. Несколько параметров следует разделять запятыми, например:

    "WinMgmts:{impersonationLevel=Impersonate, 
     authenticationLevel=pktPrivacy,authority=NTLMDomain:Domain1}"

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

    "WinMgmts:{impersonationLevel=Impersonate, authenticationLevel=pktPrivacy, 
      (Shutdown, !RemoteShutdown)}"

    Путь к объекту WMI в моникере

    Напомним сначала, что любой класс или экземпляр класса WMI определяется путем к объекту WMI, который может состоять из сетевого имени компьютера, имени пространства имен, имени класса и набора ключевых свойств объекта вместе с их значениями (см. разд. "Путь к классам и объектам CIM" лекции 10).

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

    Если параметры безопасности указаны, то путь к объекту следует за закрывающей скобкой параметров безопасности и отделяется от нее восклицательным знаком. Например, следующий моникер будет в сценарии определять путь к экземпляру класса Win32_Service, у которого в ключевом свойстве Name записана строка Alerter, и который расположен в пространстве CIMV2 на компьютере с именем POPOV:

    "WinMgmts:{impersonationLevel=Impersonate}!\\POPOV\Root\CIMV2:
      Win32_Service.Name='Alerter'"

    Если же параметры безопасности в моникере опущены, то путь к объекту записывается после двоеточия в префиксе "WinMgmts:" без восклицательного знака:

    "WinMgmts:\\POPOV\Root\CIMV2:Win32_Service.Name='Alerter'"

    Замечание

    Для правильной идентификации объектов в пути к ним должны указываться имена и значения ключевых свойств (например, в классе Win32_Service таковым является свойство Name, а в классе Win32_Process — свойство Handle). Для того чтобы узнать, какое свойство у класса является ключевым, можно воспользоваться тестером WMI (wbemtest.exe) или утилитой WMI CIM Studio.

    В принципе, в WMI-моникере можно указывать не полный путь к объекту, а лишь нужные фрагменты, например "WinMgmts:\Root\CIMV2", "WinMgmts:\\POPOV" и т. п. При этом если опущено имя компьютера или вместо него стоит точка (.), то будет производиться обращение к подсистеме WMI локального компьютера. Если опущено пространство имен, то WMI будет работать с пространством имен по умолчанию, которое извлекается из подраздела HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\WBEM\Scripting\Default Namespace системного реестра рабочей станции, к которой производится обращение.

    Замечание

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

    Практически во всех приведенных далее сценариях соединение с подсистемой WMI будет производиться с помощью моникера "WinMgmts:".

    Вернуться к учебному плану