Эта статья является первой из многих статей, посвященных WMI, и предназначено для довольно новой аудитории. Базовое понимание Powershell определенно поможет читателю при просмотре блога, однако это не является обязательным требованием. Вот и все, давайте перейдем к изучению наступательного WMI-его основы.
Вступление
Почему именно WMI?
WMI — это набор спецификаций от Microsoft, разработанный для быстрого и эффективного администрирования систем Windows. И, как вы, возможно, знаете, правило безопасности гласит, что «все, что полезно для администрации, отлично подходит для злоупотреблений со стороны злоумышленников». WMI действительно может многое — от сбора статусов компьютеров и настройки параметров до запуска приложений и выполнения кода. Более того, WMI присутствует во всех доступных версиях ОС Windows, поэтому целевая область здесь довольно широка.
Что такое WMI?
Давайте быстро рассмотрим несколько важных терминов. WMI расшифровывается как Windows Management Instrumentation, которая представляет собой реализацию Microsoft CIM (Common Information Model) и WBEM (Web-ориентированное управление предприятием), которые в целом являются стандартами DMTF (Distributed Management Task Force). WMI дает нам аккуратный и единообразный интерфейс для приложений / сценариев для управления компьютером (возможно, удаленным и локальным), в т.ч. процессами, услугами и т. д.
Архитектура WMI
- Клиенты / потребители: по сути, это конечные потребители, которые взаимодействуют с классами WMI для запроса данных, выполнения методов и т. д. Некоторые известные клиенты включают
wmic.exe, wbemtest.exe, winrm.exe, VBScript / JScript
и, в некоторых случаях, командлеты Powershell. - Языки запросов: так же, как SQL предоставляет вам способ запроса базы данных, WMI также имеет WQL (язык запросов WMI) / CQL для запросов к службе WMI. Когда дело доходит до управления удаленными ящиками, вступает в действие стандарт WBEM, который включает DCOM и WS-Man (не волнуйтесь, если вы не понимаете эти термины, читайте дальше). WQL — это в основном синтаксис SQL для WMI, поэтому регистр не учитывается.
select * from win32_bios
- Репозитории: это базы данных, о которых мы говорили ранее, в которых хранятся все статические данные (определения) классов. Репозитории определяются файлами MOF (формат управляемого объекта), которые определяют структуру, классы, пространства имен и т. д. Файлы базы данных можно найти в каталоге
% WINDIR% \ System32 \ Wbem \ Repository.
- Файлы MOF: файлы MOF в основном используются для определения пространств имен WMI, классов, поставщиков и т. д. Обычно они находятся в каталоге
% WINDIR% \ System32 \ Wbem
с расширением.mof.
В более поздней части этой серии мы рассмотрим, как мы можем писать наши собственные файлы MOF для расширения набора функций WMI. - Поставщики: все, что определено в репозиториях, можно получить с помощью поставщиков WMI. Обычно они представляют собой файлы DLL и связаны с файлом MOF —
cimwin32.dll, stdprov.dll
и т. д., Чтобы назвать несколько, однако они также могут принимать форму других типов (класс, событие, потребитель события, метод и т. д.) . Провайдеры важны для экосистемы, потому что они отслеживают события и данные от определенных объектов. Поставщики как драйверы, которые обеспечивают мост между управляемыми объектами и WMI.
На снимке экрана ниже файлы DLL являются поставщиками связанных файлов MOF:
- Управляемые объекты: это псевдонимы ресурсов в контексте, то есть управляемый объект может быть службой, процессом или ОС, управляемыми WMI.
- система
- основной
- расширение
и 3 вида:
- Аннотация
- статический
- динамичный
По умолчанию используются следующие известные пространства имен: root \ cimv2, root \ default, root \ security, root \ subscription
и т. д.
Вот и все с архитектурой. Теперь давайте узнаем немного об использовании WMI с Powershell.
Использование WMI с Powershell
Теперь, когда мы закончили с теоретической частью, давайте быстро создадим терминал PS. Важно помнить, что до Powershell версии 2 было всего несколько командлетов для взаимодействия с WMI. Мы быстро проверим нашу версию Powershell и изменим версию на 2:
Теперь давайте запустим командлет Get-Command -CommandType * wmi *
в командной строке Powershell. Это приводит нас к:
СОВЕТ. Названия команд говорят сами за себя (и мы еще поговорим об этом позже). В любой момент вы можете использовать стандартный синтаксис Powershell: help <command>,
чтобы получить дополнительную информацию о том, что делает конкретная команда. например вы можете попробовать help Invoke-WmiMethod для просмотра того, что делает команда — очень похоже на справочные страницы Linux.
Начиная с Powershell v3, MS представила командлеты CIM, которые используют стандарты WS-MAN и CIM для управления объектами. Доступ к командлетам CIM имеет преимущества в двух контекстах:
- На машинах, где запуск WMI / DCOM заблокирован (возможно, из-за правила брандмауэра на основе хоста?), но включен WinRM / WS-MAN (удаленное управление Windows), мы все равно можем использовать CIM, чтобы делать именно то, что мы можем делать с WMI.
- Сам CIM является отраслевым стандартом и реализован кросс-платформенным, что означает, что его можно использовать также для работы с устройствами, отличными от Windows.
DCOM: псевдоним для объектной модели распределенных компонентов, DCOM — это проприетарный протокол Microsoft для связи между программными компонентами на сетевых компьютерах. WMI использует распределенный COM (DCOM) для подключения к удаленному компьютеру. Однако DCOM не поддерживает брандмауэр.
WS-MAN: WS-MAN или WS-Management — это стандарт DMTF, который предоставляет системам общий способ доступа к управляющей информации через ИТ-инфраструктуру. WS-MAN, с другой стороны, использует HTTP, поэтому он определенно дружественен к брандмауэрам.
Мы повторим то, что делали выше, но после изменения версии Powershell на значение по умолчанию (в моем случае это Powershell v5):
Повторяя сказанное выше, командлеты CIM могут делать все, что могут командлеты WMI. Если мы хотим сопоставить функциональные возможности командлетов WMI и CIM, вот табличное представление сравнения функциональных возможностей обоих типов:
Использование и типы | WMI Командлеты | CIM Командлеты |
---|---|---|
Получить информацию о классах | Get-WmiObject |
Get-CimInstance |
Вызов метода | Invoke-WmiMethod |
Invoke-CimMethod |
Подписка на событие | Register-WmiEvent |
Register-CimIndicationEvent |
Создание / обновление экземпляров класса | Set-WmiInstance |
Set-CimInstance |
Удаление экземпляров класса | Remove-WmiObject |
|
Выполнение запросов WMI с помощью Powershell
Теперь, когда мы знаем о различных доступных для использования командлетах, мы можем попробовать выполнить приведенный выше образец WQL-запроса. Мы уже знаем, что Get-WmiObject можно использовать для получения информации о классах. Итак, давайте запустим командлет с параметром -Query
:
Get-WmiObject -Query 'select * from win32_bios'
Заключение
Эта статья была предназначена для обзора того, чем мы будем заниматься в следующих частях этой серии. Здесь много технических модных словечек, но понимать их необходимо. Надеюсь, вам понравилось читать, и я жду нашего совместного путешествия по изучению WMI.