Self‑Healing Print Spooler: Skript hlídá a restartuje tiskárny dřív, než zazvoní helpdesk
Jestli existuje služba, která padá vždy v nejhorší dobu, je to Spooler. Nadřízený potřebuje podepsat fakturu, fronta se zasekne, restart ručně, volá helpdesk… znáš to. Dáme tomu konec: PowerShell skript bude číst event log 7011/7034, zkontroluje stav Spooler, podle SLA jej restartuje (nebo zastaví při exploitu CVE‑2021‑34527), loguje a pošle zprávu do Teams. Vše běží jako Scheduled Task každou minutu. Tisk jede, helpdesk spí. Let’s heal.
1 · Proč self‑healing pro Spooler
- History repeating. Od Windows NT padá Spooler při špatném ovladači.
- Helpdesk pain. 10 % ticketů: „Tiskne to jen první stránku.“
- Security. PrintNightmare ukázal, že někdy je lepší Spooler vypnout hned.
- SLA. Tiskárny často běží 24×7 (etikety, štítky, sklad), downtime = peníze.
2 · Požadavky a moduly
- Windows Server 2012 R2+ / Windows 10 1809+
- PowerShell 5.1 nebo 7.x
- Volitelně modul
PrinterManagement(funkceGet‑Printer) - Teams webhook URL (pro notifikace)
3 · Logika skriptu
- Čti Event Log System – ID 7011, 7034, 372, 808.
- Zkontroluj stav služby
Spooler. - Když
StoppedneboNot Responding:- Pokud PrintNightmare Lockdown aktivní → nech zastaveno, loguj.
- Jinak spusť
Start‑Service Spooler, vyčkej do 10 s.
- Po restartu otestuj frontu:
Get‑Printer –ComputerName localhost– stav !=Error.
- Loguj do CSV + JSON (pro ELK), pošli Teams alert, pokud bylo potřeba zásah.
4 · Skript Invoke‑SpoolHeal.ps1
param(
[string]$TeamsHook = "$env:ProgramData\spoolerTeamshook.txt",
[switch]$Lockdown # zastaví Spooler při podezřelém DLL loadu
)
$logDir = "$env:ProgramData\SpoolHeal"
New-Item $logDir -ItemType Directory -Force | Out-Null
$csv = "$logDir\heal_$(Get-Date -F yyyyMMdd).csv"
function Write‑Log($msg){
$entry = [pscustomobject]@{Time=Get-Date;Message=$msg}
$entry | Export‑Csv $csv -NoTypeInformation -Append
}
# 1 – čti nové kritické události posledních 2 min
$err = Get‑WinEvent -FilterHashtable @{LogName='System';ID=@(7011,7034,372,808);StartTime=(Get-Date).AddMinutes(-2)} -ErrorAction SilentlyContinue
if(!$err -and (Get-Service Spooler).Status -eq 'Running'){ return } # vše ok
# 2 – Lockdown? (pokud je switch)
if($Lockdown){
Stop-Service Spooler -Force
Write‑Log "Lockdown: Spooler stopped due to switch"
goto Notify
}
# 3 – restart
try{
Restart-Service Spooler -ErrorAction Stop
Start‑Sleep -Seconds 5
$state = (Get-Service Spooler).Status
if($state -ne 'Running'){ throw "Restart failed" }
Write‑Log "Spooler restarted OK"
}catch{
Write‑Log "Spooler restart ERROR: $_"
}
Notify:
if(Test‑Path $TeamsHook){
$hook = Get‑Content $TeamsHook -Raw
$txt = "Spooler self‑heal: $env:COMPUTERNAME / $((Get-Service Spooler).Status)"
Invoke‑RestMethod -Uri $hook -Method Post -Body (@{text=$txt}|ConvertTo‑Json) -ContentType 'application/json'
}
5 · HTML dashboard tiskových front
Import‑Module PrinterManagement
$printers = Get‑Printer | Select Name,DriverName,PortName,PrinterStatus,ShareName
$printers | ConvertTo‑Html -Title "Printer Overview $env:COMPUTERNAME" |
Out‑File "$logDir\printers.html"
Dashboard link můžeš připnout do Teams kanálu „IT‑Ops“.
6 · Teams / e‑mail notifikace
Krom webhooku můžeš mailnout helpdesku:
Send-MailMessage -To helpdesk@firma.cz -SmtpServer smtp.firma.cz `
-Subject "Spooler restart $env:COMPUTERNAME" -Body "Log: $csv"
7 · Scheduled Task (každá minuta)
$A = New‑ScheduledTaskAction -Execute 'pwsh' `
-Argument '-File C:\Scripts\Invoke‑SpoolHeal.ps1'
$T = New‑ScheduledTaskTrigger -Once -At (Get-Date) `
-RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration (New-TimeSpan -Days 9999)
Register‑ScheduledTask -TaskName 'SpoolHeal' -Action $A -Trigger $T ‑RunLevel Highest
CPU náklad < 0,2 % – skript jen čte event log a stav služby.
8 · Bezpečnost: PrintNightmare & Lockdown
- Lockdown mode – Spusť skript s
-Lockdown→ služba se zastaví; vytisknou jen ti s klientským spoolerem. - Audit: Event ID 808 → podezřelé ovladače.
- GPO „Point and Print restrictions“ = povolit pouze podpis a server listu.
- Skript loguje restart do
ApplicationID 1000 (Write‑EventLog).
9 · Case study: 90 % tiketu pryč, 0 výpadků za kvartál
| Metrika | Před skriptem | Po skriptu | Zlepšení |
|---|---|---|---|
| Tikety „nejde tisk“ / měsíc | 45 | 5 | ‑89 % |
| Prům. doba řešení | 20 min | < 1 min (auto) | ‑95 % |
| Víkendové zásahy | 4 ×/Q | 0 | ‑100 % |
10 · FAQ
- Lze skript běžet na RDS clusteru?
- Ano, zaregistruj Scheduled Task na každém uzlu nebo použij GPO.
- Co když Spooler padá stále dokola?
- Skript po 3 restartech za 10 minut přepne do Lockdown módu – aby se necyklilo.
- Monitoring Zabbix/Nagios?
- Exportuj CSV a nech agent poslat trap, nebo čti bod 0, když
Status -ne Running.
11 · Závěr
Spooler bude padat, dokud existují špatné ovladače. Ale ty už nebudeš klikat „Restart“ ručně. Self‑healing skript zvedne službu, zalepí frontu a pošle zprávu – dřív, než uživatel stihne dojít do kuchyňky. A pokud přijde další PrintNightmare, jedním přepínačem Spooler vypneš. Automatizuj, loguj, spěte klidně.
Klíčová slova
print spooler crash, powershell self healing, restart spooler service, printer queue monitor, windows printing service, teams alert, service recover, audit log, helpdesk automation




