Вопрос по лекции 7, где рассматривается взаимодействие со сторонними программами, в том числе эмуляция нажатия кнопок клавиатуры WshShell.SendKeys. Вопрос в том что во время автоматизации может потребоваться не нажатие клавиатуры, а нажатие кнопок в сообщениях этих программ. Можно вытащить информацию о объекте (кнопке) скажем с помощью AutoIt Info, или ориентироваться скажем на текст на кнопке..., но как на эту кнопку нажать? (без обхода по клавиатуре) |
Работа в Windows PowerShell с объектными моделями WMI, COM и .NET
Работа в Windows PowerShell с объектными моделями WMI, COM и .NET
Одна из основных задач, для решения которых создавалась оболочка PowerShell, было получение из командной строки доступа к различным объектным инфраструктурам, поддерживаемым операционной системой Windows. Раньше к подобным объектам можно было обращаться либо из полноценных приложений с помощью интерфейса прикладного программирования (API), либо из сценариев WSH. В любом случае для использования внешних объектов приходилось писать программный код и изучать их структуру, что значительно затрудняло работу с ними и препятствовало широкому распространению технологий автоматизации среди системных администраторов и пользователей Windows.
Для решения этой проблемы в PowerShell были разработаны специальные командлеты, позволяющие в интерактивном режиме из оболочки обращаться к объектам WMI, COM и .NET.
Доступ к WMI
В предыдущих лекциях мы уже обращались к объектам WMI из сценариев на языках VBScript и JScript, а также из оболочки WMIC. В PowerShell экземпляры объектов WMI можно получать с помощью командлета Get-WmiObject.
Подключение к подсистеме WMI. Получение списка классов
Для обращения к определенному объекту WMI нужно знать наименование класса, к которому он относится (например, Win32_Process или Win32_Service ). PowerShell позволяет в интерактивном режиме получить список всех классов WMI на локальном или удаленном компьютере. Для этого нужно выполнить командлет Get-WmiObject с параметром List:
PS C:\> Get-WmiObject -List __SecurityRelatedClass __NTLMUser9X __PARAMETERS __SystemSecurity __NotifyStatus __ExtendedStatus Win32_PrivilegesStatus Win32_TSNetworkAdapterSettingError Win32_TSRemoteControlSettingError Win32_TSEnvironmentSettingError Win32_TSSessionDirectoryError Win32_TSLogonSettingError Win32_TerminalError Win32_JobObjectStatus Win32_TerminalServiceSettingError Win32_TSPermissionsSettingError Win32_TSClientSettingError Win32_TSGeneralSettingError Win32_TSSessionSettingError __SystemClass . . .18.1.
В данном примере выводится список классов WMI на локальном компьютере. Если вам нужно подключиться к подсистеме WMI другой машине, то ее имя или IP-адрес нужно указать в качестве значения параметром ComputerName, например:
PS C:\> Get-WmiObject –ComputerName 10.169.1.15 -List __SecurityRelatedClass __NTLMUser9X __PARAMETERS __SystemSecurity __NotifyStatus __ExtendedStatus Win32_PrivilegesStatus Win32_TSNetworkAdapterSettingError Win32_TSRemoteControlSettingError Win32_TSEnvironmentSettingError . . . PS C:\> Get-WmiObject –ComputerName Comp1 -List __SecurityRelatedClass __NTLMUser9X __PARAMETERS __SystemSecurity __NotifyStatus __ExtendedStatus Win32_PrivilegesStatus Win32_TSNetworkAdapterSettingError Win32_TSRemoteControlSettingError Win32_TSEnvironmentSettingError . . .18.2.
По умолчанию командлет Get-WmiObject подключается к пространству имен Root\CIMV2. Сменить это пространство имен позволяет параметр Namespace, в качестве значения которого указывается нужное наименование. Например:
PS C:\> Get-WmiObject -Namespace Root -List __SecurityRelatedClass __NTLMUser9X __PARAMETERS __SystemSecurity __NotifyStatus __ExtendedStatus __SystemClass __Provider __Win32Provider __thisNAMESPACE __IndicationRelated __EventGenerator . . .18.3.
Получение объектов WMI
Зная имя класса WMI, получить экземпляры этого класса очень просто. Например:
PS C:\> Get-WmiObject Win32_Service ExitCode : 1077 Name : Alerter ProcessId : 0 StartMode : Disabled State : Stopped Status : OK ExitCode : 0 Name : ALG ProcessId : 564 StartMode : Manual State : Running Status : OK . . .18.4.
Данная команда выводит информацию о службах, зарегистрированных в системе. На самом деле объекты класса Win32_Service имеют намного больше свойств, чем по умолчанию отображается на экране; увидеть список всех свойств и методов объекта WMI можно, как и в случае .NET-объектов, с помощью командлета Get-Member:
PS C:\> Get-WmiObject Win32_Service | Get-Member TypeName: System.Management.ManagementObject#root\cimv2\Win32_Service Name MemberType Definition ---- ---------- ---------- Change Method System.Management.ManagementBaseObject Chang… ChangeStartMode Method System.Management.ManagementBaseObject Chang… Create Method System.Management.ManagementBaseObject Creat… InterrogateService Method System.Management.ManagementBaseObject Inter… PauseService Method System.Management.ManagementBaseObject Pause… ResumeService Method System.Management.ManagementBaseObject Resum… StartService Method System.Management.ManagementBaseObject Start… StopService Method System.Management.ManagementBaseObject StopS… UserControlService Method System.Management.ManagementBaseObject UserC… AcceptPause Property System.Boolean AcceptPause {get;set;} AcceptStop Property System.Boolean AcceptStop {get;set;} Caption Property System.String Caption {get;set;} CheckPoint Property System.UInt32 CheckPoint {get;set;} CreationClassName Property System.String CreationClassName {get;set;} Description Property System.String Description {get;set;} DesktopInteract Property System.Boolean DesktopInteract {get;set;} DisplayName Property System.String DisplayName {get;set;} ErrorControl Property System.String ErrorControl {get;set;} . . .18.5.
Используя командлеты форматирования, можно выводить на экран интересующие нас свойства, например:
PS C:\> Get-WmiObject Win32_Service | Format-Table Name, AcceptStop Name AcceptStop ---- ---------- Alerter False ALG True AppMgmt False aspnet_state False Ati HotKey Poller False AudioSrv True BITS True Browser True cisvc False ClipSrv False clr_optimization_v2.0.50727_32 False COMSysApp False CryptSvc True DcomLaunch False Dhcp True dmadmin False dmserver False Dnscache True ERSvc True . . .18.6.
Выполнение WQL-запросов
Параметр Query командлета Get-WmiObject позволяет выполнять произвольные запросы на языке WQL. Например:
PS C:\> Get-WmiObject -Query 'select * from win32_process where name="lsass.exe"' ProcessName : lsass.exe Handles : 358 VM : 42233856 WS : 1511424 Path : C:\WINDOWS.1\system32\lsass.exe __GENUS : 2 __CLASS : Win32_Process __SUPERCLASS : CIM_Process __DYNASTY : CIM_ManagedSystemElement __RELPATH : Win32_Process.Handle="884" __PROPERTY_COUNT : 45 . . .18.7.