PowerShell · 28.06.2022

Скажи мне, мать, серийник свой

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

Теперь расскажу о логике скрипта, представленного ниже. Прежде всего, создаётся и открывается в notepad.exe текстовый документ для перечня хостов, скрипт будет смиренно ожидать внесения имён, далее весь текстовый документ падает в переменную и попадает в цепкие лапы цикла foreach.

В цикле стартует пинговалка с логической проверкой доступности каждого хоста из списка и если хост доступен — начинается сбор данных о материнской плате. Эти данные падают в файл outlist.csv.

Если же удалённый хост не ответил на пинговалку — он считается недоступным и отсеивается в отдельный документ errors.txt.

Названия всех файлов объявлены в переменных в самом начале скрипта.

Собственно сам скрипт:

# Шапка скрипта #
[System.Console]::Title = "Сбор данных о материнской плате на удалённых хостах"

# Внешние файлы #
$filelist = "hostlist.txt"
$outlist = "outlist.csv"
$errorlist = "errors.txt"

# Создание листа с именами хостов #
New-Item -Path $filelist -ErrorAction Ignore | Out-Null
Start-Process -FilePath notepad.exe -ArgumentList $filelist -Wait

# Получение имён хостов из внешнего файла #
$hostlist = Get-Content $filelist

# Цикл #
foreach ($hostname in $hostlist) { 
   # Проверка доступности хоста #
   $ping = Test-Connection -ComputerName $hostname -Count 1 -Quiet
   # Если хост доступен - собрать данные #
   if ($ping) { Get-WmiObject -Class "Win32_BaseBoard" -ComputerName $hostname | Select @{Name='Hostname';Expression={(Get-WmiObject -Class Win32_ComputerSystem -ComputerName $hostname).Name}}, Manufacturer, Product, SerialNumber | ConvertTo-Csv -NoTypeInformation -Delimiter "," | % {$_ -replace '"',''} | select-object -skip 1 | Out-File $outlist -Append }
   # Если хост не доступен - передать имя хоста в файл ошибок #
   else { $hostname | Out-File $errorlist -Append }
 }

Если по каким-то причинам возникают проблемы с отработкой PS1-скрипта, требуются права администратора или повышение политики выполнения — можно запускать скрипт через вот такой батник:

cd C:\scripts\
powershell.exe -executionpolicy bypass "& 'C:\scripts\getmb.ps1'"
exit

Важно: если PS1-скрипт в процессе работы должен создавать файлы без абсолютного пути — нужно прописать в батнике путь до рабочей папки, иначе файлы будут пылиться в системной директории system32.