Информация о сборке ОС с PowerShell

Вопрос или проблема

У меня есть 2 компьютера в нашей сети, с которых я извлекаю информацию об операционной системе. Оба компьютера работают на Windows 10 с ОС Build 19044. У одного из них ОС Build 19044.1526, у другого – ОС Build 19044.1566.

Поле «OperatingSystemVersion» будет показывать только 19044.

Может кто-нибудь помочь мне найти способ (если это возможно) получить часть 1526 или 1566 ОС Build, используя Powershell. Когда я использую приложение WINVER, я вижу Версию 21H2 (OS Build 19044.1566).

Это дает мне надежду, что Powershell сможет точно извлечь данные откуда-то.

Пример скрипта ниже:

cls

Get-ADComputer -Filter 'enabled -eq "true"' ` -Properties Name,Operatingsystem,OperatingSystemVersion,IPv4Address,description,homedrive,lastbadpasswordattempt,lastlogon, lastlogon Sort-Object -Property OperatingsystemVersion |

Select-Object -Property description,Name,Operatingsystem,OperatingSystemVersion,osbuild | export-csv y:\files\All_Computer_by_OSVersion_summary.csv 

Нет, эта информация на самом деле не хранится в директории. То, что вы видите в PowerShell, это практически то, что содержится в соответствующем объекте «Компьютер» AD, который вы бы увидели через прямой LDAP доступ.1

Если у вас нет других инструментов управления, вам нужно удалённо получить доступ к самому компьютеру, например, через WMI Get-WmiObject или WinRM Invoke-Command (если его брандмауэр настроен на это разрешение).


1 (Например, если вы подключились к AD через ADSIEdit или Apache Directory Studio.)

Если вы запускаете команду локально на одном из ПК, выполните следующее:

Get-ComputerInfo -Property "WindowsUBR"

Вы можете выполнить следующее удалённо

Invoke-Command -ComputerName "COMPUTERNAME" -ScriptBlock {  (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name "UBR").UBR }

Измените “COMPUTERNAME” на имена ПК.

Вы можете получить эту информацию, проверив реестр компьютеров. (вам понадобятся административные права на удалённых компьютерах)

$cred = Get-Credential -Message "Пожалуйста, введите учётные данные администратора"

# Get-ADComputer по умолчанию уже возвращает эти свойства:
# DistinguishedName, DNSHostName, Enabled, Name, ObjectClass, ObjectGUID, SamAccountName, SID,  UserPrincipalName

# запрашивайте только те свойства, которые вам нужны в выводе
$propsToFetch="Operatingsystem", 'OperatingSystemVersion', 'Description'
Get-ADComputer -Filter 'enabled -eq "true"' -Properties $propsToFetch |
Sort-Object -Property OperatingSystemVersion |
ForEach-Object {
    if (Test-Connection -ComputerName $_.Name -Count 1 -Quiet) {
        # заставить удалённый компьютера вернуть форматированную строку 'BuildNumber.ReleaseId'
        $osBuild = Invoke-Command -ComputerName $_.Name -Credential $cred -ScriptBlock {
            '{0}.{1}' -f 
            (Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name CurrentBuildNumber),
            (Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name UBR)
        }
    }
    else {
        $osBuild = 'Неизвестно; Компьютер отключён'
    }
    $_ | Select-Object Description, Name, Operatingsystem, OperatingSystemVersion,
                       @{Name="osbuild"; Expression = {$osBuild}}
} | Export-Csv -Path 'y:\files\All_Computer_by_OSVersion_summary.csv' -NoTypeInformation 

Ответ или решение

В современном IT-мире системные администраторы и другие специалисты часто сталкиваются с задачей получения детальной информации об операционной системе, установленной на различных компьютерах в сети. Это особенно актуально в больших корпоративных сетях, где необходимо следить за обновлениями и состоянием сотен, а то и тысяч устройств. Рассмотрим, как это можно сделать с помощью PowerShell, учитывая приведенный вами пример.

Теория:

PowerShell является мощным инструментом для управления и автоматизации задач в среде Windows. Он предоставляет множество командлетов и возможностей для работы с операционной системой, приложениями, сетевыми ресурсами и Active Directory (AD). В контексте вашего запроса вы хотите получить полную информацию об OS Build Windows 10 на двух компьютерах в вашей сети. Проблема заключается в получении детализированной информации о сборке, включая номер обновления сборки (Unified Build Revision или UBR).

Пример:

Давайте детальнее рассмотрим возможности PowerShell для решения этой задачи. Используя встроенные инструменты PowerShell, вы можете обратиться к информации об операционной системе, которая хранится в реестре Windows. В частности, параметры CurrentBuildNumber и UBR в реестре содержат информацию о версии сборки и обновлении UBR соответственно.

Применение:

Для получения детализированной версии сборки ОС на локальном компьютере вы можете использовать командлет Get-ComputerInfo, который возвращает всю необходимую информацию о системе. На удаленном компьютере можно использовать Invoke-Command для выполнения скрипта, который извлекает данные из реестра.

Вот пример использования PowerShell для получения информации об OS Build и UBR как локально, так и удаленно:

  1. Получение информации на локальном компьютере:
Get-ComputerInfo -Property "WindowsUBR"

Эта команда извлечет из локального реестра номер UBR, дополняющий ваш номер сборки операционной системы.

  1. Получение информации на удаленном компьютере:

Для извлечения подробной информации с удаленной машины, используя имя компьютера и реквизиты администратора, можно выполнить следующую команду:

Invoke-Command -ComputerName "COMPUTERNAME" -ScriptBlock {
    (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name "UBR").UBR
}

Не забудьте заменить "COMPUTERNAME" на фактическое имя вашего компьютера.

  1. Комплексный скрипт для экспорта данных из Active Directory:

Ниже представлен более сложный скрипт, который позволяет собрать и экспортировать необходимые данные из AD и реестра:

$cred = Get-Credential -Message "Please enter admin credentials"

# Определяем свойства, которые нужно извлечь из AD
$propsToFetch = "Operatingsystem", 'OperatingSystemVersion', 'Description'
Get-ADComputer -Filter 'enabled -eq "true"' -Properties $propsToFetch |
Sort-Object -Property OperatingSystemVersion |
ForEach-Object {
    if (Test-Connection -ComputerName $_.Name -Count 1 -Quiet) {
        # Получаем данные о версии сборки и UBR
        $osBuild = Invoke-Command -ComputerName $_.Name -Credential $cred -ScriptBlock {
            '{0}.{1}' -f 
            (Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name CurrentBuildNumber),
            (Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name UBR)
        }
    } else {
        $osBuild = 'Unknown; Computer is off-line'
    }
    $_ | Select-Object Description, Name, Operatingsystem, OperatingSystemVersion,
                       @{Name="osbuild"; Expression = {$osBuild}}
} | Export-Csv -Path 'y:\files\All_Computer_by_OSVersion_summary.csv' -NoTypeInformation

Вывод:

С помощью этих технологий и команд PowerShell можно не только решить поставленную задачу, но и масштабировать решение для использования в больших сетях. Это позволяет системным администраторам получить актуальную информацию о состоянии устройств, что важно для планирования обновлений и поддержания безопасности сети. Ключом к успешному использованию этого подхода является знание основ PowerShell, доступа к сети и правильная настройка разрешений.

Оцените материал
Добавить комментарий

Капча загружается...