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
Часть свойств можно получить и так:
[wmiclass]"Win32_OperatingSystem" | Get-Member
Для того что бы отобразить все свойства нужно выполнить:
Get-WmiObject -Class Win32_OperatingSystem | Select-Object -Property *
Либо можно объявить результат в переменную:
$result = Get-WmiObject -Class Win32_OperatingSystem
Получить все значения переменной:
$result | Get-Member
И затем вызывать через переменную. Так я получу название:
$result.Caption
Поиск свойств в Powershell WMI
У нас два способа поиска нужных свойств. Первый через ключ -Filter:
Get-WmiObject -List | where {$_.Name -Like "*share*"}
Get-WmiObject -Class Win32_Share -Filter "Status = 'OK'"
Но если мы напишем что-то не так, то увидим язык 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
...
Подписывайтесь на наш Telegram канал
Теги: #powershell #wmi