Drucker per Kommandozeile (CMD) verwalten – rundll32.exe printui.dll

Die Windows CMD bietet eine brauchbare Druckerverwaltung in der Kommandozeile an.
Dank der printui.dll, die ihr mit der rundll32.exe ansprecht und die alle nötigen Werkzeuge enthält, könnt ihr Drucker hinzufügen, verwaltungen, löschen und mehr.
Dadurch lassen sich bestimmte Jobs wunderbar in Scripte packen.
Code Grundgerüst:
rundll32.exe printui.dll,PrintUIEntry /Parameter
Groß- und Kleinschreibung bei PrintUIEntry beachten, case sensitive.

Nun schauen wir auf die Möglichkeiten von printui.dll.

/a[Datei] Name der Binärdatei
/b[Name] Basisdruckername
/c[Name] UNC-Computername, wenn der Vorgang auf einem Remotecomputer ausgeführt wird.
/dlLöscht den lokalen Drucker.
/dnLöscht die Netzwerkdruckerverbindung.
/ddLöscht
den Druckertreiber.
/eZeigt Druckeinstellungen an.
/f[Datei] Entweder
INF-Datei oder Ausgabedatei.
/gaFügt Druckerverbindungen pro Maschine hinzu.
/geListet Druckerverbindungen pro Maschine auf.
/gdLöscht Druckerverbindungen pro
Maschine.
/h[Arch] Treiberarchitektur Alpha | Intel | Mips | PowerPC.
/iaInstalliert Druckertreiber mithilfe einer INF-Datei.
/idInstalliert
Druckertreiber mithilfe des Assistenten.
/ifInstalliert Drucker mithilfe der
angegebenen INF-Datei.
/iiInstalliert Drucker mithilfe des Assistenten und
einer INF-Datei.
/ilInstalliert Drucker mithilfe des Assistenten.
/inFügt eine Netzwerkdruckerverbindung hinzu.
/j[Anbieter] Druckanbietername
/kDruckt eine
Testseite auf dem angegebenen Drucker aus. Kann bei der Druckerinstallation
nicht verwendet werden.
/l[Pfad] Quellpfad des Druckertreibers
/m[Modell]
Modellname des Druckertreibers
/n[Name] Druckername
/oZeigt die Druckerwarteschlange an.
/pZeigt Druckereigenschaften an.
/qStiller Modus.
Fehlermeldungen werden nicht angezeigt.
/r[Anschluss] Anschlussname (Hier auch
die Möglichkeit Lokale Schnittstellen, anstelle des UNC Pfades anzugeben)
/sZeigt Servereigenschaften an.
/SsSpeichert Druckereinstellungen in einer Datei.
/SrStellt Druckereinstellungen aus einer Datei wieder her. Speichert
Optionsattribute für Druckereinstellungen oder stellt diese wieder her. Die
Attribute müssen am Ende des Befehls  stehen:
2 PRINTER_INFO_2
7 PRINTER_INFO_7
c
Farbprofil
d Druckerdaten
s Sicherheitsbeschreibung
g Globaler DevMode
m
Minimale Einstellungen
u Benutzer-DevMode
r Namenskonflikte lösen
f Namen
erzwingen
p Anschluss zuordnen
/uVerwendet den vorhandenen Druckertreiber,
sofern bereits einer installiert ist
/t[#] Nullbasierte Indexseite zum Starten
/v [Version] Eine der folgenden Treiberversionen:
Windows 95 oder 98 | Windows NT 3.1 | Windows NT 3.5 oder 3.51 | Windows
NT 3.51 | Windows NT 4.0 | Windows NT 4.0 oder 2000 | Windows 2000
/wFordert einen Treiber an, wenn der angegebene
Treiber nicht in der INF-Datei gefunden wird.
/yRichtet den Drucker als
Standarddrucker ein.
/XgLiest Druckereinstellungen.
/XsRichtet
Druckereinstellungen ein.
/zGibt diesen Drucker nicht automatisch frei.
/ZGibt diesen Drucker frei. Verwendung nur mit der Option
/if möglich.
/?Zeigt diese Hilfemeldung an.
@[Datei] Datei mit Befehlszeilenargumenten

Die Tabelle ist von Mark Heitbrink von gruppenrichtlinien.de.

Die volle Hilfe, printui.dll /? ist etwas länger, hat viele Beispiele und wen es interessiert: hier als Download.

Beispielszenario:
Man muss allen Mitarbeitern eines Betriebes bestimmte Drucker eines Druckerservers bereitstellen. Das geht zwar auch über Gruppenrichtlinien aber oftmals hat dieser Weg entscheidende Nachteile, wo sich Scripte besser eignen.

Auf dem Server ist ein Druckserver eingerichtet, der Drucker mit allen Treibern (für das Serversystem und alle Clientsysteme (XP+7 32bit+64bit)) installiert und freigegeben.

Druckerinstallation per Netzwerk:
rundll32.exe printui.dll,PrintUIEntry /in /n „\\server\Canon iR400 EG“
/in steht für „install network printer“, /n gibt den Freigabenamen des Druckers (natürlich mit Verbindung des Servernamens) an.

Sollen mehrere Drucker eingerichtet werden empfielt es sich, das Konstrukt etwas auszubauen. Zum Beispiel kann man in dem Script abhängig von der Etage des Mitarbeiters auch gleich den richtigen Standarddrucker setzen lassen (Parameter /y).

Hier mein Scriptbeispiel:

@echo off
cls

echo Wo befindet sich Ihr Büro?
echo --------------------------
echo 1 - Erdgeschoss
echo 2 - 1. Obergeschoss
echo 3 - Dachetage
set /p etage=Eingabe (1/2/3): 
if %etage%==1 set drucker=KopiererEG
if %etage%==2 set drucker=Kopierer1.OG
if %etage%==3 set drucker=Kopierer2.OG

echo.
echo %drucker% wird als Standarddrucker eingerichtet.
echo.

:drucker1
echo Installiere Kopierer EG
if "%etage%"=="1" goto drucker1std
rundll32 printui.dll,PrintUIEntry /in /n "\\iqbserver\Kopierer EG" >> nul
echo Installation abgeschlossen
echo.
goto drucker2

:drucker1std
echo Definiere als Standarddrucker
rundll32 printui.dll,PrintUIEntry /in /n "\\server\Kopierer EG" /y >> nul
echo Installation erfolgreich
echo.
goto drucker2

:drucker2
echo Installiere Kopierer 1.OG
if "%etage%"=="2" goto drucker2std
rundll32 printui.dll,PrintUIEntry /in /n "\\server\Kopierer 1.OG" >> nul
echo Installation erfolgreich
echo.
goto drucker3

:drucker2std
echo Definiere als Standarddrucker
rundll32 printui.dll,PrintUIEntry /in /n "\\server\Kopierer 1.OG" /y >> nul
echo Installation erfolgreich
echo.
goto drucker3

REM :drucker3
REM ... und so weiter

Das lässt sich mit beliebig vielen Druckern durchführen, die alle nacheinander auf dem Computer des Mitarbeiters eingerichtet werden. Verbunden mit errorlevel kann man noch cleverer als ich hier reagieren, z.B. den Befehl mit erhöhten Rechten erneut probieren o.Ä. (CPAU Warnung, Nutzung auf eigene Gefahr)

Weitergabe oder Verwendung des Textes nur mit voller Quellen- und Autorangabe! Ich bitte euch, seid fair.

3 Kommentare

  1. Sei mir nicht bös, aber deine Beispiele sind eine Katastrophe und stimmen überhaupt nicht. Errorlevels z.B. werden mit Prozent am Anfang und Ende abgefragt. Dann kommen bei deinen rundll-Aufrufen immer Errorlevel 0 zurück, egal ob man Erfolg oder Fehler hat. Über den weiteren Ablauf der Batch will ich erst gar nicht reden. Vielleicht solltest mal deine Skripte selber schreiben oder vorher wenigstens testen, bevor du was ins Netz postest…

  2. Hallo Winni, ich gebe zu, dass dieses Script wahrlich keine Meisterleistung ist. Ich bin mir unsicher, ob ich vor 3 Jahren (so alt ist der Beitrag ja) nur unkonzentriert und schlampig beim Schreiben oder halt einfach noch unerfahren mit Batch war.
    Jedenfalls müsste man an aktuelleren Posts merken können, dass mit die Batch Errorlevel mittlerweile bekannt und ein liebes Mittel geworden sind.
    Ich nutze sie mittlerweile sehr aktiv zum Überwachen von Installationen und Reagieren auf Fehlercodes.

    Hier ein Teil meines Java Installers (den ich in den nächsten Tagen auch veröffentlichen werde):

    :install
    REM .exe format: [version]u[update]-32/-64.exe, [7u40]-32/-64.exe
    start /w %wd%%version%-32.exe /s WEB_JAVA=1 REBOOT=REALLYSUPPRESS /norestart REBOOT=SUPPRESS 
    set javaEL32=%errorlevel%
    start /w %wd%%version%-64.exe /s WEB_JAVA=1 REBOOT=REALLYSUPPRESS /norestart REBOOT=SUPPRESS 
    set javaEL64=%errorlevel%
    
    ping 127.0.0.1 -n 10 >> nul
    
    :verfication
    reg query "HKEY_LOCAL_MACHINESOFTWAREJavaSoftJava Runtime Environment" /f "%update%" /k
    set javaregEL32=%errorlevel%
    reg query "HKEY_LOCAL_MACHINESOFTWAREWow6432NodeJavaSoftJava Runtime Environment" /f "%update%" /k
    set javaregEL64=%errorlevel%
    
    echo %date% %time:~0,8% - %computername%: %version%, install-errorlevel: 32: %javaEL32%, 64: %javaEL64%, regerrorlevel (sollten "0" sein!): 32: %javaregEL32%, 64: %javaregEL64%  >> %wd%java-all.log
    echo %date% %time:~0,8% - %computername%: %version%, install-errorlevel: 32: %javaEL32%, 64: %javaEL64%, regerrorlevel (sollten "0" sein!): 32: %javaregEL32%, 64: %javaregEL64%  >> %wd%%version%all-%version%.log
    
    if %javaEL32%==1618 goto retry
    if %javaEL32%==1602 goto retry
    if %javaEL32%==1603 goto retry
    if %javaEL64%==1618 goto retry
    if %javaEL64%==1602 goto retry
    if %javaEL64%==1603 goto retry
    if "%javaregEL32%%javaregEL64%"=="00" md %wd%%version%%computername%
    goto end
    

    Ich habe mir die Errorlevel von rundll32 printui.dll nochmal angesehen und tatsächlich wird immer 0 zurückgegeben. Schade eigentlich, schlecht programmiert. Entsprechende Zeilen und Sprungmarken habe ich aus dem Script des Artikels entfernt.

Schreibe einen Kommentar