Blocco della funzionalità dello spool di stampa

Nel mio caso l’issue si è verificato su un server di stampa con Windows Server 2016, ma il problema è indipendente dal sistema operativo. Scendendo nel dettaglio può accadere che le funzionalità di stampa di un server di stampa, ma anche di un client, si blocchino nonostante il servizio Spooler sia in funzione, ma in questa situazione è possibile notare un elevato utilizzo di cpu da parte del processo printfilterpipelinesvc.exe. Il file printfilterpipelinesvc.exe insieme alla PrintFilterPipelinePrxy.dll consente la gestione di EasyPrint, che a sua volta è basato su XPS, e quindi implementa il driver XPS generando i joc XPS che lo spooler invierà al client.

Se si presenta questa situazione le stampe non verranno più eseguite o eseguite con estrema lentezza.

Il problema viene originato da un elevato numero di file nella cartella %SystemRoot%\System32\spool\PRINTERS o da file corrotti. I file in %SystemRoot%\System32\spool\PRINTERS dovrebbero venire eliminati dopo la stampa se questo non avviene dopo un certo periodo si verificherà l’issue descritto precedentemente, un motivo per il quale i file potrebbero non venire eliminati può dipendere da un problema legato ad un driver di una stampante, in questo caso dovrebbe essere presenti nel registro applicazioni eventi di questo tipo (nell’esempio sono relativi ad un driver Toshiba):

Per risolvere il problema è possibile eseguire il clear della cartella %SystemRoot%\System32\spool\PRINTERS mediante i seguenti comandi per eliminare i file spool (.spl) e i file temporanei (.tmp):

NET STOP spooler
TASKKILL /F /IM printfilterpipelinesvc.exe /T
DEL %SystemRoot%\System32\spool\printers\*.spl /Q /F /S
DEL %SystemRoot%\System32\spool\printers\*.shd /Q /F /S
DEL %SystemRoot%\System32\spool\printers\*.tmp /Q /F /S
NET START spooler

Oltre all’eliminazione dei job nello spool è comunque consigliabile verificare se sono stati rilasciati driver più aggiornati.

Per maggiori informazioni si vedano anche i seguenti:

Update 01

Un’altra mitigazione che è possibile adottare è quella di eliminare i file temporanei (.tmp) dello spooler di stampa non più modificati da almeno 10 minuti ritendo che dopo tale periodo temporale questi file siano stati processati dallo spooler e quindi possano essere eliminati per evitare causino il blocco delle funzionalità di stampa.

Per implementare tale workaround è possibile ad esempio schedulare ogni 10 minuti l’esecuzione di un script DOS DeleteTMPSpoolfileOlder.cmd che a sua volta richiama uno script PowerShell che esegue l’eliminazione dei file temporanei nello spool.

Di seguito un esempio di tali script:

DeleteTMPSpoolfileOlder.cmd

PowerShell -ExecutionPolicy RemoteSigned -File %~dp0DeleteTMPSpoolfileOlder.ps1

DeleteTMPSpoolfileOlder.ps1

# Delete tmp files in %SystemRoot%\System32\spool\printers older than 10 minutes
$Path = “$env:SystemRoot\System32\spool\printers\*.tmp”
$Minutesback = “-10”

$CurrentDate = Get-Date
$DatetoDelete = $CurrentDate.AddMinutes($Minutesback)
Get-ChildItem $Path | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item