Get-WmiObject: Запрос WMI для информации о компьютере

Когда нам нужно узнать информацию о компьютере Windows и его компонентах, мы можем сделать это с помощью Get-WmiObject.

Не только чтение, используя методы WMI, Get-WmiObject также может выполнять действия как на локальных, так и на удаленных системах. Эта командлета – одна из нескольких в PowerShell, которая может работать с репозиторием WMI, что значительно облегчает управление множеством систем.

Обнаружение классов с помощью Get-WmiObject

В самом простом случае эта командлета может запрашивать информацию с локального компьютера. Вам просто нужно знать пространство имен (вероятно, root\cimv2, которое является по умолчанию) и класс WMI, в котором находится информация, которую вы ищете.

Существует тысячи классов, и вы, вероятно, еще не знаете, какой класс вы хотели бы использовать. С помощью Get-WmiObject мы можем запросить все доступные классы в пространстве имен. Используя Get-WmiObject -List, вы сможете увидеть все классы в пространстве имен root\cimv2. Если вам нужно проверить классы в другом пространстве имен, вы всегда можете использовать параметр Namespace вместе с этим.

PS> Get-WmiObject -List

NameSpace: ROOT\cimv2

Name				Methods	Properties
CIM_Indication		{}		{CorrelatedIndications, IndicationFilterName, IndicationIde...
CIM_ClassIndication	{}    	{ClassDefinition, CorrelatedIndications, IndicationFilterNa........

Получение свойств WMI

Как только у вас есть класс, пришло время изучить и посмотреть, какие свойства есть в этом классе. Возможно, мне бы хотелось узнать, какая операционная система установлена на компьютере. Я мог бы создавать отчет и хотел бы узнать, что за удаленная машина используется. Get-WmiObject имеет параметр ComputerName, где вы можете указать один или несколько удаленных компьютеров вместо локального.

Мой удаленный компьютер – контроллер домена с именем DC. Я посмотрю на класс Win32_OperatingSystem, чтобы увидеть, какие свойства там есть.

PS> Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem

SystemDirectory : C:\Windows\system32
Organization    :
BuildNumber     : 9600
RegisteredUser  : Windows User
SerialNumber    : 00252-00108-14656-AA864
Version         : 6.3.9600

Это полезная информация, но я не вижу названия операционной системы. Как и во многих других выводах PowerShell, здесь не отображаются все свойства. Для этого нам придется использовать Select-Object, чтобы вернуть все свойства.

Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *

I can now see a property called Caption that lets me know the version of Windows.

PS> (Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *).Caption Microsoft Windows Server 2012 R2 Standard

Поиск свойств WMI

А что, если вы ищете не конкретное свойство, а свойство, которое соответствует определенному значению? Например, мы можем запросить все экземпляры класса CIM_DataFile, но это вернет каждый файл в системе! Вместо этого мы можем фильтровать экземпляры по значению, используя параметр Filter или Query. Давайте рассмотрим оба варианта.

Используя CIM_DataFile в качестве примера, предположим, что я хочу найти только те экземпляры, которые представляют сжатые файлы. Поскольку свойство Compressed является свойством на каждом экземпляре и является булевым значением, я могу использовать параметр Filter, чтобы отправить фильтр непосредственно провайдеру WMI, возвращая только те экземпляры, у которых свойство Compressed установлено в True.

Get-WmiObject -Class CIM_DataFile -Filter "Compressed = 'True'"

Если вы знаете WQL, вы также можете выбирать класс и указывать “фильтр” самостоятельно, создавая свой собственный запрос WQL.

Get-WmiObject -Query "SELECT * FROM CIM_DataFile WHERE Compressed = 'True'"

Вызов методов WMI

Get-WmiObject не только может читать информацию из WMI, но также может облегчить вызов методов WMI. Один из общих методов WMI, который вызывается, это метод Create в классе Win32_Process. Есть несколько разных способов вызова методов WMI, таких как использование Invoke-WmiMethod, но это также можно сделать с помощью Get-WmiObject. Нам просто нужно захватить экземпляр WMI, а затем вызвать метод для этого объекта.

Вот пример удаленного запуска notepad.exe на удаленном компьютере. В качестве бонуса мы также используем альтернативные учетные данные для этого!

$cred = get-credential
$process = Get-WmiObject -Query "SELECT * FROM Meta_Class WHERE __Class = 'Win32_Process'" -namespace "root\cimv2" -computername 'FOO' -credential $cred $process.Create( "notepad.exe" )

WMI, DCOM и PowerShell Remoting

Еще одна важная вещь, которую стоит отметить, это преемник этой командлеты: Get-CimInstance. Хотя Get-CimInstance действительно предоставляет некоторые преимущества при использовании PowerShell Remoting в качестве протокола удаленного подключения по умолчанию, иногда удобнее использовать Get-WmiObject.

Get-WmiObject использует DCOM для связи с удаленными компьютерами и обычно также доступен. В противном случае вам нужно будет включить PowerShell Remoting на удаленных конечных точках, если хотите использовать Get-CimInstance через WSMAN.

Для полного разбора посетите документацию Microsoft.

Source:
https://adamtheautomator.com/get-wmiobject/