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