PowerShell · 24.12.2022

Посчитали, отчитались

Приходилось ли Вам собирать данные об общедоступных принтерах на серверах? Как правило, самое безобидное, что нужно включать в отчёт — это их количество. Всё остальное требует централизованного сбора информации с сервера: имя принтера и общего ресурса, имя и версия драйвера, описание и порт. А ещё нужно чтобы отчёт был максимально читабелен и было не стыдно им поделиться с ближним.

Для формирования файла отчёта я выбрал 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 файл на рабочем столе. В футере будет указано общее количество принтеров.