PowerShell-диагностика: Win32_DeviceGuard живёт не там, где вы думаете
PowerShell-диагностика: Win32_DeviceGuard живёт не там, где вы думаете Классика: скрипт проверки VBS/HVCI падает с «Недопустимый класс», а команда поиска камер выбрасывает ошибку на машине, где камеры просто нет. Разбираем, где именно зарыта проблема и как писать диагностику, которая не ломается от отсутствия железа. Суть в двух местах. Первое: класс Win32_DeviceGuard находится не в стандартном пространстве root\cimv2, а в root\Microsoft\Windows\DeviceGuard. Поэтому Get-CimInstance -ClassName Win32_DeviceGuard без параметра -Namespace и возвращает ошибку. Правильный вызов: powershell Get-CimInstance ` -ClassName 'Win32_DeviceGuard' ` -Namespace 'root\Microsoft\Windows\DeviceGuard' | Select-Object SecurityServicesConfigured, SecurityServicesRunning, VirtualizationBasedSecurityStatus Расшифровка статусов VBS: 0 — выключена, 1 — настроена, но не работает, 2 — включена и работает. В SecurityServicesRunning значение 1 — это Credential Guard, 2 — HVCI, то есть «Целостность памяти». Мелочь, но без неё вывод читается как ребус. Второе: Get-PnpDevice -Class Camera не универсальна. Если камеры нет, она отключена в BIOS/UEFI или драйвер зарегистрировал устройство как Image/MEDIA/USB, команда может выбросить ошибку. Лечится просто — не считать отсутствие камеры исключением: powershell $Cameras = Get-PnpDevice -Class Camera -ErrorAction SilentlyContinue if ($Cameras) { $Cameras | Select-Object Status, FriendlyName, InstanceId | Format-Table -AutoSize } else { Write-Host 'Камеры класса Camera не обнаружены.' -ForegroundColor Yellow } Если пусто, стоит глянуть devmgmt.msc и разделы «Камеры», «Устройства обработки изображений», «Звуковые, игровые и видеоустройства», «Контроллеры USB» и «Другие устройства». Часто камера там, где её никто не ждал. По Defender всё было корректно: Get-MpComputerStatus — штатный командлет. SmartAppControlState: Off, AMRunningMode: Normal, RealTimeProtectionEnabled: True означают, что Smart App Control выключен, а реальная защита работает. Это не ошибка скрипта, а нормальное состояние. 🛠 Мнение DevGeek.IT: Диагностические скрипты чаще всего ломаются не на сложной логике, а на захардкоженных предположениях. «Класс лежит в cimv2», «камера точно есть», «поле всегда вернётся» — и вот уже красная простыня вместо отчёта. Я всегда пишу проверки так, чтобы отсутствие устройства или класса было валидным результатом, а не падением. И да, namespace — это не деталь. Это половина команды.