Компания Microsoft выпустила новую версию ОС под названием Windows 11. Из-за некоторых технических характеристик может возникнуть сложность в оценке совместимости компьютеров предприятия для перехода на новую версию ОС. В этой статье рассмотрено как выполнить подобную оценку с Powershell и на всех компьютерах Active Directory.
Технические требования Windows 11
Список технических требований до сих пор незначительно меняется, но на данный момент он следующий:
Главной проблемой, с которой сталкиваются пользователи, эта поддержка TPM 2.0. Из-за сложности в поставке таких компьютеров в Россию не на всех компьютерах он имеется в виде отдельного модуля. Как многие отписываются - вы можете эмулировать это устройство если ваш процессор это поддерживает. Например это можно сделать с Intel® Platform Trust Technology.
Вы так же можете выполнить проверку с программой "PC Health Check" от Microsoft, но она работает с перебоями.
Еще одна проблема - совместимость процессоров. Microsoft опубликовал список совместимых процессоров, а я поместил их в формате CSV на github. Эта статья будет опираться на этот список.
Поддержка Windows 10 закончится 14 октября 2025 года.
В некоторых новостях можно прочитать, что требование к TPM 2.0, а так же процессорам может измениться. Windows 11 может выйти 20 октября 2021 года.
Память
Мы можем узнать память двумя способами. Первый - через класс CIM Win32_PhysicalMemory:
(Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum/1gb
Еще один способ - через команду 'Get-ComputerInfo', которая возвращает много информации о характеристиках компьютера. В большинстве случаев - это будет плохой вариант, так как она выполняется дольше (1-4 секунды на один ПК). Преимущество в том, что она более автоматизирована, позволяет удаленную работу через WinRM, а так же возвращает информацию по процессору:
$data = Get-ComputerInfo -Property OsTotalVisibleMemorySize
[int]($data.OsTotalVisibleMemorySize/1mb)
TPM 2.0
Для определения TPM в Powershell есть отдельная команда, которая не показывает версию TPM - 'Get-TPM'. Мы можем узнать есть ли TPM 2.0 через CIM запрос:
$query = "Select * from win32_tpm where SpecVersion like '%2.0%'"
$path = 'root\cimv2\security\microsofttpm'
Get-CimInstance -Namespace $path -Query $query
Результат можно преобразовать в булево значение:
[bool](Get-CimInstance -Namespace $path -Query $query)
Если у вас нет этого модуля, то вы можете попробовать его включить через UEFI(BIOS) или в гипервизоре (если используете его).
Диск
Для установки Windows 11 нужно 64 Gb свободного места. Обычно этот параметр завышен примерно в 2 раза. В случае Windows Server 2019 говорится про 32 Gb, а фактически она занимает 10 Gb (с установленной ролью AD). Аналогичное было и с другими ОС. Возможно это объем, который понадобится для обновления.
Так мы получим информацию по свободному месту на диске 'C':
$disk = [int](((Get-PSDrive -Name 'C').Free)/1Gb)
$disk -ge 60
Процессор
Информация по процессору, мы можем вернуть с CIM и 'Get-ComputerInfo':
(Get-CimInstance -ClassName "Win32_Processor").Name
(Get-ComputerInfo -Property CsProcessors).CsProcessors.Name
Учитывая, что Windows 11 совместим только с определенным списком процессоров, нам нужно выполнить дополнительную проверку. Я использую файл 'CSV', скаченный с github. Учитывая, что полное название процессора может отличаться от того что в файле CSV, возьмем за основу только название моделей (без брендов):
Import-Csv -Path "F:\proc.csv" -Header 'Brand','Type','Model' | select Model
Следующим образом мы проверим вхождение подстроки с моделью в полное наименование процессора:
# получаем текущий процессор
$current_proc = (Get-CimInstance -ClassName "Win32_Processor").Name
# получаем массив с моделями процессоров
$models = (Import-Csv -Path "F:\proc.csv" -Header 'Brand','Type','Model').Model
# значение по умолчанию
$result = $false
foreach ($model in $models){
# проверяем, что наша модель есть в списке
if ($current_proc -like "*$model*"){
# если модель есть, то выводим ее
# и меняем значение по умолчанию
$model
$result = $true
# останавливаем поиск, если нашли совпадение
break
}
}
$result
Альтернативно мы можем использовать класс 'Win32_DeviceGuard', который так же связан с поддержкой Windows 11. Как пишут некоторые авторы именно от значения параметра "AvailableSecurityProperties" и должна зависеть поддержка процессора. На нужна цифра 7:
Get-CimInstance -Namespace ROOT\Microsoft\Windows\DeviceGuard -ClassName Win32_DeviceGuard
Мы можем выполнить эту проверку одной командой:
7 -in (Get-CimInstance -Namespace ROOT\Microsoft\Windows\DeviceGuard -ClassName Win32_DeviceGuard).AvailableSecurityProperties
Создаем функцию
Создадим функцию, которая объединит работу предыдущих примеров. Отмечу, что функция проверялась только на тестовом стенде. Учитывайте так же, что "PC Health Check" от Microsoft, не у всех работает корректно, а методы получения данных идентичны (скорее всего) с теми, что описаны в статье:
function Get-Windows11Compability{
[CmdletBinding()]
param
(
[Parameter(ValueFromPipeline)]
[string]$ComputerName,
[Parameter(Mandatory, Position=0)]
[string[]]$Models
)
process {
# массив в который поместим все найденное
$result = [PSCustomObject]@{}
# название компьютера
if (-not ($ComputerName)){
$ComputerName = hostname
}
Add-Member -InputObject $result -Name 'Computer' -Value $ComputerName -MemberType NoteProperty
# получаем информацию по памяти
$memory = (Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum/1gb
Add-Member -InputObject $result -Name 'Memory' -Value $($memory -ge 4) -MemberType NoteProperty
# получаем информацию по TPM
$query = "Select * from win32_tpm where SpecVersion like '%2.0%'"
$namespace = 'root\cimv2\security\microsofttpm'
$value = [bool](Get-CimInstance -Namespace $namespace -Query $query)
Add-Member -InputObject $result -Name 'TPM' -Value $value -MemberType NoteProperty
# информация по диску
$disk = [int](((Get-PSDrive -Name 'C').Free)/1Gb)
Add-Member -InputObject $result -Name 'Storage' -Value $($disk -ge 60) -MemberType NoteProperty
# процессор
$current_proc = (Get-CimInstance -ClassName "Win32_Processor").Name
$proc = $false
foreach ($model in $Models){
if ($current_proc -like "*$model*"){
$proc = $true
break
}
Add-Member -InputObject $result -Name 'Processor' -Value $proc -MemberType NoteProperty
return $result
}
}
}
Файл с моделями процессоров у вас может находиться в другом месте и он будет передаваться отдельно.
Так мы выполним проверку совместимости локально:
$models = (Import-Csv -Path "F:/proc.csv" -Header 'Brand','Type','Model').Model
Get-Windows11Compability -Models $models
Мы можем выполнить проверку удаленно с использованием 'Invoke-Command':
$models = (Import-Csv -Path "F:/proc.csv" -Header 'Brand','Type','Model').Model
Invoke-Command -ComputerName 'localhost' `
-ScriptBlock ${Function:Get-Windows11Compability} `
-ArgumentList ([PSCustomObject]@{'Models'=$models}) `
-Credential $(Get-Credential)
И вариант работы со всем AD. Тут учтено, что какой-то из компьютеров может быть выключен или осиротевший за счет параметра игнорирующий ошибки (ErrorAction):
$computers = Get-ADComputer -Filter *
foreach ($computer in $computers){
# Используем DNSHostName или Name
Invoke-Command -ComputerName $computer.DNSHostName `
-ScriptBlock ${Function:Get-Windows11Compability} `
-ArgumentList ([PSCustomObject]@{'Models'=$models}) `
-Credential $(Get-Credential) `
-ErrorAction SilentlyContinue
}
...
Подписывайтесь на наш Telegram канал
Теги: #powershell #ad