вторник, 15 октября 2019 г.

Автоматичекий перезапуск службы очереди печати

Предистория.
Имеется удалённый сервер с принтерами подключёнными по айпи из офиса по айписеку/тунелю или прочьей дичи.

Случается такое, что на удалённом сервере, к которому люди подключаются по айпсеку пропадает сеть с офисом (мало ли дисконнект какой-то на пару сек), так вот замечено, что при таких дисконнектах служба очереди печати не поднимат отбрано коннекты к принтерам и они становятся оффлайн, а что бы они вновь стали онлайн - надо перезапустить службу очереди печати. Я как человек ленивый решил воспользоваться встроенными средствами и запилил простой однострочник, который может это делать за меня в диспетчере задач:
if ( (Get-WMIObject -Class Win32_Printer -Computer $env:computername | Where-Object {($_.PortName -like '*`.*`.*`.*') -and ($_.PrinterStatus -eq '1')} | Select PrinterStatus).count > 4 ) { Restart-Service -Name Spooler }
Итак разберём однострочник:
Get-WMIObject -Class Win32_Printer -Computer $env:computername - получаем список принтеров на текущем хосте
Where-Object {($_.PortName -like '*`.*`.*`.*') -and ($_.PrinterStatus -eq '1')} - выбираем те принтеры, где в названии порта присутствует подобие ip адреса (на мой взгляд в этом кейсе вполне достаточно такой конструкции дабы не уложнять)  и статус с ошибкой (равен 1, обычная работа статус 3)
.count > 4 данная конструкция берёт количество наших принтеров и сравнивает с числом 4, в вашем же случае может быть вообще другие числа.
Restart-Service -Name Spooler ну и если условие выполняется - перезапускаем сервис спуллера.
Для удобства можно разбить эту конструкцию для удобства и понимания:
# Threshold offline printers
$PrintersCount = 4
# Get offline printers count
$OfflinePrinters = (Get-WMIObject -Class Win32_Printer -Computer $env:computername | Where-Object {($_.PortName -like '*`.*`.*`.*') -and ($_.PrinterStatus -eq '1')} | Select PrinterStatus).count
# If offline printers more than threshold restart spooler
if ( $OfflinePrinters  > $PrintersCount ) { Restart-Service -Name Spooler }