Представьте ситуацию: компьютер начал тормозить, вы не знаете, что его грузит, и стандартные инструменты кажутся недостаточными. Вот здесь и появляется 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.
Глубокое погружение в главные настройки 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 руб. - это топливо для новых статей, скриптов и пошаговых инструкция для Вас. Большое Спасибо понимающим! 🙏
💰ПОДДЕРЖАТЬ КАНАЛ МОЖНО ТУТ ( ОТ 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 и обладает лучшей производительностью при работе с большими объёмами данных.
Канал «Каморка Программиста» — это простые разборы программирования, языков, фреймворков и веб-дизайна. Всё для новичков и профессионалов.
Присоединяйся прямо сейчас.
Практические сценарии диагностики 📊
Сценарий 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
Красочный вывод помогает мгновенно увидеть проблемы.
Результаты и что они дают 💪
Использование WMI для диагностики даёт вам непосредственные преимущества:
Автоматизация: Вместо ручной проверки инструментов вы запускаете скрипт и получаете полную картину в считаные секунды.
Удалённая диагностика: Проверяйте состояние других компьютеров в сети без установки утилит на каждый из них.
Программная интеграция: Встроенные данные WMI можно передавать в другие системы мониторинга, базы данных, отправлять уведомления.
Полнота информации: WMI предоставляет данные на уровне операционной системы, которые недоступны стандартным инструментам.
Независимость от версии Windows: Код, написанный для Windows 7, будет работать на Windows 25H2 практически без изменений.
Откат и восстановление при ошибках 🔄
Если что-то пошло не так, вот как вернуться в безопасное состояние:
Способ 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-индустрии.
#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