Эта статья является второй частью серии «Offensive WMI» (первая здесь), и в этой статье мы сосредоточимся на трех основных компонентах WMI, с которыми мы будем в основном иметь дело. На протяжении всей статьи мы будем использовать как командлеты WMI, так и CIM как взаимозаменяемые, так что мы хорошо разбираемся в обоих типах командлетов. Другими словами разберем WMI — пространства имен, классы и методы
Пространства имён
__Namespace.
Чтобы получить список всех пространств имен в root
пространстве имен, мы можем запросить тот же класс, используя:Get-WmiObject -Namespace root -Class __Namespace
Get-WmiObject -Namespace root -Class __Namespace | select name
root \ <namespace>
, например. root \ DEFAULT, root \ CIMV2
и т. д., поскольку они являются пространствами имен в корневом пространстве имен.root \ DEFAULT,
а скорее root \ CIMV2
(так было с Windows 2000).Get-CimInstance,
где нет необходимости:Get-CimInstance -Namespace root -ClassName __Namespace
Function Get-WmiNamespace {
Param (
$Namespace='root'
)
Get-WmiObject -Namespace $Namespace -Class __NAMESPACE | ForEach-Object {
($ns = '{0}\{1}' -f $_.__NAMESPACE,$_.Name)
Get-WmiNamespace $ns
}
}
Классы
Теперь, когда у нас есть список доступных пространств имен, давайте взглянем на классы. Так что же такое классы?
Класс WMI представляет определенный элемент в вашей системе. Это может быть что угодно, от системных процессов до оборудования (например, сетевой карты), услуг и т.д.
Теперь классы разделены на 3 основные категории (это требование стандарта CIM):
- Основные классы: они применимы ко всем областям управления и предоставляют несколько основных функций. Обычно они начинаются с двойного подчеркивания (например, __SystemSecurity).
- Общие классы: это расширения основных классов, применимые к конкретным областям управления. Вы определите их, когда увидите класс с префиксом CIM_ (например,
CIM_TemperatureSensor
). - Расширенные классы: это дополнительные дополнения к общим классам, основанные на технических стеках. (например,
Win32_Process
).
- Абстрактные классы: это шаблоны для определения новых классов.
- Статические классы: в основном используются для хранения данных.
- Динамические классы: они получаются от поставщика и представляют управляемый WMI
- Классы ассоциации: описывает отношения между классами и управляемыми ресурсами.
Классы листинга
Хватит теории. Попробуем найти какие-нибудь классы. И снова мы можем использовать командлет Get-WmiObject
для вывода списка доступных классов:
Get-WmiObject -Class * -List
Здесь будут видны все вышеперечисленные классы, но в качестве примера предположим, что нас интересуют пользователи системы. Мы можем сузить круг до нашего конкретного варианта использования, используя следующую команду, в которой перечислены все доступные классы для получения / обработки информации о пользователе:
Get-WmiObject -Class *user* -List
То же самое можно сделать и с помощью командлета Get-CimClass:
Get-CimClass -ClassName *user*
ПРИМЕЧАНИЕ. Список всех классов Win32 можно найти в документации по классам Microsoft. Провайдер Win32 предоставляет классы для 4 различных категорий: классы оборудования компьютерных систем, классы операционных систем, классы счетчиков производительности и классы управления службами WMI.
Помните, мы говорили о динамических классах, которые предоставляют нам экземпляры? Чтобы получить только динамические классы, мы можем использовать переключатель —QualifierName
командлета Get-CimClass:
Get-CimClass -ClassName *user* -QualifierName dynamic
Все идет нормально. Что дальше? Запросы к классам, чтобы получить от них самое интересное.
Получение классов
На этот раз нас интересует класс Win32_UserAccount
. Получить данные просто:
Get-WmiObject -Class Win32_UserAccount
СОВЕТ: Чтобы получить более подробное резюме , вы можете передать указанную выше команду в Powershell Format-List
или fl
, например: Get-WmiObject -Class Win32_UserAccount | fl *
, который даст вам все, что может предложить класс.
Командлет CIM Get-CimInstance
также можно использовать для получения той же информации:
Get-CimInstance -ClassName Win32_UserAccount
Теперь у нас есть список всех учетных записей пользователей в системе.
Обратим внимание на процессы, запущенные в системе. Класс Win32_Process
дает нам список процессов, запущенных в системе:
Get-WmiObject -Class Win32_Process
Нередко в системе выполняется множество процессов, из-за которых ваш терминал может бесконечно прокручиваться. Чтобы избежать этого, мы можем использовать переключатель —Filter
, чтобы получить конкретный процесс, который мы ищем (здесь мы выбрали lsass.exe
):
Get-WmiObject -Class Win32_Process -Filter 'name="lsass.exe"'
Альтернативный вариант командлета CIM Get-CimInstance
в этом случае дает более короткое и полное заключение (и он также поддерживает переключатель —Filter
):
Get-CimInstance -ClassName Win32_Process
Идиоматическое выражение, делающее то же самое с WQL, выглядит следующим образом:
Get-WmiObject -Query 'select * from win32_process where name="lsass.exe"'
Хорошо, теперь мы знаем о перечислении, извлечении и фильтрации экземпляров классов в WMI. Давайте теперь посмотрим, как работает удаление экземпляров WMI.
Удаление экземпляров классов
Remove-WmiObject
(для командлетов WMI) и Remove-CimInstance
(для командлетов CIM) — это два командлета, которые могут удалять экземпляры. Вы можете передать вывод соответствующей команды командлетам. Для быстрой демонстрации давайте запустим наше любимое приложение-счетчик и составим список процесса.
Что произойдет, если мы направим команду в Remove-CimInstance
? Мы просто убиваем процесс.
Get-CimInstance -ClassName Win32_Process -Filter 'name="calculator.exe"' | Remove-CimInstance
Это чрезвычайно полезно, когда возитесь с реестром, или, что лучше, в ситуации, когда мы создали наши собственные классы для хранения наших полезных нагрузок и прочего — мы можем просто использовать командлет, чтобы перечислить все элементы в классе и, таким образом, очистить их все. за один присест.
Методы
Методы — это способы управления объектами WMI. Если вы прокрутите до места, где мы перечислили все доступные классы, вы увидите столбец под названием «Методы», в котором перечислены доступные методы.
Методы листинга
Чтобы повторить нашу работу и перечислить все доступные методы, мы можем сделать что-то вроде:
Get-CimClass -MethodName *
Чтобы отфильтровать экземпляры, которые позволяют нам выполнять определенный метод, мы можем передать имя метода, например, Create (что всегда интересно, потому что может позволить нам что-то создать):
Get-CimClass -MethodName Create
Чтобы еще больше сузить круг вопросов, чтобы перечислить доступные методы для определенного класса, нам нужно использовать Powershell’s selectс
переключателем —ExpandProperty:
С участием Get-WmiObject:
Get-WmiObject -Class Win32_Process -List | select -ExpandProperty Methods
С участием Get-CimClass
:
Get-CimClass -ClassName Win32_Process | select -ExpandProperty CimClassMethods
ПРИМЕЧАНИЕ. Обратите внимание, что значение, переданное в инструкцию select, — это имя столбца, которое мы получили при перечислении классов. Если вы запутались, прокрутите до абзаца, в котором мы перечислили класс, и обратите внимание на разницу вывода между выводом командлетов WMI и CIM.
Итак, у нас есть такие методы, как Create, Terminate, GetOwner, GetOwnerSid
и т. д. Для класса Win32_Process. Очень хорошо. Теперь давайте посмотрим, как мы можем использовать методы.
СОВЕТ: Чтобы использовать метод, нам нужно знать, какие параметры нам нужно предоставить при вызове метода. Чтобы перечислить все доступные параметры, мы можем использовать комбинацию Powershell или лучше просто прочитать документацию.
Использование методов
Invoke-WmiMetho
d (для WMI) и Invoke-CimMethod
(для командлетов CIM) позволяет нам использовать методы для определенного класса. Попробуем создать счетчик:
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList calc.exe
Чтобы использовать командлет CIM, синтаксис немного меняется:
Invoke-CimMethod -ClassName Win32_Process -MethodName create -Arguments @{commandline="calc.exe"}
Установка свойств объектов
И последнее, но не менее важное: мы должны взглянуть на обновление экземпляров класса. Однако важно помнить, что экземпляр должен быть доступен для записи. Написав скрипт, мы можем составить способ для получения всех доступных для записи свойств класса. Вот сценарий (получен из PSMag):
PewOS
, используя `Set-WmiInstance:Set-CimInstance
, но это оставлено на усмотрение читателя.Заключение
Это было долгое чтение! Но теперь к настоящему времени у нас есть прочная основа для командлетов WMI и CIM и того, как их можно использовать для достижения значительного контроля над системой. Спасибо всем кто присутствовал и читал статьи. Всем здоровья.
1 comments On WMI — пространства имен, классы и методы (часть 2)
Здравствуйте . Просьба помочь или хоть указать куда двигаться.Что это: «Ошибка пространство имен CIM root/microsoft/server manager/ недопустимо» . Из-за чего не обновляется клиент сервера (ПК в домене).