Не только для разработчиков: доступ к объектам WMI через PowerShell
За прошедшие годы я написал ряд статей, объясняющих, как создавать различные типы отчетов, используя данные, полученные с помощью различных команд PowerShell. Хотя командлеты PowerShell Get могут возвращать огромное количество информации, вы можете получить доступ к гораздо большему количеству данных, если углубитесь в инструментарий управления Windows (WMI).
WMI часто считают одной из тех вещей, с которыми связываются только разработчики. Я понимаю. Хорошая новость заключается в том, что PowerShell позволяет очень легко извлекать данные из WMI. Вам не нужно быть разработчиком, чтобы выполнить работу. Вам даже не нужно ничего знать о WMI. Все методы, которые я вам покажу, выполняются с использованием родной оболочки PowerShell.
Первое, что вам нужно знать о работе с WMI, это то, что объекты WMI делятся на классы и свойства. Вы можете думать о классе WMI как о категории, а свойства, по сути, являются атрибутами этой категории.
Получение информации от ОС
Имея это в виду, представьте, что мы пытаемся получить информацию об операционной системе Windows. Сама операционная система будет классом (на самом деле он называется Win32_OperatingSystem), а такие вещи, как BuildNumber, Version и RegisteredUser, будут свойствами этого класса.
Одна из вещей, которая часто пугает администраторов при работе с WMI, — это само количество доступных объектов. Существуют сотни различных классов, и многие из них содержат огромное количество свойств.
Если вам интересно, какие классы существуют в Windows, просто введите команду ниже:
Get-WMIObject -List
Эта команда выводит список классов объектов WMI, существующих на текущем компьютере. Между прочим, вместо этого вы можете просмотреть удаленную систему, добавив параметр -ComputerName и имя удаленной системы, которую вы хотите проверить.
Как вы можете видеть на рисунке ниже, ввод команды Get-WMIObject -List отображает список доступных классов WMI и по крайней мере частичный список доступных свойств.
Итак, давайте продолжим и сделаем что-нибудь полезное с этой информацией. Предположим, что мы хотим просмотреть некоторую подробную информацию об операционной системе, и мы хотим использовать для этого класс Win32OperatingSystem. Если вы хотите увидеть некоторые из доступных свойств для этого класса, просто введите командлет Get-WMIObject, а затем имя класса. В этом случае команда будет Get-WMIObject Win32_OperatingSystem. Вы можете увидеть вывод команды на рисунке ниже.
Если вы потратили много времени на работу с PowerShell, то знаете, что очень часто команды Get отображают только часть доступной информации. Это именно то, что происходит здесь. Если вы хотите увидеть все свойства, доступные в классе, вам нужно будет добавить либо Format-List, либо Format-Table, а затем звездочку. На рисунке ниже показано, что для класса Win32_OperatingSystem доступно гораздо больше свойств, чем показано по умолчанию.
Давайте напишем сценарий
Имея это в виду, давайте представим, что по какой-то причине нам нужно написать сценарий, который использует WMI для поиска имени операционной системы. На самом деле мы могли бы сделать это с помощью одной строки кода (которую вы можете увидеть на следующем снимке экрана), но давайте сделаем это немного интереснее. Вместо того, чтобы просто искать имя операционной системы, давайте сопоставим его с переменной, чтобы мы могли ссылаться на него в другом месте сценария PowerShell.
Поначалу кажется, что это действительно легко сделать. Мы могли бы использовать такую команду:
$OS = Get-WMIObject Win32_OperatingSystem | Select-Object Caption
Проблема с использованием этой команды заключается в том, что переменная $OS будет содержать больше, чем просто имя операционной системы. Он также будет хранить заголовок столбца (состоящий из слова Caption и ряда дефисов). Вы можете увидеть, как это выглядит на рисунке ниже.
Таким образом, нам нужен способ изолировать имя операционной системы, чтобы переменная $OS хранила имя операционной системы и ничего больше.
Команда, которую нам на самом деле нужно будет использовать, очень похожа на ту, которую я вам только что показал. Разница в том, что вместо использования командлета Select-Object, который всегда будет отображать заголовок столбца, мы должны просто ссылаться на свойство, которое мы интересует напрямую. Вот как выглядит команда:
$OS = (Get-WMIObject Win32_OperatingSystem).Caption
Что я сделал, так это заключил командлет Get_WMIObject и имя класса WMI, который я использую, в круглых скобках. Сделав это, я могу просто добавить точку и имя свойства, которое я хочу присвоить переменной. Вы можете увидеть, как это работает, на рисунке ниже.
Важно знать навык
Я настоятельно рекомендую всем, кто много пишет сценарии PowerShell, потратить некоторое время на изучение различных классов WMI. Следует признать, что WMI может быть немного ошеломляющим из-за огромного количества доступных классов и свойств. Тем не менее, понимание основ доступа к WMI из PowerShell значительно расширит ваши возможности с помощью сценариев PowerShell.
Один из способов обойти проблему наличия слишком большого количества классов WMI — выполнить поиск в Интернете и посмотреть, какие классы другие люди считают наиболее полезными. какую-то конкретную информацию, на которую вы хотите сослаться в своем сценарии.