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