Η εκτύπωση των Windows και συγκεκριμένα του Print spooler είναι φτιαγμένη με ένα μονολιθικό τρόπο. Αυτό σημαίνει ότι αν σε έναν server έχουμε εγκατεστημένους δέκα εκτυπωτές, τότε αρκεί ένας κακογραμμένος ή ελαττωματικός driver για να διακοπεί η υπηρεσία και να χάσουμε τη δυνατότητα εκτύπωσης και στους υπόλοιπους εκτυπωτές. Παράλληλα, οι απότομες και κατ’ εξακολούθηση διακοπές του Print spooler δε μας επιτρέπουν να καταργήσουμε τον προβληματικό εκτυπωτή και, κάπως έτσι, μπαίνουμε σε ένα φαύλο κύκλο από τον οποίο δύσκολα μπορεί να βγει κανείς. Εδώ παρουσιάζονται κάποια γενικά βήματα για την αντιμετώπιση των δύσκολων περιπτώσεων που δεν επιλύονται με την κλασσική κατάργηση του εκτυπωτή από το στοιχείο Devices and Printers του πίνακα ελέγχου.
Εντοπισμός του προβληματικού εκτυπωτή
Το πρώτο βήμα είναι να εντοπίσουμε τον εκτυπωτή στον οποίο εμφανίζεται το πρόβλημα. Συνήθως αυτό είναι εύκολο, αφού πρόκειται για τον εκτυπωτή που έχει εκκρεμείς εκτυπώσεις στην ουρά εκτύπωσης. Αν οι εκτυπωτές δεν εμφανίζονται στο Devices and Printers, τότε απλώς πρέπει να επανεκκινήσουμε τον spooler. Ένας εύκολος τρόπος να κάνουμε όλα τα παραπάνω με μία κίνηση μέσω PowerShell (απαιτείται έκδοση 4.0 ή νεότερη), είναι η εντολή:
Start-Service spooler ; Get-Printer | ft Name,PrinterStatus,JobCount
Η εντολή εξασφαλίζει ότι ο Print spooler εκτελείται και αμέσως μας δίνει την κατάσταση των εκτυπωτών με τις εκκρεμείς εργασίες για τον καθένα. Η στήλη PrinterStatus πιθανότατα θα αναφέρει Error στον προβληματικό εκτυπωτή. Αν όχι, τότε θα πρέπει να δούμε ποιος εκτυπωτής έχει εκκρεμείς εργασίες. Με τον έναν ή τον άλλο τρόπο, θα καταφέρουμε να εντοπίσουμε τον προβληματικό εκτυπωτή.
Κατάργηση εκκρεμών εργασιών
Η κατάργηση του προβληματικού εκτυπωτή προϋποθέτει ότι δεν έχει εκκρεμείς εργασίες. Δεδομένου ότι το πιθανότερο είναι η λειτουργία του Print spooler να διακόπτεται αυτόματα, πριν ελέγξουμε και καταργήσουμε τις εκκρεμείς εκτυπώσεις, θα πρέπει να διασφαλίσουμε ότι ο Print spooler εκτελείται. Οπότε, τρέχουμε την παρακάτω εντολή σε ένα PowerShell, βάζοντας ως παράμετρο PrinterName το όνομα του προβληματικού εκτυπωτή, όπως ακριβώς αναγράφεται στην πρώτη εντολή που τρέξαμε παραπάνω. Έστω:
Start-Service spooler ; Get-PrintJob -PrinterName "CutePDF Writer"
Αυτό που μας ενδιαφέρει είναι το ID. Υπόψη ότι μπορεί να έχουμε πολλές εκτυπώσεις, ειδικά αν οι χρήστες προσπαθούσαν επανειλημμένα να εκτυπώσουν μέχρι να διαπιστώσουν ότι υπάρχει πρόβλημα. Για κάθε ένα Id τρέχουμε την παρακάτω εντολή. Έστω:
Start-Service spooler ; Remove-PrintJob -PrinterName "CutePDF Writer" -ID 5
Εδώ, με την Get-PrintJob παίρνουμε τη λίστα με τα IDs των εκτυπώσεων και στη συνέχεια με τη Remove-PrintJob διαγράφουμε τις εκκρεμείς εκτυπώσεις. Ιδανικά, ύστερα από λίγα δευτερόλεπτα ή 1-2 λεπτά η Get-PrintJob δε θα πρέπει να επιστρέφει καμία εργασία εκτύπωσης.
Ωστόσο, υπάρχει περίπτωση η παραπάνω διαδικασία να μη φέρει αποτέλεσμα και η τρέχουσα εκτύπωση να μην αφαιρείται. Αυτό συμβαίνει διότι ο Print spooler διακόπτει τη λειτουργία του πριν προλάβει να λάβει την εντολή διαγραφής της εργασίας.
Η μόνη λύση σε αυτή την περίπτωση είναι η χειροκίνητη διαγραφή της εργασίας εκτύπωσης. Πρώτα πρέπει να σταματήσουμε το spooler, αν εκτελείται ακόμα. Για ευκολία, στο PowerShell γράφουμε:
Stop-Service spooler
Στη συνέχεια, με το Windows Explorer πηγαίνουμε στη διαδρομή %systemroot%\System32\spool\PRINTERS και διαγράφουμε όλα τα αρχεία που θα βρούμε εκεί, όπως φαίνεται παρακάτω.
Με τις παραπάνω ενέργειες είναι βέβαιο ότι όλες οι εκκρεμείς εργασίες θα διαγραφούν. Πλέον μπορούμε να επανεκκινήσουμε τον Print spooler χωρίς να διακοπεί η λειτουργία του, με την προϋπόθεση ότι δε θα σταλεί άλλη εκτύπωση στον προβληματικό εκτυπωτή. Οπότε μπορούμε πλέον να προχωρήσουμε στην κατάργησή του.
Κατάργηση του εκτυπωτή
Τα πράγματα θα ήταν εύκολα αν με δεξί κλικ -> Remove ήταν δυνατό να καταργήσουμε τον εκτυπωτή. Για να διαβάζει κάποιος αυτές τις γραμμές σημαίνει ότι αντιμετωπίζει μία ιδιάζουσα περίπτωση. Ένα πρόβλημα που αντιμετώπισα πρόσφατα και αποτέλεσε αφορμή για το άρθρο, ήταν ότι ο εκτυπωτής που προκαλούσε τη διακοπή του Print spooler δε φαινόταν στο Devices and Printers, ενώ ήταν εγκατεστημένος και ενεργός και μάλιστα εμφανιζόταν στη λίστα του Get-Printer. Το πρόβλημα πήγαινε ακόμα παραπέρα, καθώς ούτε με τις εντολές PowerShell κατάφερα να τον αφαιρέσω, οπότε αναγκάστηκα να προβώ σε δραστικότερες ενέργειες. Ας τα πάρουμε όμως με τη σειρά.
Μία πρώτη προσέγγιση είναι η διαγραφή από PowerShell. Υποθέτουμε ότι από τα παραπάνω βήματα έχουμε κρατήσει με Copy-Paste το ακριβές όνομα του εκτυπωτή που μας ενδιαφέρει να καταργήσουμε. Επιπλέον, έχουμε εξασφαλίσει ότι δεν υπάρχον εκκρεμείς εργασίες εκτύπωσης. Οπότε, με χρήση της εντολής Remove-Printer, έχουμε:
Σημειώστε ότι πριν την εντολή Remove-Printer βάζουμε το Start-Service ώστε να διασφαλίσουμε ότι ο Print spooler εκτελείται. Κι αυτό γιατί για να καταργηθεί ένας εκτυπωτής, πρέπει να τρέχει ο Print spooler.
Αν όλα πάνε καλά, η παραπάνω ενέργεια θα καταργήσει τον εκτυπωτή. Ωστόσο, ενδέχεται αυτό να μην είναι εφικτό, οπότε πρέπει να πάμε σε πιο δραστικές ενέργειες, ήτοι την επεξεργασία του Registry των Windows.
Πριν προχωρήσουμε, θα πρέπει να σταματήσουμε τον Print spooler. Οπότε:
Stop-Service spooler
Προειδοποίηση: Η επεξεργασία του Registry, ειδικά σε ένα σύστημα server, πρέπει να γίνεται με πολύ προσοχή, καθώς αν γίνει λάθος κίνηση αυτή μπορεί να αποβεί μοιραία για τη λειτουργία του συστήματος. Πριν προχωρήσει κάποιος σε αυτή, θα πρέπει να έχει διασφαλίσει ότι διαθέτει αντίγραφα ασφαλείας και ότι έχει το χρονικό περιθώριο επαναφοράς του συστήματος από το backup χωρίς να δημιουργήσει downtime στην επιχείρηση.
Ανοίγουμε τον Registry Editor (regedit) και διαγράφουμε τον εκτυπωτή από τις παρακάτω διαδρομές. Υπόψη ότι ο εκτυπωτής θα υπάρχει σε κάποιες μόνο διαδρομές, όχι σε όλες. Προσοχή! Πριν τη διαγραφή του κάθε κλειδιού, το κάνουμε export σε ένα ασφαλές μέρος ώστε, αν απαιτηθεί, να μπορούμε να το εισάγουμε εύκολα.
HKLM > SYSTEM > CurrentControlSet > Control > Print >Environments >Windows x64 >Drivers > Version-3
HKLM > SYSTEM > CurrentControlSet > Control > Print >Environments >Windows x64 >Drivers > Version-4
HKLM > SYSTEM > CurrentControlSet > Control > Print >Environments >Windows NT x86 >Drivers > Version-3
HKLM > SYSTEM > CurrentControlSet > Control > Print >Environments >Windows NT x86 >Drivers > Version-4
HKLM > SYSTEM > CurrentControlSet > Control > Print > Providers > LanMan Print Services > Servers > Printers
HKCU > Printers > Connections
Στη συνέχεια εκκινούμε τον Print Spooler και επιβεβαιώνουμε ότι ο εκτυπωτής πλέον δεν υπάρχει, ούτε στο Devices and Printers του πίνακα ελέγχου ούτε στο Get-Printer στο PowerShell.
Αν όλα έχουν γίνει σωστά, η αφαίρεση του εκτυπωτή θα πραγματοποιηθεί με επιτυχία. Οπότε, μπορούμε να πάμε στο τελευταίο βήμα που είναι η διαγραφή του driver.
Διαγραφή του Printer Driver
Το αρχικό πρόβλημα με τη διακοπή του Print spooler κατά πάσα πιθανότητα οφείλεται, όπως αναφέρθηκε στην αρχή του άρθρου, σε πρόβλημα που σχετίζεται με τον driver. Επομένως, θα ήταν λάθος να διαγράψουμε τον εκτυπωτή, αλλά να αφήσουμε ανέπαφη την πηγή του προβλήματος που δεν είναι άλλη από τον driver. Αυτό θα είναι και το τελευταίο βήμα της ολοκληρωτικής αφαίρεσης του εκτυπωτή και της επίλυσης του προβλήματος, είτε θέλουμε να επανεγκαταστήσουμε τον εκτυπωτή με κάποιον άλλο driver είτε όχι.
Η αφαίρεση του driver μπορεί να γίνει είτε με χρήση του PowerShell είτε μέσω γραφικού περιβάλλοντος. Θα δείξουμε και τους δύο τρόπους, ξεκινώντας από το PowerShell.
Καταρχάς πρέπει να δούμε τη λίστα με τους εγκατεστημένους drivers. Σε PowerShell δίνουμε:
Get-PrinterDriver
Και στη συνέχεια αφαιρούμε τον driver. Έστω:
Remove-PrinterDriver -Name “HP PSC 1500 series”
Με τη Get-PrinterDriver επιβεβαιώνουμε ότι ο ανεπιθύμητος driver έχει απομακρυνθεί.
Η παραπάνω διαδικασία θα πρέπει να λειτουργήσει χωρίς κανένα πρόβλημα. Αν θελήσουμε να κάνουμε την ίδια διαδικασία από γραφικό περιβάλλον θα πρέπει να καλέσουμε την καρτέλα Print Server Properties από ένα elavated Command Prompt:
printui /s /t2
Όπως φαίνεται στο παραπάνω screenshot, από την καρτέλα Drivers αφαιρούμε τον προβληματικό driver. Στο παράθυρο που ανοίγει, επιλέγουμε “Remove driver and driver package” ώστε να γίνει πλήρης διαγραφή του driver από το συστημα. Μετά το ΟΚ, θα ανοίξει ένα νέο παράθυρο στο οποίο θα πρέπει να επιβεβαιώσουμε ότι επιθυμούμε την αιτούμενη διαγραφή.
Συμπεράσματα
Η διαγραφή ενός εκτυπωτή με προβληματικό driver κατά καιρούς αποδεικνύεται επίπονη διαδικασία. Το μεγαλύτερο πρόβλημα είναι ότι ο Print spooler διακόπτεται συνεχώς με αποτέλεσμα να μη δίνεται η ευκαιρία στο διαχειριστή να καταργήσει τον εκτυπωτή με τη συνηθισμένη διαδικασία. Τα παραπάνω βήματα ευελπιστώ ότι θα φανούν χρήσιμα στην πλειονότητα των “δύσκολων” περιπτώσεων με επίμονους εκτυπωτές που αρνούνται πεισματικά να καταργηθούν.