Найти в Дзене
Т.Е.Х.Н.О Windows & Linux

🔧 WMI для диагностики — инструмент профессионалов, который вас поразит своими возможностями 💡

Представьте ситуацию: компьютер начал тормозить, вы не знаете, что его грузит, и стандартные инструменты кажутся недостаточными. Вот здесь и появляется Windows Management Instrumentation (WMI) — мощный, но часто недооценённый инструмент диагностики, встроенный прямо в операционную систему. Если вы работаете с Windows 25H2 (актуальное состояние на январь 2026 года), то у вас уже есть доступ к полнофункциональной инфраструктуре WMI, способной выполнять задачи, для которых потребовались бы дорогостоящие утилиты сторонних разработчиков. WMI — это не просто набор команд, это целая экосистема управления системой. Через WMI вы получаете доступ к информации о каждом процессе, каждом сервисе, каждом диске и даже микросхеме BIOS вашего компьютера. Всё это доступно через несколько строк кода на PowerShell, и вам не нужны никакие лицензии или установки дополнительного программного обеспечения. Прежде чем погружаться в сложные команды, запомните самую простую: Get-WmiObject -Class Win32_Process | S
Оглавление

Представьте ситуацию: компьютер начал тормозить, вы не знаете, что его грузит, и стандартные инструменты кажутся недостаточными. Вот здесь и появляется Windows Management Instrumentation (WMI) — мощный, но часто недооценённый инструмент диагностики, встроенный прямо в операционную систему. Если вы работаете с Windows 25H2 (актуальное состояние на январь 2026 года), то у вас уже есть доступ к полнофункциональной инфраструктуре WMI, способной выполнять задачи, для которых потребовались бы дорогостоящие утилиты сторонних разработчиков.

WMI — это не просто набор команд, это целая экосистема управления системой. Через WMI вы получаете доступ к информации о каждом процессе, каждом сервисе, каждом диске и даже микросхеме BIOS вашего компьютера. Всё это доступно через несколько строк кода на PowerShell, и вам не нужны никакие лицензии или установки дополнительного программного обеспечения.

Первый лайфхак для новичков ✨

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

Get-WmiObject -Class Win32_Process | Sort-Object WorkingSetSize -Descending | Select-Object -First 5

Эта одна команда покажет вам пять процессов, которые сейчас больше всего занимают оперативную память. Никаких диспетчеров задач, никаких интерфейсов — чистая, беспристрастная информация. Скопируйте, вставьте в PowerShell и запустите. Вот вам и первое знакомство с WMI.

-2

Глубокое погружение в главные настройки WMI 🛠️

1. Инициализация и базовая подготовка WMI сервиса

Перед тем как использовать WMI на полную мощность, необходимо убедиться, что он работает корректно. В Windows 25H2 сервис WMI (wmiPrvSE.exe) работает по умолчанию, но иногда может потребоваться его перезагрузка или переинициализация.

Проверка статуса WMI сервиса:

# Проверить статус сервиса WMI
Get-Service -Name "Winmgmt" | Select-Object Name, Status, StartType

# Перезагрузить сервис WMI (требует прав администратора)
Restart-Service -Name "Winmgmt" -Force

# Проверить логи WMI
Get-EventLog -LogName System -Source "WMI" -Newest 10

Этот набор команд даёт вам полный контроль над сервисом. Если вы видите статус "Stopped", то WMI попросту не включен. Команда Restart-Service решит эту проблему быстро и эффективно.

2. Работа с пространствами имён WMI (Namespaces)

Это критически важная настройка, которую часто упускают. WMI организован в виде древовидной структуры пространств имён. Каждое пространство имён содержит классы, связанные с определённой областью системы.

Основные пространства имён в Windows 25H2:

  • root\CIMV2 — стандартное пространство, содержит большинство системных классов (процессы, сервисы, диски);
  • root\WMI — классы, связанные с инфраструктурой WMI;
  • root\cimv2\Win32_PerfFormattedData — классы производительности;
  • root\SecurityCenter2 — информация об антивирусах и защите;
  • root\StandardCimv2 — расширенные CIM классы.

Команды для работы с пространствами имён:

# Получить список всех пространств имён
Get-WmiObject -Namespace "root" -
Class __Namespace | Select-Object Name

# Посмотреть классы в конкретном пространстве имён
Get-WmiObject -Namespace "root\CIMV2" -List | Where-Object {$_.Name -like "Win32*"} | Select-Object Name

# Подсчитать количество классов в пространстве
(Get-WmiObject -Namespace "root\CIMV2" -List).Count

Профессиональный совет: запомните команду выше как шаблон. Она позволит вам быстро ориентироваться в структуре WMI и находить нужные классы.

========================

✅ Подпишитесь на канал - (это бесплатно и очень помогает алгоритму)
❤️ Поставьте лайк - (это один клик, а нам очень важно)
🔄 Репостните друзьям - (которые играют в танки и жалуются на FPS)
💰 Задонатьте (Даже 50 руб. - это топливо для новых статей, скриптов и пошаговых инструкция для Вас. Большое Спасибо понимающим! 🙏
-3
💰ПОДДЕРЖАТЬ КАНАЛ МОЖНО ТУТ ( ОТ 50 РУБЛЕЙ )💰
Или сделать любой перевод по ССЫЛКЕ или QR-коду через СБП. Быстро, безопасно и без комиссии. ( Александр Г. ) "Т.Е.Х.Н.О Windows & Linux".

=========================

3. Запросы через WQL (WMI Query Language)

WQL — это язык запросов, похожий на SQL, но специально разработанный для WMI. Он может быть мощнее простых фильтров.

Основной синтаксис:

# Простой запрос для получения всех запущенных процессов
Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE State = 'Ready'"

# Запрос с фильтром по имени процесса
Get-WmiObject -Query "SELECT Name, ProcessId, Priority FROM Win32_Process WHERE Name LIKE '%notepad%'"

# Запрос для получения сервисов с определённым статусом
Get-WmiObject -Query "SELECT DisplayName, Name, State, StartMode FROM Win32_Service WHERE StartMode = 'Auto' AND State != 'Running'"

# Запрос к данным о диске
Get-WmiObject -Query "SELECT DeviceID, Size, FreeSpace FROM Win32_LogicalDisk WHERE DriveType = 3" | ForEach-Object {
$PercentFree = ($_.FreeSpace / $_.Size) * 100
[PSCustomObject]@{
Диск = $_.DeviceID
"Общий размер (ГБ)" = [math]::Round($_.Size / 1GB, 2)
"Свободно (ГБ)" = [math]::Round($_.FreeSpace / 1GB, 2)
"Свободно (%)" = [math]::Round($PercentFree, 2)
}
}

Используйте WQL, когда нужны сложные условия. Это работает быстрее, чем последовательная фильтрация в PowerShell.

4. Работа с удалёнными компьютерами (Remote Diagnostics)

Windows 25H2 позволяет получать данные WMI с других компьютеров в сети. Это бесценно для системных администраторов.

Диагностика удалённого компьютера:

# Получить информацию о процессах на удалённом ПК
$computerName = "192.168.1.100"
Get-WmiObject -
Class Win32_Process -ComputerName $computerName | Sort-Object WorkingSetSize -Descending | Select-Object -First 10

# Проверить дисковое пространство на нескольких ПК
$computers = "PC01", "PC02", "PC03"
foreach ($computer in $computers) {
$disks = Get-WmiObject -
Class Win32_LogicalDisk -Filter "DriveType=3" -ComputerName $computer -ErrorAction SilentlyContinue
foreach ($disk in $disks) {
$freePercent = ($disk.FreeSpace / $disk.Size) * 100
[PSCustomObject]@{
ПК = $computer
Диск = $disk.DeviceID
"Свободно %" = [math]::Round($freePercent, 2)
"Свободно ГБ" = [math]::Round($disk.FreeSpace / 1GB, 2)
}
}
}

# Проверить статус антивируса на удалённых ПК (требует учётные данные)
$credential = Get-Credential
Get-WmiObject -
Class AntiVirusProduct -Namespace "root\SecurityCenter2" -ComputerName $computers -Credential $credential

Лайфхак: используйте -ErrorAction SilentlyContinue при работе с группами компьютеров, чтобы скрипт не завершался при недоступности одного из них.

5. Использование Get-CimInstance вместо Get-WmiObject

В современных версиях PowerShell рекомендуется использовать Get-CimInstance вместо устаревшего Get-WmiObject. Это более универсальный и быстрый способ.

Преимущества Get-CimInstance:

# Get-CimInstance работает с CIM сессиями, что позволяет переиспользовать соединения
$session = New-CimSession -ComputerName "PC01"
Get-CimInstance -ClassName Win32_Process -CimSession $session -
Filter "Name='cmd.exe'"
Remove-CimSession $session

# Фильтрация свойств для экономии трафика
Get-CimInstance -ClassName Win32_Process -Property Name, ProcessId, WorkingSetSize | Select-Object Name, ProcessId, @{Label="ОЗУ МБ"; Expression={[math]::Round($_.WorkingSetSize / 1MB, 2)}}

# Запрос со сложным фильтром и сортировкой
Get-CimInstance -ClassName Win32_Process -
Filter "WorkingSetSize > 104857600" | Sort-Object WorkingSetSize -Descending | Select-Object Name, @{Label="ОЗУ ГБ"; Expression={[math]::Round($_.WorkingSetSize / 1GB, 2)}}

Get-CimInstance более актуален для Windows 25H2 и обладает лучшей производительностью при работе с большими объёмами данных.

-4
Канал «Каморка Программиста» — это простые разборы программирования, языков, фреймворков и веб-дизайна. Всё для новичков и профессионалов.
-5
Каморка Программиста | Дзен
Присоединяйся прямо сейчас.

Практические сценарии диагностики 📊

Сценарий 1: Поиск утечек памяти

# Получить процессы, которые занимают более 500 МБ оперативной памяти
$threshold = 500MB
Get-WmiObject -
Class Win32_Process |
Where-Object {$_.WorkingSetSize -gt $threshold} |
Sort-Object WorkingSetSize -Descending |
Select-Object @{Label="Процесс"; Expression={$_.Name}},
@{Label="ID"; Expression={$_.ProcessId}},
@{Label="ОЗУ МБ"; Expression={[math]::Round($_.WorkingSetSize / 1MB, 2)}},
@{Label="ЦПУ сек"; Expression={[math]::Round(($_.KernelModeTime + $_.UserModeTime) / 10000000, 2)}} |
Format-Table -AutoSize

Запустите этот скрипт с периодичностью в несколько часов. Если какой-то процесс постоянно растёт в памяти, это явный признак утечки.

Сценарий 2: Анализ работающих сервисов

# Получить все сервисы, которые должны быть запущены, но не запущены
Get-WmiObject -
Class Win32_Service |
Where-Object {$_.StartMode -eq "Auto" -and $_.State -ne "Running"} |
Select-Object @{Label="Сервис"; Expression={$_.DisplayName}},
@{Label="Имя"; Expression={$_.Name}},
@{Label="Статус"; Expression={$_.State}},
@{Label="Запуск"; Expression={$_.StartMode}} |
Format-Table -AutoSize

# Перезагрузить зависший сервис
$serviceName = "ServiceName"
$service = Get-WmiObject -
Class Win32_Service -Filter "Name='$serviceName'"
$service.StopService()
Start-Sleep -Seconds 2
$service.StartService()

Это спасает, когда сервис зависает и не хочет перезагружаться стандартным способом.

Сценарий 3: Проверка состояния диска перед критическими работами

# Получить информацию о дисковом пространстве с предупреждениями
Get-WmiObject -
Class Win32_LogicalDisk -Filter "DriveType=3" |
Select-Object @{Label="Диск"; Expression={$_.DeviceID}},
@{Label="Общий размер ГБ"; Expression={[math]::Round($_.Size / 1GB, 2)}},
@{Label="Свободно ГБ"; Expression={[math]::Round($_.FreeSpace / 1GB, 2)}},
@{Label="Свободно %"; Expression={
$percent = ($_.FreeSpace / $_.Size) * 100
if ($percent -lt 10) { "🔴 " + [math]::Round($percent, 2) }
elseif ($percent -lt 25) { "🟡 " + [math]::Round($percent, 2) }
else { "🟢 " + [math]::Round($percent, 2) }
}} |
Format-Table -AutoSize

Красочный вывод помогает мгновенно увидеть проблемы.

-6

Результаты и что они дают 💪

Использование WMI для диагностики даёт вам непосредственные преимущества:

Автоматизация: Вместо ручной проверки инструментов вы запускаете скрипт и получаете полную картину в считаные секунды.

Удалённая диагностика: Проверяйте состояние других компьютеров в сети без установки утилит на каждый из них.

Программная интеграция: Встроенные данные WMI можно передавать в другие системы мониторинга, базы данных, отправлять уведомления.

Полнота информации: WMI предоставляет данные на уровне операционной системы, которые недоступны стандартным инструментам.

Независимость от версии Windows: Код, написанный для Windows 7, будет работать на Windows 25H2 практически без изменений.

-7

Откат и восстановление при ошибках 🔄

Если что-то пошло не так, вот как вернуться в безопасное состояние:

Способ 1: Перезагрузка сервиса WMI

# Остановить сервис WMI
Stop-Service -Name "Winmgmt" -Force

# Дождаться полной остановки
Start-Sleep -Seconds 3

# Запустить сервис заново
Start-Service -Name "Winmgmt"

# Проверить, что сервис запущен
Get-Service -Name "Winmgmt" | Select-Object Name, Status

Способ 2: Очистка репозитория WMI

# Команда для переинициализации WMI репозитория (требует администратора)
# Это более глубокий откат
winmgmt /salvagerepository

# Или полная переинициализация (внимание — может занять время)
winmgmt /resetrepository

Способ 3: Проверка консистентности WMI

# Проверить целостность WMI репозитория
Get-WmiObject -
Class __Namespace -Namespace "root" | Out-Null

# Если ошибка, попробуйте переустановку WMI поставщика
Get-WmiObject -
Class Win32_SystemDriver | Where-Object {$_.Name -like "*WMI*"} | Select-Object Name, State

Вопросы и ответы 🤔❓

Вопрос: Почему Get-WmiObject показывает ошибку «доступ запрещён»?

Ответ: Возможно, скрипт запущен без прав администратора. Откройте PowerShell от администратора и повторите команду. Либо текущий пользователь не входит в группу администраторов, что требуется для доступа к некоторым WMI классам.

Вопрос: Какая разница между Get-WmiObject и Get-CimInstance?

Ответ: Get-WmiObject — более старый, но всё ещё поддерживаемый командлет. Get-CimInstance — более новый, быстрый и рекомендуемый вариант. Для Windows 25H2 лучше использовать Get-CimInstance.

Вопрос: Можно ли получить WMI данные из скрытого процесса?

Ответ: WMI показывает только те процессы, которые видны для текущего уровня привилегий. Для просмотра всех процессов нужны права администратора. Сама структура данных в WMI не может скрыть информацию — это уровень операционной системы.

Вопрос: Насколько безопасно использовать WMI скрипты в автоматизации?

Ответ: Это одна из самых безопасных форм автоматизации. WMI работает внутри защиты Windows и требует явной авторизации. Просто не раздавайте скрипты с опасными операциями (удаление, изменение конфигурации) неопытным пользователям.

Вопрос: Что делать, если WMI запросы работают медленно?

Ответ: Используйте фильтры и выборку конкретных свойств. Вместо Get-WmiObject -Class Win32_Process используйте Get-WmiObject -Class Win32_Process -Filter "Name='calc.exe'" -Property Name, ProcessId. Это значительно ускорит запрос.

Вопрос: Можно ли создавать собственные WMI классы?

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

Призыв к действию 🎯

Если вам понравилась эта статья и она помогла вам разобраться с WMI, то:

👉 Подпишитесь на канал "T.E.X.H.O Windows & Linux" — здесь вы найдёте ещё больше глубоких технических материалов.

👍 Поставьте лайк — это мотивирует создавать более качественный контент.

🔄 Сделайте репост — поделитесь знаниями с коллегами и друзьями.

💰 Поддержите канал донатом — если статья сэкономила вам часы работы, рассмотрите вариант финансовой поддержки.

Ваша поддержка помогает нам создавать исследовательский и практический контент, который используют профессионалы во всём русскоязычном сегменте IT-индустрии.

-8

#WMI #WindowsManagementInstrumentation #PowerShell #DiagnosticsTools #SystemAdministration #Windows25H2 #WindowsDiagnostics #RemoteManagement #PerformanceMonitoring #ScriptAutomation #ITAdministration #SystemMonitoring #PowerShellScripting #ComputerDiagnostics #WindowsSystem #TroubleshootingTools #AdminTools #SystemHealth #AutomationScripts #OperatingSystem #WindowsServer #SystemOptimization #PerformanceAnalysis #NetworkDiagnostics #ServerManagement #DiskSpaceMonitoring #ProcessManagement #ServiceManagement #HardwareDiagnostics #TechArticles