Приходилось ли Вам собирать данные об общедоступных принтерах на серверах? Как правило, самое безобидное, что нужно включать в отчёт — это их количество. Всё остальное требует централизованного сбора информации с сервера: имя принтера и общего ресурса, имя и версия драйвера, описание и порт. А ещё нужно чтобы отчёт был максимально читабелен и было не стыдно им поделиться с ближним.
Для формирования файла отчёта я выбрал html файл с добавлением стилей на простейшем css.
## Заголовок окна консоли ##
[System.Console]::Title = "Сбор данных об общих принтерах на сервере"
## Блок основных переменных ##
$printserver = Read-Host "Имя принт-сервера или IP-адрес"
$savefile = [Environment]::GetFolderPath("Desktop") + "\printers.html"
$ping = Test-Connection -ComputerName $printserver -Count 1 -Quiet
## Оформление вывода в HTML ##
$header = @"
<title>Принтеры на $printserver</title>
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #87cefa;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
H1 {text-align: center;}
H2 {text-align: right;}
</style>
"@
## Условие доступности хоста ##
if ($ping)
{
## Подсчет принтеров ##
$count = ($printserver |
ForEach-Object { Get-WmiObject -class Win32_Printer -computer $printserver |
Where-Object {$_.ShareName -ne $null}}).count
## Отбор и отправка в html файл ##
$printserver |
ForEach-Object { Get-WmiObject -class Win32_Printer -computer $printserver |
Where-Object {$_.ShareName -ne $null} |
#Select-Object Name, ShareName, PortName, Location, Comment, SystemName, DriverName } |
Select-Object @{Label="Имя принтера"; Expression={$_.Name}},`
@{Label="Имя общего ресурса"; Expression={$_.ShareName}},`
@{Label="Имя порта"; Expression={$_.PortName}},`
@{Label="Расположение"; Expression={$_.Location}},`
@{Label="Описание"; Expression={$_.Comment}},`
@{Label="Имя сервера"; Expression={$_.SystemName}},`
@{Label="Драйвер"; Expression={$_.DriverName}} |
Sort-Object "Расположение"} | # <== Сортировка по расположению принтера
ConvertTo-Html -Head $header `
-PreContent "<H1>На сервере $printserver найдены следующие принтеры:</H1>" `
-PostContent "<H2>Итого $count шт.</H2>" |
Out-File $savefile -Verbose
}
else { Write-Host "$printserver недоступен!" }
## Ожидание действия от пользователя ##
Write-Host
Read-Host "Нажмите любую клавишу для выхода..."
Логика скрипта заключается в проверке доступности указанного сервера, формировании запроса и сохранении данных в html файл на рабочем столе. В футере будет указано общее количество принтеров.