Fehlermeldungen aus unserem Hause sind teilweise legendär. Gerade bin ich von einem Kunden auf eine interessante Meldung aufmerksam gemacht worden, die man bei einigen HP-Druckern erhält, wenn wenn man sich von einem Windows 7 Client verbinden möchte:

0x0000007e

Der dazugehörige Eintrag in der Ereignisanzeige lautet:

"The print spooler failed to load a plug-in module spool\DRIVERS\W32X86\3\hpzpnp.dll, error code 0x7e. See the event user data for context information."

Na als wenn das nicht nach mehr Kontextinformationen schreien  würde. Aber was findet sich da?

"Context 101"

OK. Damit lässt sich nicht wirklich viel anfangen. Der Printserver ist ein Windows Storage Server 2008 x64, auf den die Drucker mittels Export/Import mit der Windows Server 2008 Print Management-Konsole umgezogen wurden. Jegliche Internetrecherche deutete dem Kunden nach hin auf Treiberprobleme. Allerdings funktionieren manuell neu angelegte Drucker reibungslos und auch das nachträgliche Aktualisieren des Treibers bei den existierenden, problematischen Druckern bringt keine Änderung. Jetzt mag der eine oder andere auf die Idee kommen, dass das ja nicht so schlimm wäre, weil man die Drucker dann halt kurz löscht und neu anlegt. Allerdings wurde hier nicht umsonst Export/Import genutzt, weil es hunderte Drucker betraf!

Der erste verdächtige Kandidat war ein Fehler bei Point-and-Print. Dabei sucht der Windows 7 Client die Datei Mscms.dll in einem falschen Unterordner. Dagegen gibt es einen Hotfix, der in dem Artikel "Windows cannot connect to printer" error message when you try to create a Point and Print connection to a remote printer from a Windows 7 or Windows Server 2008 R2-based client computer beschrieben ist. Leider klingt die Lösung zwar sehr gut, war aber für ein anderes Problem.

Der Printserver, von dem die Einstellungen und Treiber exportiert wurden, lief unter Windows Server 2003 (32-bit). Der Installer des HP Universal Printing-Treibers legt nur auf einem 32-bit einen zusätzlichen Registryschlüssel HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Print \ Printers \ PRINTERNAME \ CopyFiles \ BIDI an, der auf spool \ DRIVERS \ W32X86 \ 3 \ hpzpnp.dll zeigt. Das ist eine 32-bit DLL, die man auf einem 64-bit System nicht laden kann. Daher schlägt das Verbinden immer fehl, wenn man diesen Drucker mit den Einstellungen und dem Treiber von einem 32-bit Server auf einen x64 Server importiert. Legt man dagegen den Drucker manuell auf dem x64 Server an, erzeugt der x64 Installer von HP diesen Eintrag nicht und das Problem tritt nicht auf.

Laut HP wird diese 32-bit DLL für bidirektionale Netzwerkkommunikation genutzt, wenn der Drucker die Printqueue auf dem Printserver über die installierten Optionen und Papiertypen informieren möchte. Statusmeldungen dagegen werden über SNMP an den Portmonitor des Servers gesendet, über den der Druckerspooler die Druckerstatus-Aktualisierungen an alle angeschlossenen Clients ausliefert. Der eigentliche Sinn dieses Registryzweig ist die Auslieferung von Farbprofilen und plattformunabhängigen Dateien, beschrieben in Downloading Queue-Specific Files. Der HP-Druckertreiber fügt hier die 32-bit DLL ein. Da dieses Verhalten auf x64 PCs zu Problemen führt, führten wir mit Windows 7 eine weitere Prüfung ein, die das erfolgreiche Laden derartiger Dateien überprüft und beim Fehlschlagen unterbindet, dass die Druckerverbindung erfolgreich hergestellt werden kann.

Aber kein Blogposting ohne Lösung: Nach einer Rückfrage bei den HP-Entwicklern auf unserem Campus schafft das Löschen des BIDI-Schlüssels aus dem importierten Druckereintrag in der Registry des neuen Printservers Abhilfe. Danach lassen sich diese Drucker ebenfalls problemlos verbinden.

Have fun!
Daniel