В этой статье мы рассмотрим, как массово проверить ваши компьютеры на совместимость с Windows 11 с помощью PowerShell скрипта. За основу можно взять официальный скрипт HardwareReadiness.ps1 от Microsoft (https://aka.ms/HWReadinessScript).
Данный скрипт проверяет, что компьютер удовлетворяет следующим минимальным требованиям, необходимым для запуска Windows 11:
- Совместимый x64 процессор (полный список поддерживаемых CPU)
- 4+ ГБ RAM
- Минимальный размер диска 64 ГБ
- Устройство с UEFI и включенной Secure Boot
- Видеокарта совместимая с DirectX 12 и WDDM 2.0 драйверов
- TPM 2.0 модуль
- Монитор с разрешением 720x
Чтобы вручную проверить совместимость отдельного компьютера с Windows 11,
- Cкачайте скрипт HardwareReadiness.ps1 по ссылке выше.
- Откройте консоль Windows PowerShell с правами администратора (в скрипте используется командлет Get-WMIObject, который не поддерживается в более новой версии PowerShell Core)
- Разрешите запуск PowerShell скрипта в текущей сессии:
Set-ExecutionPolicy -Scope Process RemoteSigned
- Выполните скрипт:
.\HardwareReadiness.ps1
Скрипт вернул код 0. Это значит, что компьютер совместим с требованиями Windows 11 (
returncode:0
,
resurnresult=CAPABLE
).
{"returnCode":0,"returnReason":"","logging":"Storage: OSDiskSize=427GB. PASS; Memory: System_Memory=32GB. PASS; TPM: TPMVersion=2.0, 0, 1.38. PASS; Processor: {AddressWidth=64; MaxClockSpeed=3901; NumberOfLogicalCores=12; Manufacturer=AuthenticAMD; Caption=AMD64 Family 25 Model 80 Stepping 0; }. PASS; SecureBoot: Capable. PASS; ","returnResult":"CAPABLE"}
Если нужно проверить множество корпоративных компьютеров на совместимость с Windows 11, тогда для распространения этого скрипта и сбора информации можно использовать такие инструменты как SCCM, Intune или даже WSUS для запуска сторонних скриптов. В самом простом случае можно запустить этот PowerShell скрипт с помощью групповых политик и сохранить результаты в свойства компьютера в Active Directory.
Код скрипт нужно немного модифицировать.
Отредактируйте файл HardwareReadiness.ps1 и добавьте в конце следующий код перед блоком #SIG # Begin signature block:
$outObject = $outObject | ConvertTo-Json -Compress
$computer = $env:COMPUTERNAME
$ComputerSearcher = New-Object DirectoryServices.DirectorySearcher
# Укажите ваше имя домена
$ComputerSearcher.SearchRoot = "LDAP://DC=CONTOSO,DC=COM"
$ComputerSearcher.Filter = "(&(objectCategory=Computer)(CN=$Computer))"
$computerObj = [ADSI]$ComputerSearcher.FindOne().Path
$computerObj.Put( "Info", $outObject )
$computerObj.SetInfo()
Данный код запишет в атрибут компьютера Info в Active Directory информацию о совместимости с Windows 11.
Скопируйте скрипт в папку
\\winitpro.loc\Netlogon
на контроллере домена.
Откройте консоль управления доменными групповыми политиками (
gpmc.msc
) и создайте новую GPO для OU с компьютерами.
Перейдите в раздел Computer Configuration -> Policies -> Windows Settings -> Scripts (Startup / Shutdown) -> Startup -> вкладка PowerShell Scripts и укажите UNC путь к скрипту HardwareReadiness.ps1
В разделе Computer Configuration -> Administrative Templates -> System -> Group Policy. Включите политику Configure Logon Script Delay и задайте 1 минуту задержки запуска скрипта.
Также включите параметр Always wait for the network at computer startup and logon в Computer Configuration -> Admin Templates -> System -> Logon.
Перезагрузите компьютер. Запустите консоль ADUC (
dsa.msc
), и откройте свойства компьютера. Перейдите на вкладку редактора атрибутов и проверьте, что в параметре Info теперь содержится результаты проверки компьютера на совместимость с Windows 11.
После того, как логон скрипт отработает на всех компьютерах, вы можете быстро вывести информацию о совместимых и не совместимых компьютерах из Active Directory с помощью командлета Get-ADComputer.
Get-ADComputer -Filter {enabled -eq "true"} -properties *| Where-Object {$_.info -ne $null}
Чтобы вывести более подробную информацию о несовместимых компьютерах и оборудовании, которое не удовлетворяют минимальным требованиям, выполните:
$Report = @() $computers = Get-ADComputer -Filter {enabled -eq "true"} -properties *| Where-Object { $_.Info -match '"returnCode":1'} foreach ($computer in $computers){ $jsonString =$computer.info $object = $jsonString | ConvertFrom-Json $returnReasonValues = $object.returnReason -split ', ' $CompInfo = [PSCustomObject]@{ "Computer" = $computer.name "NonCompatibleItems" = $returnReasonValues } $Report += $CompInfo } $Report|fl
Добрый день, есть возможность подсказать, через GPO настроил на группу пк, добавил в эту группу ноут который ходит по vpn, на локальных пк все ок, на ноуте через vpn политика отработала но в info нечего так и не приехало.
Политика отрабатывает при загрузке компьютера. В вашем случае при загрузке компьютера очевидно, что VPN не активен, поэтому скрипт не отрабатывает.
Здесь наверно как вариант сделать запуск скрипта через отложенное задание планировщика, запускающееся от имени system.
У меня вот такую ерунду в info выдает {«returnCode»:-1,»returnReason»:»»,»logging»:»Storage: OSDiskSize=238GB. PASS; Memory: System_Memory=16GB. PASS; TPM: TPMVersion=2.0, 0, 1.38. PASS; Processor: {AddressWidth=64; MaxClockSpeed=3600; NumberOfLogicalCores=8; Manufacturer=GenuineIntel; Caption=Intel64 Family 6 Model 165 Stepping 3; }. PASS; SecureBoot: Undetermined. UNDETERMINED; UnauthorizedAccessException Не удалось задать подходящие привилегии. В доступе отказано.; «,»returnResult»:»UNDETERMINED»}
Никак победить не могу
Ошибка на моменте получения статуса SecureBoot. В скрипте HardwareReadiness.ps1 за это отвечают строки:
# SecureBooot
try {
$isSecureBootEnabled = Confirm-SecureBootUEFI
$outObject.logging += $logFormatWithBlob -f $SECUREBOOT_STRING, $CAPABLE_STRING, $PASS_STRING
UpdateReturnCode -ReturnCode 0
}
Ниже обработка ошибок. Судя по всему, статус Confirm-SecureBootUEFI нельзя получить без прав администратора. Как вариант, это раздел можно поправить на другую функцию, которая будет провереть наличие SecureBoot без прав админа