Вопрос или проблема
У меня есть 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 как локально, так и удаленно:
- Получение информации на локальном компьютере:
Get-ComputerInfo -Property "WindowsUBR"
Эта команда извлечет из локального реестра номер UBR, дополняющий ваш номер сборки операционной системы.
- Получение информации на удаленном компьютере:
Для извлечения подробной информации с удаленной машины, используя имя компьютера и реквизиты администратора, можно выполнить следующую команду:
Invoke-Command -ComputerName "COMPUTERNAME" -ScriptBlock {
(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name "UBR").UBR
}
Не забудьте заменить "COMPUTERNAME" на фактическое имя вашего компьютера.
- Комплексный скрипт для экспорта данных из 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, доступа к сети и правильная настройка разрешений.