J’ai été confronté ces derniers jours à des dysfonctionnements sur un serveur d’impression, avec un process PrintIsolationHost utilisant toutes les ressources CPU, pénalisant toutes les impressions. Généralement, ce processus utilise 100% du CPU si un des drivers d’impression fonctionne mal. Je vous renvoie à la documentation Microsoft sur le rôle de ce process.
Dans mon cas, je n’avais pas installé de drivers depuis quelques temps et le problème se reproduisait sur toutes les imprimantes ; il s’agissait au final de fichiers générés par un outil tiers gérant l’impression ayant une taille énorme (pas loin du Go pour certains), faisant planter le driver sollicité.
En attendant de trouver la cause, j’ai dû plusieurs fois arrêter à la main les impressions. Chercher imprimante par imprimante sur un serveur en hébergeant une trentaine n’est ni amusant ni productif. J’ai donc développé un script Powershell permettant de remonter les jobs d’impression qui sont en erreur sur un serveur donné, ce qui me permettait de retrouver immédiatement le fichier bloquant.
Write-Host "KO Printing Jobs listing script"
Write-Host "===================================`r`n"
$hostname = Read-Host "Print Server to query"
$printjobs = Get-Printer -computer $hostname | Foreach-Object { Get-PrintJob -Computer $hostname -PrinterName $_.Name }
if($?){
foreach($printjob in $printjobs){
if($printjob.JobStatus -ne "Normal") {
$size = [math]::Round($printjob.Size/1024,0)
Write-Host "Job"$printjob.Id"-"$printjob.DocumentName"(size:"$size "KB) has the following status:"$printjob.JobStatus"on"$printjob.PrinterName
}
}
}
Voici un exemple d’output du script :