Когда нам нужно узнать информацию о компьютере Windows и его компонентах, мы можем сделать это с помощью Get-WmiObject
.
Не только чтение, используя методы WMI, Get-WmiObject
также может выполнять действия как на локальных, так и на удаленных системах. Эта командлета – одна из нескольких в PowerShell, которая может работать с репозиторием WMI, что значительно облегчает управление множеством систем.
Обнаружение классов с помощью Get-WmiObject
В самом простом случае эта командлета может запрашивать информацию с локального компьютера. Вам просто нужно знать пространство имен (вероятно, root\cimv2
, которое является по умолчанию) и класс WMI, в котором находится информация, которую вы ищете.
Существует тысячи классов, и вы, вероятно, еще не знаете, какой класс вы хотели бы использовать. С помощью Get-WmiObject
мы можем запросить все доступные классы в пространстве имен. Используя Get-WmiObject -List
, вы сможете увидеть все классы в пространстве имен root\cimv2
. Если вам нужно проверить классы в другом пространстве имен, вы всегда можете использовать параметр Namespace
вместе с этим.
Получение свойств WMI
Как только у вас есть класс, пришло время изучить и посмотреть, какие свойства есть в этом классе. Возможно, мне бы хотелось узнать, какая операционная система установлена на компьютере. Я мог бы создавать отчет и хотел бы узнать, что за удаленная машина используется. Get-WmiObject
имеет параметр ComputerName
, где вы можете указать один или несколько удаленных компьютеров вместо локального.
Мой удаленный компьютер – контроллер домена с именем DC. Я посмотрю на класс Win32_OperatingSystem
, чтобы увидеть, какие свойства там есть.
Это полезная информация, но я не вижу названия операционной системы. Как и во многих других выводах PowerShell, здесь не отображаются все свойства. Для этого нам придется использовать Select-Object
, чтобы вернуть все свойства.
I can now see a property called Caption
that lets me know the version of Windows.
Поиск свойств WMI
А что, если вы ищете не конкретное свойство, а свойство, которое соответствует определенному значению? Например, мы можем запросить все экземпляры класса CIM_DataFile
, но это вернет каждый файл в системе! Вместо этого мы можем фильтровать экземпляры по значению, используя параметр Filter
или Query
. Давайте рассмотрим оба варианта.
Используя CIM_DataFile
в качестве примера, предположим, что я хочу найти только те экземпляры, которые представляют сжатые файлы. Поскольку свойство Compressed
является свойством на каждом экземпляре и является булевым значением, я могу использовать параметр Filter
, чтобы отправить фильтр непосредственно провайдеру WMI, возвращая только те экземпляры, у которых свойство Compressed
установлено в True
.
Если вы знаете WQL, вы также можете выбирать класс и указывать “фильтр” самостоятельно, создавая свой собственный запрос WQL.
Вызов методов WMI
Get-WmiObject
не только может читать информацию из WMI, но также может облегчить вызов методов WMI. Один из общих методов WMI, который вызывается, это метод Create
в классе Win32_Process
. Есть несколько разных способов вызова методов WMI, таких как использование Invoke-WmiMethod
, но это также можно сделать с помощью Get-WmiObject
. Нам просто нужно захватить экземпляр WMI, а затем вызвать метод для этого объекта.
Вот пример удаленного запуска notepad.exe на удаленном компьютере. В качестве бонуса мы также используем альтернативные учетные данные для этого!
WMI, DCOM и PowerShell Remoting
Еще одна важная вещь, которую стоит отметить, это преемник этой командлеты: Get-CimInstance
. Хотя Get-CimInstance
действительно предоставляет некоторые преимущества при использовании PowerShell Remoting в качестве протокола удаленного подключения по умолчанию, иногда удобнее использовать Get-WmiObject
.
Get-WmiObject
использует DCOM для связи с удаленными компьютерами и обычно также доступен. В противном случае вам нужно будет включить PowerShell Remoting на удаленных конечных точках, если хотите использовать Get-CimInstance
через WSMAN.
Для полного разбора посетите документацию Microsoft.