Как работать с WMI в Powershell


26 июня 2019


Основы работы с WMI через Powershell

WMI (Windows Management Instrumentation) - это технология, с помощью которой можно получить и изменить достаточно широкий перечень параметров Windows.

Для примера мы хотим узнать информацию о процессоре. Мы можем использовать команду CMD sysinfo или Powershell Get-ComputerInfo, но увидеть только часть информации. С помощью WMI мы можем получить почти всю информацию.

Для получения всех классов WMI в Powershell мы можем использовать:

Get-WmiObject -List

Мы получим все классы для пространства имен root\cimv2 т.к. оно стоит по умолчанию. Если мы хотим использовать другое, то его нужно указать с ключом -Namespace.

Одной из особенностей этого командлета является, что мы можем получить все классы и свойства и исполнить методы на удаленном компьютере:

Get-WmiObject -List -ComputerName CL1

Где:
-ComputerName - имя компьютера

WMI работает на 135 порту, а так же привилегированная учетная запись с правами на WMI и DCOM.

Либо у нас должен работать PSRemoting (тогда мы будем использовать Ivoke-Command). Весь процесс описан тут

Получение свойств класса через Powershell WMI

Если мы еще не знаем какой класс нам нужен, а вывод очень большой, то мы можем немного отфильтровать результат. На примере я искал классы где в имени есть BIOS:

Get-WmiObject -List | where {$_.name -like "*BIOS*"}

 Если мы выведем свойства класса операционной системы, то не увидим названия:

Get-WmiObject -Class Win32_OperatingSystem

Получение класса WMI Powershell

Часть свойств можно получить и так:

[wmiclass]"Win32_OperatingSystem" | Get-Member

Для того что бы отобразить все свойства нужно выполнить:

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

Получение всех свойств через WMI Powershell

Либо можно объявить результат в переменную:

$result = Get-WmiObject -Class Win32_OperatingSystem

Получить все значения переменной:

$result | Get-Member

Все значения WMI Powershell

И затем вызывать через переменную. Так я получу название:

$result.Caption

 

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

У нас два способа поиска нужных свойств. Первый через ключ -Filter:

Get-WmiObject -List | where {$_.Name -Like "*share*"}
Get-WmiObject -Class Win32_Share -Filter "Status = 'OK'"

Фильтрация свойств WMI Powershell

Но если мы напишем что-то не так, то увидим язык WQL (WMI Query Language):

Get-WmiObject : Invalid query "select * from Win32_Share where Status1 = 'OK'"

Т.е. мы можем писать и запрос WQL:

Get-WmiObject -Query "SELECT * FROM Win32_share WHERE Status='OK'"

 

Вызов методов WMI через Powershell

Этот метод запустит Notepad.exe на удаленном компьютере AD. В $cred будут храниться учетные данные, если мы будем запускать процесс под другим пользователем.

$cred = Get-Credential
$process = Get-WmiObject -Query "SELECT * FROM Meta_Class WHERE __Class = 'Win32_Process'" `
-Namespace "root\cimv2" -Computername 'AD' -Credential $cred
$process.Create( "notepad.exe" )

Есть другой подход, с другой командой:

Invoke-WmiMethod -Path win32_process -Name create -ArgumentList notepad.exe

Отмечу, что вызвать процесс в графической оболочке нельзя, он будет запущен в бэкграунде. Связано это с тем, что Microsoft против что бы вторгались в интерактивный сеанс пользователя кому-либо (не моя цитата). Один из вариантов решения этого помещать задачи в планировщике.

Для того что бы увидеть остальные команды по работе с WMI в Powershell можно запустить:

Get-Command -Noun *WMI*

Что бы увидеть примеры использования или получить справку:

Get-help Invoke-WmiMethod -Examples

 

...

Теги: #powershell #wmi


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.