Вопрос по лекции 7, где рассматривается взаимодействие со сторонними программами, в том числе эмуляция нажатия кнопок клавиатуры WshShell.SendKeys. Вопрос в том что во время автоматизации может потребоваться не нажатие клавиатуры, а нажатие кнопок в сообщениях этих программ. Можно вытащить информацию о объекте (кнопке) скажем с помощью AutoIt Info, или ориентироваться скажем на текст на кнопке..., но как на эту кнопку нажать? (без обхода по клавиатуре) |
Сценарии 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, которые мы будем наиболее часто использовать в наших примерах.
Объект | Описание |
---|---|
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 на удаленном компьютере