Опубликован: 12.01.2008 | Уровень: специалист | Доступ: свободно
Лекция 12:

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

< Лекция 11 || Лекция 12: 12 || Лекция 13 >
Аннотация: Рассматриваются механизм работы и основные типы сценариев WSH, использующихся для доступа к WMI. Даются примеры сценариев для подключения к подсистеме WMI на локальном или удаленном компьютере, получения экземпляров объектов WMI и вызова их методов
Ключевые слова: WMI, library, CIM

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

Таблица 12.1. Основные объекты библиотеки поддержки сценариев 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
'************************* Конец ***********************************
Листинг 12.1. Ввод пароля без отображения на экране для соединения с WMI на удаленном компьютере
< Лекция 11 || Лекция 12: 12 || Лекция 13 >
Валентина Тюрина
Валентина Тюрина
Нажатие кнопок в сторонних программах
Александр Тагильцев
Александр Тагильцев
Где проводится профессиональная переподготовка?
Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Игорь Ермачков
Игорь Ермачков
Латвия, Рига