Проверяем через Powershell совместимость компьютеров с Windows 11


28 июня 2021


Проверяем совместимость с Windows 11 через Powershell на всех компьютерах AD

Компания Microsoft выпустила новую версию ОС под названием Windows 11. Из-за некоторых технических характеристик может возникнуть сложность в оценке совместимости компьютеров предприятия для перехода на новую версию ОС. В этой статье рассмотрено как выполнить подобную оценку с Powershell и на всех компьютерах Active Directory.

 

Технические требования Windows 11

Список технических требований до сих пор незначительно меняется, но на данный момент он следующий:

Технические требования 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

Получаем объем оперативной памяти в Powershell в GB

Еще один способ - через команду 'Get-ComputerInfo', которая возвращает много информации о характеристиках компьютера. В большинстве случаев - это будет плохой вариант, так как она выполняется дольше (1-4 секунды на один ПК). Преимущество в том, что она более автоматизирована, позволяет удаленную работу через WinRM, а так же возвращает информацию по процессору:

$data = Get-ComputerInfo -Property OsTotalVisibleMemorySize
[int]($data.OsTotalVisibleMemorySize/1mb)

Получаем объем оперативной памяти в Powershell в GB с Get-ComputerInfo

 

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

Получаем информацию о TMP в Powershell

Результат можно преобразовать в булево значение:

[bool](Get-CimInstance -Namespace $path -Query $query)

Получаем информацию о TMP в Powershell в булевом значении

Если у вас нет этого модуля, то вы можете попробовать его включить через 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

Получаем информацию о свободном месте на диске с Powershell

 

 

Процессор

Информация по процессору, мы можем вернуть с CIM и 'Get-ComputerInfo':

(Get-CimInstance -ClassName "Win32_Processor").Name

(Get-ComputerInfo -Property CsProcessors).CsProcessors.Name

Получаем модель процессора в Powershell

Учитывая, что Windows 11 совместим только с определенным списком процессоров, нам нужно выполнить дополнительную проверку. Я использую файл 'CSV', скаченный с github. Учитывая, что полное название процессора может отличаться от того что в файле CSV, возьмем за основу только название моделей (без брендов):

Import-Csv -Path "F:\proc.csv" -Header 'Brand','Type','Model' | select Model

Список поддерживаемых процессоров Windows 11 и их импорт в Powershell

Следующим образом мы проверим вхождение подстроки с моделью в полное наименование процессора:

# получаем текущий процессор
$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

Проверка поддержки процессора Windows 11 с Powershell и CIM

Мы можем выполнить эту проверку одной командой:

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

Проверяем совместимость компьютера с Windows 11 с Powershell

Мы можем выполнить проверку удаленно с использованием '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)

Проверяем совместимость компьютера с Windows 11 с Powershell удаленно

И вариант работы со всем 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
}

Проверяем совместимость компьютера с Windows 11 с Powershell во всем AD

 

...

Теги: #powershell #ad


Каналы
Telegram FixMyPc Telegram Лента FixMyPC RSS Rss
Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, приобретённого опыта и лучшие практики в системном администрировании и программировании.