Опубликован: 12.01.2008 | Уровень: специалист | Доступ: платный | ВУЗ: Мордовский государственный университет имени Н.П. Огарева
Лекция 18:

Работа в Windows PowerShell с объектными моделями WMI, COM и .NET

< Лекция 17 || Лекция 18: 12 || Лекция 19 >
Аннотация: Описывается доступ из PowerShell к внешним объектам WMI, COM и .NET. Обсуждается вызов статических методов .NET-классов. Приводятся примеры использования объектов WSH, взаимодействия с приложением Microsoft Word
Ключевые слова: оболочка, Windows, API, WMI, COM, net, ComputerName

Работа в 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.
< Лекция 17 || Лекция 18: 12 || Лекция 19 >
Валентина Тюрина
Валентина Тюрина

Вопрос по лекции 7, где рассматривается взаимодействие со сторонними программами, в том числе эмуляция нажатия кнопок клавиатуры WshShell.SendKeys.

Вопрос в том что во время автоматизации может потребоваться не нажатие клавиатуры, а нажатие кнопок в сообщениях этих программ.

Можно вытащить информацию о объекте (кнопке) скажем с помощью AutoIt Info, или ориентироваться скажем на текст на кнопке..., но как на эту кнопку нажать? (без обхода по клавиатуре)

Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.

Михаил Байков
Михаил Байков
Россия, Москва, Московский Авиационный Институт, 2009
Алексей Хохлов
Алексей Хохлов
Россия, Балашиха