Разберем ситуацию в которой нам нужно получить список серийных номеров компьютеров, которые находятся в Active Directory используя Powershell. Сразу оговорюсь, что не все компьютеры хранят серийные номера и вероятнее всего, что это относится только к компьютерам брендовой сборки, например HP. Описанные способ никак не заменят автоматизированные сервисы по сбору данных и инвентаризации.
Для начала нам нужно узнать, где эти серийные номера хранятся. Можно использовать старую команду CMD WMIC:
wmic bios get serialnumber
Но так как эта статья про Powershell будем использовать только его:
Get-WmiObject -Class 'win32_bios' | Select Serialnumber
Я использую виртуальную машину и из-за этого серийный номер относится к VMWare:
Я не буду разбирать команду выше, так как уже писал про работу с WMI в Powershell. Отмечу, что если вы уже ознакомились со статьей про WMI, то вы сможете получить какие угодно свойства со всех компьютеров AD.
Можно использовать и CIM:
Get-CimInstance 'Win32_Bios' | Select-Object SerialNumber
Получим список всех компьютеров в домене:
Get-ADComputer -Filter *
Если нужно получить компьютеры из определенной OU, то можно добавить ключ SearchBase. В моем случае я ищу в домене domain.local, организационной единице Moscow:
Get-ADComputer -Filter * -SearchBase "OU=Moscow,DC=domain,DC=local"
Далее сценарий может меняться от того, какой способ удаленного выполнения команд вы хотите использовать. Вы можете использовать CIM, если у вас доступен такой способ в виде открытых портов и сервисов:
$computers = Get-ADComputer -Filter *
$computers.Name |
Foreach-Object {Get-CimInstance Win32_Bios -ComputerName $_ -ErrorAction SilentlyContinue |
Select-Object PSComputerName,SerialNumber}
Так как какие-то компьютеры могут быть выключены могут появляться ошибки и что бы они не мешали я добавил параметр -ErrorAction SilentlyContinue, который такие ошибки не будет показывать.
Так же можно использовать WMI. В этом скрипте я добавил экспорт в CSV, которой потом можно открыть в Excel:
$computers = Get-ADComputer -Filter *
$serials = $computers.Name |
Foreach-Object {Get-WMIObject Win32_Bios -ComputerName $_ -ErrorAction SilentlyContinue |
Select-Object PSComputerName,SerialNumber}
Export-Csv -Path 'C:\serials.csv' -NoTypeInformation -InputObject $serials
С параметром NoTypeInformation в CSV файле не будет сохраняться техническая информация.
Ну и можно использовать PSRemoting, который позволяет выполнять удаленные команды в Powershell. Для работы может потребоваться дополнительная настройка:
$computers = Get-ADComputer -Filter *
Invoke-Command -ComputerName $computers.Name -ErrorAction SilentlyContinue -ScriptBlock {Get-CimInstance Win32_Bios -ErrorAction SilentlyContinue | select PSComputerName,SerialNumber}
...
Подписывайтесь на наш Telegram канал
Теги: #powershell #ad