Здесь мы подробно остановимся на механизме работы подобных сценариев, в основе которого лежит библиотека поддержки сценариев WMI (WMI Scripting Library), а также рассмотрим на примерах все основные типы сценариев WMI.
Сразу отметим, что все сценарии данной лекции написаны на языке VBScript, который позволяет напрямую работать с выходными параметрами методов объектов WMI, а также обрабатывать элементы коллекций без создания дополнительного объекта Enumerator.
Итак, для того чтобы получить доступ к 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 на локальном или удаленном компьютере и получить доступ к классам и объектам из определенного пространства имен.
При этом связь между репозиторием SWbemObject, который может представлять либо экземпляр управляемого ресурса WMI, либо определение класса WMI. Полиморфным этот объект называется из-за того, что набор его свойств зависит от управляемого ресурса (класса Win32_Process объект SWbemObject будет среди прочих иметь свойства Handle и ExecutionState, а для класса Win32_Service — свойства ServiceType и StartMode.
В таблице 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 на локальном или удаленном компьютере. Для этого существуют два различных варианта: с использованием объекта SWbemLocator и с помощью так называемого WMI-моникера (WMI moniker) "WinMgmts:".
Объект 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-моникеров. Понятие моникер относится к COM-объектам, где под этим термином понимается строка (отображаемое имя, display name ), задающая путь к объекту, экземпляр которого должен быть создан в клиентском приложении. В контексте сценариев VBScript моникер WMI — это строка определенной структуры, передаваемая в качестве параметра функции GetObject, в результате выполнения которой возвращается ссылка на определенный объект или конкретный экземпляр объекта библиотеки поддержки сценариев WMI.
Например, можно задать WMI-моникер, извлекающий, как и при использовании метода ConnectServer объекта SWbemLocator, ссылку на объект SWbemServices. Можно построить моникер, обеспечивающий доступ к объекту SWbemObjectSet, содержащему набор объектов WMI. Наконец, с помощью моникера можно получить ссылку на конкретный экземпляр объекта SWbemObject.
Такая гибкость делает WMI-моникеры очень полезными для упрощения структуры сценария, однако следует иметь в виду следующие ограничения при работе с моникерами:
ConnectServer объекта SWbemLocator.Формат строки 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:
"WinMgmts:{impersonationLevel=Impersonate}" ;"WinMgmts:{authenticationLevel=pktPrivacy}" ;"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 ссылки на нужный объект 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
В принципе, в WMI-моникере можно указывать не полный путь к объекту, а лишь нужные фрагменты, например "WinMgmts:\Root\CIMV2", "WinMgmts:\\POPOV" и т. п. При этом если опущено имя компьютера или вместо него стоит точка (.), то будет производиться обращение к подсистеме WMI локального компьютера. Если опущено пространство имен, то WMI будет работать с пространством имен по умолчанию, которое извлекается из подраздела HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\WBEM\Scripting\Default Namespace системного реестра рабочей станции, к которой производится обращение.
Замечание
Рекомендуется в WMI-моникере всегда явно указывать нужное пространство имен WMI, не полагаясь на значение, которое хранится в реестре.
Практически во всех приведенных далее сценариях соединение с подсистемой WMI будет производиться с помощью моникера "WinMgmts:".
Здесь мы подробно остановимся на механизме работы подобных сценариев, в основе которого лежит библиотека поддержки сценариев WMI (WMI Scripting Library), а также рассмотрим на примерах все основные типы сценариев WMI.
Сразу отметим, что все сценарии данной лекции написаны на языке VBScript, который позволяет напрямую работать с выходными параметрами методов объектов WMI, а также обрабатывать элементы коллекций без создания дополнительного объекта Enumerator.
Итак, для того чтобы получить доступ к 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 на локальном или удаленном компьютере и получить доступ к классам и объектам из определенного пространства имен.
При этом связь между репозиторием SWbemObject, который может представлять либо экземпляр управляемого ресурса WMI, либо определение класса WMI. Полиморфным этот объект называется из-за того, что набор его свойств зависит от управляемого ресурса (класса Win32_Process объект SWbemObject будет среди прочих иметь свойства Handle и ExecutionState, а для класса Win32_Service — свойства ServiceType и StartMode.
В таблице 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 на локальном или удаленном компьютере. Для этого существуют два различных варианта: с использованием объекта SWbemLocator и с помощью так называемого WMI-моникера (WMI moniker) "WinMgmts:".
Объект 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-моникеров. Понятие моникер относится к COM-объектам, где под этим термином понимается строка (отображаемое имя, display name ), задающая путь к объекту, экземпляр которого должен быть создан в клиентском приложении. В контексте сценариев VBScript моникер WMI — это строка определенной структуры, передаваемая в качестве параметра функции GetObject, в результате выполнения которой возвращается ссылка на определенный объект или конкретный экземпляр объекта библиотеки поддержки сценариев WMI.
Например, можно задать WMI-моникер, извлекающий, как и при использовании метода ConnectServer объекта SWbemLocator, ссылку на объект SWbemServices. Можно построить моникер, обеспечивающий доступ к объекту SWbemObjectSet, содержащему набор объектов WMI. Наконец, с помощью моникера можно получить ссылку на конкретный экземпляр объекта SWbemObject.
Такая гибкость делает WMI-моникеры очень полезными для упрощения структуры сценария, однако следует иметь в виду следующие ограничения при работе с моникерами:
ConnectServer объекта SWbemLocator.Формат строки 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:
"WinMgmts:{impersonationLevel=Impersonate}" ;"WinMgmts:{authenticationLevel=pktPrivacy}" ;"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 ссылки на нужный объект 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
В принципе, в WMI-моникере можно указывать не полный путь к объекту, а лишь нужные фрагменты, например "WinMgmts:\Root\CIMV2", "WinMgmts:\\POPOV" и т. п. При этом если опущено имя компьютера или вместо него стоит точка (.), то будет производиться обращение к подсистеме WMI локального компьютера. Если опущено пространство имен, то WMI будет работать с пространством имен по умолчанию, которое извлекается из подраздела HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\WBEM\Scripting\Default Namespace системного реестра рабочей станции, к которой производится обращение.
Замечание
Рекомендуется в WMI-моникере всегда явно указывать нужное пространство имен WMI, не полагаясь на значение, которое хранится в реестре.
Практически во всех приведенных далее сценариях соединение с подсистемой WMI будет производиться с помощью моникера "WinMgmts:".
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.