Zum Inhalt springen
Der Guide für ein smartes Leben.
VG Wort Pixel
Drucker Skripte

Visual Basic-Skripte für Vorlagen im Netzwerk

Das Thema "Drucken" beschäftigt seit Jahren Administratoren, IT-Experten, Support-Mitarbeiter und Benutzer gleichermaßen. Der einst proklamierte, papierfreie Arbeitsplatz der Zukunft ist immer noch ein gutes Stück entfernt. Hier finden Sie einige VB-Skripte für Ihre Druckervorlagen.

Autor: Frank-Michael Schlede • 18.12.2013 • ca. 9:05 Min

Drucker-Skripte
Ratgeber: Visual-Basic-Skripte für die Vorlagen in Ihrem Netzwerk.
© Holger Lehmann

In diesem Beitrag über Druck-Skripte widmen wir uns Skript-Jobs etwa via Visual Basic, die für unterschiedliche Aufgabenstellungen in Ihrem WAN/LAN eine echte Erleichterung mit sich bringen. Denn auch Tablet-PCs und die überaus praktische Visualisierung von Daten auf Smartphones kann ...

In diesem Beitrag über Druck-Skripte widmen wir uns Skript-Jobs etwa via Visual Basic, die für unterschiedliche Aufgabenstellungen in Ihrem WAN/LAN eine echte Erleichterung mit sich bringen. Denn auch Tablet-PCs und die überaus praktische Visualisierung von Daten auf Smartphones kann nichts ändern - es wird gedruckt und zwar in allen Qualitäten. In Active-Directory-Umgebungen gibt es verschiedene Möglichkeiten, wie dem Benutzer der passende Drucker zugeordnet wird.

Das möglicherweise wichtigste Skript im Unternehmen ist das klassische Anmeldeskript, welches Benutzern die Netzlaufwerke und Drucker zuordnet. Das Skript für das NETLOGON bietet den Vorteil, dass es Administratoren seit der Windows-NT-Zeit faktisch unverändert weiternutzen können.

Im Eigenschaftendialog des Benutzers muss der Administrator den Dateinamen für das Skript benennen und schon wird es bei jeder Benutzeranmeldung ausgeführt. Windows speichert diese Skripte in der NETLOGON-Freigabe auf den Anmeldeservern und repliziert diese automatisch an die anderen Anmeldeserver.

Zwar kann der Administrator auch VBSkript oder JSkript als Anmeldeskript nutzen, jedoch muss sichergestellt sein, dass auf dem Zielrechner, dem Client, die benötigte Umgebung verfügbar ist. Im Zusammenspiel mit Umgebungsvariablen und dem Aufruf weiterer Skript-Jobs mit dem Kommando CALL ist das NETLOGON auch heute noch sehr gut einsetzbar.

PC,Daten,Drucken,Skript,Betriebssysteme
Verx64- Windows-Computer können durchaus die Treiber für x86-Windows oder auch Itanium-basierte Windows-Maschinen bereitstellen, sofern das entsprechende Häkchen gesetzt ist.
© Archiv

Im allgemeinen Teil wird zunächst das Laufwerk H als "Homeverzeichnis" mit einer Freigabe, die gleichlautend dem Benutzernamen ist, verbunden. Anschließend das Laufwerk M mit einer allgemeinen Freigabe. Begriffe in geschweiften Klammern gilt es gemäß der eigenen Umgebung anzupassen. Der Schalter /persistent:no stellt sicher, dass der Windows-Client keine dauerhaften Verbindungen aufbaut. Da das Anmeldeskript bei jeder Anmeldung aufgeführt wird, ist dies nicht erforderlich. Das vereinfacht die Pflege der Skripte für den IT-Profi.

Es folgt die Einrichtung einer Druckerverbindung über die printui.dll. Dieser Befehl besitzt eine Vielzahl von Optionen und ist im Gegensatz zu den meisten anderen Windows-Befehlen case sensitive. Eine Übersicht aller Optionen erhält der IT-Profi durch

die Eingabe von rundll32 printui.dll,PrintUIEntry /? in der Eingabeaufforderung oder unter Ausführen. Der Druckertreiber muss in jedem Fall bereits auf dem Client-Computer vorhanden sein, da ansonsten der Installationsdialog angezeigt wird, der von einem "gewöhnlichen Domänen-Benutzer" mangels Rechten nicht ausgeführt werden darf. Die Bereitstellung von Druckern durch einen x86-Server für x64-Client-Systeme ist übrigens problemlos möglich. Der Administrator muss jedoch sicherstellen, dass der x64-Treiber im

Register "Freigabe" unter "Zusätzliche Treiber" auch bereitgestellt wird. Ist der sich anmeldende Benutzer in der Gruppe "REDAKTION", so wird im obigen Skript neben dem normalen Laserdrucker am Server auch ein Farblaser-Drucker verbunden.

Die hier beschriebene Lösung über "net user" ist zwar etwas langsamer als die Verwendung von "ifmember.exe", jedoch arbeiten wir hier ausschließlich mit Windows-Bordmitteln. Durch IF-Konstrukte in dieser Form ist es problemlos möglich, ein einziges Anmeldeskript für viele Benutzer zu verwenden. Die 1:1-Zuordnung von Benutzer und Anmeldeskript wird ansonsten in größeren Umgebungen zu aufwendig.

Äußerst praktisch in diesem Zusammenhang ist der Befehl CALL, der aus einem Skript heraus ein anderes Skript aufruft. Soll beispielsweise in Abhängigkeit der Gruppenzuordnung, wie hier gezeigt mit "REDAKTION", ein weiteres Skript aufgerufen werden, so ist vor der abschließenden Klammer der Befehl CALL {SCRIPTNAME} einzufügen.

Drucker per Kommando oder manuell verbinden

Ein lokal installierter Windows-Drucker steht gewöhnlich allen Benutzern dieser Maschine zur Verfügung. Möchte ein Anwender einen Drucker von einem anderen Windows-Rechner, beispielsweise einem Windows-Printserver, nutzen, so wird hierzu eine benutzerbezogene Verbindung eingerichtet. Dies geschieht entweder durch die Verwendung des "Drucker suchen"-Dialogs oder der Drucker wird direkt über den UNC-Pfad im Ausführen- beziehungsweise Suchen-Feld von Windows angesprochen:

\\{SERVERNAME}\{FREIGABENAME} Wird nur der "\\{SERVERNAME}" eingegeben, so erscheinen alle von dem Server oder Computer bereitgestellten Freigaben, Drucker oder Verzeichnisse in einem neuen Fenster. Mit einem Doppelklick auf "Drucker und Faxgeräte" wird die Ansicht auf Druckerfreigaben beschränkt. Durch einen Doppelklick auf den Freigabenamen wird die Druckerzuordnung vorgenommen.

PC,Daten,Drucken,Skript,Betriebssysteme
Um Druckbefehle per LPR absetzen zu können, muss zunächst der LPRAnschlussmonitor unter den Windows-Funktionen hinzugefügt werden.
© Archiv

Alternativ ist es auch möglich, den Drucker per Drag & Drop aus der Auflistung der gefundenen Drucker in das Fenster "Drucker und Faxgeräte" zu ziehen. Durch einen Rechtsklick auf den jeweiligen Drucker kann der Anwender eine feste Verbindung zu dem ausgewählten Drucker einrichten. Windows sorgt selbstständig dafür, dass die notwendigen Treiber vom bereitgestellen PC/Server auf den lokalen Clientcomputer übertragen werden, sofern der Benutzer über die passenden Rechte verfügt und die für das lokale Windows-System passenden Treiber vorgehalten werden.

Drucken über LPD/LPR

Das Line Printer Daemon Protocol (LDPD) ist im RFC 1179 beschrieben und stammt in der aktuellsten Fassung aus dem Jahre 1990. Mit Fug und Recht darf die unter Windows oft als "Unix Druckdienste" bezeichnete LPR/LPD-Druckvariante als ein Urgestein betrachtet werden. Der Vorteil eines so alten Drucksystem ist, dass es von beinahe jedem Computersystem verstanden wird und etliche Drucker über einen eingebauten Druckserver verfügen, der die Aufträge direkt abarbeitet.

Um unter Windows über LPD/LPR drucken zu können, muss der Benutzer zunächst in der Systemsteuerung in den Einstellungen der Software in "Windows Funktionen hinzufügen" den LPR-Anschlussmonitor installieren, um Aufträge per LPR zu verschicken. Sollen andere Computer, insbesondere Nicht-Windows-Systeme, Aufträge an einen Drucker schicken können, der an dem Windows-PC angeschlossen ist, so gilt es den "LPD-Druckdienst" ebenfalls auszuwählen. Handelt es sich bei dem Computer um ein älteres System mit XP oder 2000, so muss der Benutzer die Dienste noch auf "Automatisch" setzen, da sie ansonsten nach einem Neustart nicht aktiv sind.

Um eine einfache Text-Datei an einen Drucker per LPR/LPD zu versenden, ist in der Eingabeaufforderung lediglich ein Ein-Zeiler notwendig:

lpr -S {IP-Adresse Server/Drucker} -P {Warteschlangename} -d {Dateiname}

Word-Dateien per VB-Skript ausdrucken

Eine Vielzahl von Dokumentenvorlagen liegt im Microsoft-Word-Format vor, was liegt näher, als diese Dokumente direkt als Druckvorlagen gezielt mit Daten zu bestücken. Es gibt sicherlich dankbarere Formate, aber zumindest ist Word weit verbreitet und das Setzen von Textmarken, die wir für die Datenannahme nutzen, ist einfach. Um diese Variante auszuprobieren, ist eine Word-Vorlage mit dem Namen "vorlage.dotx" im Verzeichnis "c:\test" erforderlich. In dem Word-Dokument müssen sich zwei Textmarken mit dem Namen "Marke1" und "Marke2" befinden. Wo sich diese in der Word-Vorlage befinden, spielt dabei keine Rolle.

PC,Daten,Drucken,Skript,Betriebssysteme
Der kostenlose Foxit Reader eignet sich hervorragend für automatische PDF-Ausdrucke, auch ohne dass alle Erweiterungen zu installieren wären.
© Archiv

Um die beiden Textmarken mit Daten zu füllen, kommt folgendes VB-Skript zum Einsatz:

Set objWord = CreateObject("Word.Application")

Set objShell = CreateObject("WScript.Shell")

with objWord

.visible = false

.Documents.Open ("c:\test\vorlage.dotx")

.ActiveDocument.bookmarks("marke1").Select

.selection.Text = now()

.ActiveDocument.bookmarks("marke2").Select

.selection.Text = "Testeintrag aus dem Script"

.ActiveDocument.printout PrintZoomWidth=11907,_

PrintZoomPaperHeight=16839

.ActiveDocument.SaveAs objShell.Expand _

EnvironmentStrings("%temp%") & "\fm.docx.tmp"

.ActiveDocument.close

.quit

end with

set objWord = Nothing

set objShell = Nothing

Das Skript öffnet die Word-Vorlage und setzt an die erste Textmarke das aktuelle Tagesdatum nebst Uhrzeit, und in die zweite Textmarke wird ein Satz geschrieben. Anschließend wird ein Ausdruck angestoßen - die Zoom-Einstellungen sorgen dafür, dass auf faktisch allen A4-Druckern der Ausdruck problemlos erzeugt wird. Das gedruckte Dokument wird als temporäres Dokument gespeichert und anschließend geschlossen und Word beendet.

PDF-Dateien per Skript ausdrucken

Es klingt nach einer ganz einfachen Aufgabenstellung für den Adobe Acrobat Reader: Eine PDF-Datei soll per Visual Basic Skript-Job ausgedruckt und die PDF-Applikation automatisch geschlossen werden. Doch leider stellt sich die Software des PDF-Platzhirschen Adobe bei dieser Anforderung als äußerst ungeschickt heraus - es funktioniert nicht. Besser klappt dies mit dem kostenfreien "Foxit Reader", ab der Version 3.1.

Wird die aktuelle Version 6.0.6 eingesetzt, so muss der Benutzer bei der Installation aufpassen, dass nicht automatisch der Chrome-Browser installiert wird oder sich Foxit, möglicherweise unerwünscht, zum primären PDF-Leser macht. Es ist zudem nicht erforderlich, dass das Programm eine Desktop- oder Start-Menü-Verknüpfung einrichtet. Leider installiert sich der PDF-Druckertreiber von Foxit in den jüngeren Versionen automatisch zum Standarddrucker, was der Vorteil der älteren Version liegt darin, dass sie nur wenige MByte an Speicherplatz benötigt und eine Vielzahl der oben genannten Probleme erst gar nicht entstehen. Die älteren Versionen sind nicht mehr auf der Webseite von Foxit gehostet. Eine kurze Internetsuche nach "Foxit 3.1 B Download" liefert jedoch mehrere funktionierende Treffer für einen Download.

Das Skript für den automatischen Ausdruck einer PDF-Datei besteht nur aus wenigen Zeilen:

strReader = "{Pfad und Name zum Foxit-Reader}"

strOption = "-NoRegister /p"

strFile = "{Pfad und Name der PDF-Datei}"

set objShell = createobject("WScript.Shell")

objShell.run (strReader & " " & strOption & " "

& strFile)

Bei der Pfad- und Dateinamenangabe unter strReader muss der Anwender jedoch aufpassen. In der Standardauslieferung lautet der Name "Foxit Reader.exe", und auf Leerzeichen reagieren Skript-Jobs bekanntlich empfindlich. Entweder die EXE-Datei wird umbenannt oder kopiert, was jedoch bei automatischen Updates zum Verhängnis würde, oder der Aufruf geschieht im "krisensicheren" 8.3-Format aus den DOSUrzeiten. Bei einem aktuellen x64-Windows würde der Pfad wie folgt lauten:

strReader = "C:\PROGRA~2\FOXITS~1\FOXITR~1\

foxitr~1.exe"

Ein 32-Bit-Windows, unabhängig von der Version, dürfte höchstwahrscheinlich

strReader = "C:\PROGRA~1\FOXITS~1\FOXITR~1\

foxitr~1.exe"

als Dateipfad akzeptieren.

Dateien aus Ordner drucken und löschen

Die Variante des PDF-Drucks mit dem Foxit-Reader lässt sich dahingehend erweitern, dass über den Windows-Scheduler ("Aufgaben planen" beziehungsweise "Geplante Tasks") ein Ordner regelmäßig nach PDF-Dateien durchsucht wird, diese an den Drucker geschickt, in einen Sicherungsordner kopiert und anschließend über Windows im Hauptverzeichnis automatisch gelöscht werden.

strReader = "C:\PROGRA~2\FOXITS~1\FOXITR~1\

xitr~1.exe"

strOption = "-NoRegister /p"

strPrintPath = "c:\test"

strBackupPath = "c:\test1"

Set objFSO = CreateObject("Scripting.

FileSystemObject")

Set objFolder = objFSO.getFolder(strPrintPath)

Set objFiles = objFolder.files

set objShell = createobject("WScript.Shell")

For Each strFile in objFiles

objShell.run(strReader & " " & strOption & " "

& _

strPrintPath & "\" & strFile.Name)

wscript.sleep 2000

objFSO.copyfile strPrintPath & "\" & strFile.

Name, _

strBackupPath & "\" & strFile.Name

objFSO.DeleteFile strPrintPath & "\" & strFile.

Name

Next

Einzige Bedingung, damit diese Variante funktioniert: Die Namen der PDF-Dateien dürfen keine Leerzeichen enthalten.

Gezielter Duplex-Druck per VBS

Um es gleich vorwegzunehmen, es gibt keine elegante Variante, um einen Ausdruck per VB-Skript oder VBA (Visual Basic for Applications) gezielt auf Duplex zu setzen. Die Einstellung, dass ein Duplex-Drucker erfolgen soll, ist in den erweiterten Druckereinstellungen unter Windows zu finden. Diese unterscheiden sich von Drucker zur Drucker. Für einige Drucker-Typen besteht die Möglichkeit, zur Laufzeit die Druckereinstellungen über die Registry im Zweig HKCU anzupassen, jedoch ist dies keine generelle Methodik, die ein IT-Profi in einer größeren Umgebung ausrollen könnte. Es bleibt nur die Möglichkeit, zwei Druckerwarteschlangen einzupflegen, die auf ein und denselben Drucker zielen.

Während der eine Drucker standardmäßig ohne Duplex arbeitet, generiert die zweite Warteschlange stets Duplex-Ausdrucke. Über dieses VB-Skript ermittelt Windows, ob ein Duplex-Drucker vorhanden ist (wir haben den Druckernamen mit .dp erweitert) oder nicht:

strComputer = "."

Set objWMI = GetObject _

("winmgmts:{impersonationLevel=impersonate}!\\"

_

& strComputer & "\root\cimv2")

Set colPrinters = objWMI.ExecQuery _

("Select comment,name from Win32_

Printer")

For Each objPrinter In colPrinters

if lcase(right(objPrinter.Name,3)) = ".dp"

then _

strDuplexPrinterName = objPrinter.Name

Next

Set objWord = CreateObject("Word.Application")

With objWord

.Visible = false

if strDuplexPrinterName <> "" then

.Documents.Open ("{duplex_vorlage}")

else

.Documents.Open ("{einzel_seiten_vorlage}")

end if

strStandardDrucker = .ActivePrinter

if strDuplexPrinterName <> "" then _

.ActivePrinter = strDuplexPrinterName

.ActiveDocument.printout PrintZoomWidth=11907,

_

PrintZoomPaperHeight=16839

if strDuplexPrinterName <> "" then _

.ActivePrinter = strStandardDrucker

.ActiveDocument.SaveAs _

objShell.ExpandEnvironmentStrings

("%temp%") _

& "\fm.docx.tmp"

.ActiveDocument.close

.quit

end with

Für die Druckvariante mit Duplex wird in dem Skript eine andere Vorlage ausgewählt und geöffnet, als für den Standard-Druck. Der Name des aktuellen Druckers (.ActivePrinter) wird in der Variable strStandardDrucker gesichert und nach einer etwaigen Umschaltung auf den Duplex-Drucker wieder zurückgesetzt. Das ist nur erforderlich, sofern in diesem Skript weitere Druckbefehle folgen sollten.