Netzwerkdrucker automatisch verbinden - ein Lösungsvorschlag
Bisherige Lösungen waren mir zu unflexibel.
Unsere AD-Struktur ist nicht nach Räumlichkeiten aufgebaut, sondern nach Abteilungen, also z.B. QM oder Produktion. Da aber z.B. die QM in verschiedenen Werken sitzt und die QM'ler gerne auch Werksübergreifend drucken (also die drucken sich gegenseitig Zettel aus), zentrale Abteilungsdrucker vorhanden sind auf die wiederum auch von anderen Abteilungen und Standorten gedruckt wird und es auch noch freigegebene lokale Drucker gibt, waren bisherige Lösungsvorschläge einfach nicht umsetzbar.
So hab ich das gelöst:
Teil 1:
Eine Liste mit allen Rechnernamen, für die das Skript gelten soll (steht ein Rechner nicht drin, oder steht hinter dem Rechnernamen kein Netzwerkdrucker, dann wird das Skript beendet). Neben dem Rechnernamen steht der oder die Netzwerkdrucker. Es können auch freigegebene Clientdrucker verbunden werden (siehe PC004).
Drucker.ini:
(In unserem Netzwerk hab ich ca. 400 Rechner in dieser Liste.)
Der Drucker, vor dem ein "S" steht wird der Standarddrucker, steht kein "S" in der Zeile bleibt der Standarddrucker (z.B. ein lokaler Drucker) erhalten.
Teil 2:
Ein VB-Skript welches die INI-Datei durchläuft, auswertet und die Druckerverbindungen erstellt. Einfach anschauen, ist gut kommentiert. Steht in der Zeile vom Client mindestens 1 Netzwerkdrucker, werden erst mal ALLE vorhandenen Verbindungen am Client gelöscht, und dann die Netzwerkdrucker aus der Drucker.ini verbunden.
DruckerVerbinden.vbs:
Ich empfehle zur Ablage der beiden Dateien das NETLOGON-Verzeichnis eines DC, damit wird das Skript auf alle DC's repliziert. Bei mir liegt es im Unterverzeichnis "Drucker (\\DeinDC\NETLOGON\Drucker). Es wird im Skript die Variable %LOGONSERVER% ausgewertet, damit wird das Skript immer vom DC am Standort geladen. Liegen die beiden Dateien in einem anderen Verzeichnis, muss das VBS-Skript angepasst werden.
Das Skript wird bei der Anmeldung des Benutzers abgearbeitet. Folgendermassen wird es (bei uns) im Loginskript aufgerufen:
Es geht aber auch über einen Doppelklick auf die DruckerVerbinden.vbs oder über eine Batch-Datei oder sonstwie.
Vorteile:
Funktioniert auch ohne AD (also z.B. NT4 oder Samba)
Sehr flexibel
Ideal wenn Standort- oder Abteilungsübergreifend (OU-Übergreifend) gedruckt werden soll
Ungültige Druckerverbindungen werden gelöscht
Es können leicht Ausnahmen definiert werden
Nachteile:
Ausführung von VBS-Skripten darf nicht verboten sein
Muss gepflegt werden (anfangs mehr, dann immer weniger)
Bekannte Mängel:
Wird ein Drucker auf dem Printserver gelöscht, kann das Skript die Druckerverbindung an den Clients nicht mehr richtig entfernen, daher erst den Drucker am Printserver ANHALTEN, dann die Verbindungen zu den Clients über das Druckerskript löschen. Nach einiger Zeit (ca. 2 Wochen) kann man dann den Drucker vom Printserver löschen.
Wenn der Printserver (egal ob richtiger Printserver od. freigegebener Clientdrucker) nicht verfügbar ist, bricht das Skript ab. Es kann also vorkommen, das ein Client keine Drucker mehr hat, wenn der Printserver nicht verfügbar ist!! Evtl. hat von euch da einer eine Idee?
Viel Spass damit
Thomas
Unsere AD-Struktur ist nicht nach Räumlichkeiten aufgebaut, sondern nach Abteilungen, also z.B. QM oder Produktion. Da aber z.B. die QM in verschiedenen Werken sitzt und die QM'ler gerne auch Werksübergreifend drucken (also die drucken sich gegenseitig Zettel aus), zentrale Abteilungsdrucker vorhanden sind auf die wiederum auch von anderen Abteilungen und Standorten gedruckt wird und es auch noch freigegebene lokale Drucker gibt, waren bisherige Lösungsvorschläge einfach nicht umsetzbar.
So hab ich das gelöst:
Teil 1:
Eine Liste mit allen Rechnernamen, für die das Skript gelten soll (steht ein Rechner nicht drin, oder steht hinter dem Rechnernamen kein Netzwerkdrucker, dann wird das Skript beendet). Neben dem Rechnernamen steht der oder die Netzwerkdrucker. Es können auch freigegebene Clientdrucker verbunden werden (siehe PC004).
Drucker.ini:
PC001;S\\printserver1\drucker1;\\printserver2\drucker7
PC002;\\printserver2\drucker7;S\\printserver1\drucker2
PC003
PC004;\\PC001\druckerXY
Notebook1;\\printserver2\drucker2
(In unserem Netzwerk hab ich ca. 400 Rechner in dieser Liste.)
Der Drucker, vor dem ein "S" steht wird der Standarddrucker, steht kein "S" in der Zeile bleibt der Standarddrucker (z.B. ein lokaler Drucker) erhalten.
Teil 2:
Ein VB-Skript welches die INI-Datei durchläuft, auswertet und die Druckerverbindungen erstellt. Einfach anschauen, ist gut kommentiert. Steht in der Zeile vom Client mindestens 1 Netzwerkdrucker, werden erst mal ALLE vorhandenen Verbindungen am Client gelöscht, und dann die Netzwerkdrucker aus der Drucker.ini verbunden.
DruckerVerbinden.vbs:
'*******************************************************************
'*DruckerVerbinden.vbs
'*
'* Verbindet anhand des Rechnernamens alle in der Drucker.ini angegebenen
'* Netzdrucker mit dem PC und setzt auch passend den Standarddrucker
'*
'* 2006 by Thomas
'* für Script Host Version 5.6
'*
'*******************************************************************
'* Konstanten und Variablen
Const ForReading = 1, ForWriting = 2
Dim WSHNet, WSHShell, fso, IniFile, POP, PCName, Meldung, Argument, i, strPrinter
Dim objNetwork, objPrinters
Dim intLoop
Set WSHNet = CreateObject("WScript.Network")
Set WSHShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Set IniFile = fso.OpenTextFile(WshShell.ExpandEnvironmentStrings("%LOGONSERVER%") & "\NETLOGON\DRUCKER\Drucker.ini", ForReading, False)
On Error Resume Next
PCName = UCase(WSHNet.ComputerName)
'Zeilenweises Einlesen der ini-Datei
Do While Not IniFile.AtEndOfStream
strRecord = IniFile.ReadLine
if strRecord = "" Then
Else
'Aufteilen der eingelesenen Zeile durch ein Trennzeichen in ein Array
arrRecord = Split(strRecord, ";")
'Wenn der 1. Wert im Array = Rechnername dann weitermachen
If arrRecord(0) = PCName Then
i = 0
'Zählen der übergebenen Argumente
For Each Argument in arrRecord
i = i + 1
Next
'Anzahl der Drucker im Array = übergebene Argumente - 1 (da PCName = 1. Argument)
i = i - 1
'Wenn nur ein Argument (der Rechnername) übergeben wurde, wird das Skript beendet
If i = 0 Then
WScript.Quit
End if
'Ist midestens ein Drucker vorhanden, dann werden erst mall ALLE Netzwerkdrucker getrennt
Set objNetwork = WScript.CreateObject("WScript.Network")
Set objPrinters = objNetwork.EnumPrinterConnections
For intLoop = 0 to objPrinters.Count - 1
objNetwork.RemovePrinterConnection objPrinters.Item(intLoop),-1,-1
WScript.Sleep 500
Next
'Für jedes Argument >0 wird ein Drucker verbunden
Do while i > 0
'Steht ein "S" an erster stelle, dann wird es der Standarddrucker
If Left(arrRecord(i), 1) = "S" Then
strPrinter = Right(arrRecord(i),Len(arrRecord(i))-1)
WSHNet.AddWindowsPrinterConnection strPrinter
WSHNet.SetDefaultPrinter strPrinter
'Sleep wurde eingebaut, da bei ein paar Rechnern keine Drucker verbunden wurden
WScript.Sleep 1000
i = i - 1
Else
'Kein "S" kein Standarddrucker
WSHNet.AddWindowsPrinterConnection arrRecord(i)
WScript.Sleep 1000
i = i - 1
End If
Loop
'Meldung = "Druckerverbindung für " & PCName & " erfolgreich"
'POP = WSHShell.Popup(Meldung,3,"Euer Druckerskript")
WScript.Quit
End if
End If
Loop
Ich empfehle zur Ablage der beiden Dateien das NETLOGON-Verzeichnis eines DC, damit wird das Skript auf alle DC's repliziert. Bei mir liegt es im Unterverzeichnis "Drucker (\\DeinDC\NETLOGON\Drucker). Es wird im Skript die Variable %LOGONSERVER% ausgewertet, damit wird das Skript immer vom DC am Standort geladen. Liegen die beiden Dateien in einem anderen Verzeichnis, muss das VBS-Skript angepasst werden.
Das Skript wird bei der Anmeldung des Benutzers abgearbeitet. Folgendermassen wird es (bei uns) im Loginskript aufgerufen:
WSHShell.run WshShell.ExpandEnvironmentStrings("%LOGONSERVER%") & "\NETLOGON\DRUCKER\DruckerVerbinden.vbs", 0, true
Es geht aber auch über einen Doppelklick auf die DruckerVerbinden.vbs oder über eine Batch-Datei oder sonstwie.
Vorteile:
Funktioniert auch ohne AD (also z.B. NT4 oder Samba)
Sehr flexibel
Ideal wenn Standort- oder Abteilungsübergreifend (OU-Übergreifend) gedruckt werden soll
Ungültige Druckerverbindungen werden gelöscht
Es können leicht Ausnahmen definiert werden
Nachteile:
Ausführung von VBS-Skripten darf nicht verboten sein
Muss gepflegt werden (anfangs mehr, dann immer weniger)
Bekannte Mängel:
Wird ein Drucker auf dem Printserver gelöscht, kann das Skript die Druckerverbindung an den Clients nicht mehr richtig entfernen, daher erst den Drucker am Printserver ANHALTEN, dann die Verbindungen zu den Clients über das Druckerskript löschen. Nach einiger Zeit (ca. 2 Wochen) kann man dann den Drucker vom Printserver löschen.
Wenn der Printserver (egal ob richtiger Printserver od. freigegebener Clientdrucker) nicht verfügbar ist, bricht das Skript ab. Es kann also vorkommen, das ein Client keine Drucker mehr hat, wenn der Printserver nicht verfügbar ist!! Evtl. hat von euch da einer eine Idee?
Viel Spass damit
Thomas
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 45690
Url: https://administrator.de/contentid/45690
Ausgedruckt am: 22.11.2024 um 07:11 Uhr
10 Kommentare
Neuester Kommentar
Hallo Tom,
schick Ich hatte schon länger was in dieser Richtung gesucht.
Eine kleine Anmerkung für alle, die (wie ich) Anfänger auf dem Gebiet sind: in der Drucker.ini muß der Rechnername groß geschrieben sein, sonst läuft das Script fehler- aber leider auch wirkungslos durch (der Eintrag bekommt kein Match zu PCName).
Auf diese Weise habe ich das Script analysiert und bei der Gelegenheit IMO auch halbwegs verstanden, hat auch sein Gutes.
geTuemII
schick Ich hatte schon länger was in dieser Richtung gesucht.
Eine kleine Anmerkung für alle, die (wie ich) Anfänger auf dem Gebiet sind: in der Drucker.ini muß der Rechnername groß geschrieben sein, sonst läuft das Script fehler- aber leider auch wirkungslos durch (der Eintrag bekommt kein Match zu PCName).
Auf diese Weise habe ich das Script analysiert und bei der Gelegenheit IMO auch halbwegs verstanden, hat auch sein Gutes.
geTuemII
@geTuemII
gemini
in der Drucker.ini muß der Rechnername groß geschrieben sein,
... lässt sich so umgehen:If UCase(arrRecord(0)) = PCName Then
gemini
Das Abrechen des Scripts verhindern?
On Error Resume Next
Aber man möchte natürlich noch wissen, was schiefgelaufen ist:
Es gibt da ein schönes Objekt: Err das immer generiert wird wenn was schiefläuft.
If Err.Number <> 0 Then
.....
End If
Und die Auswertung mit Err.Description und Err.Source in ein Logfile oder Eventlog (WShell.LogEvent) macht das ganze
professionell
/hydrotoxin
On Error Resume Next
Aber man möchte natürlich noch wissen, was schiefgelaufen ist:
Es gibt da ein schönes Objekt: Err das immer generiert wird wenn was schiefläuft.
If Err.Number <> 0 Then
.....
End If
Und die Auswertung mit Err.Description und Err.Source in ein Logfile oder Eventlog (WShell.LogEvent) macht das ganze
professionell
/hydrotoxin
@Kampfnudel:
Ok, dann konstruiere ich mal ein Szenario; der Klassiker: du hast einen Farblaser, auf den aber nur einige Abteilungen wirklich dauernd farbig drucken müssen, allen anderen reicht sw. Wenn du jetzt einen Drucker einrichtest und freigibst, muß immer eine der Gruppen die Druckereinstellungen verstellen.
Mein Vorgehen: ich lege zwei Drucker mit demselben Treiber an, konfiguriere die unterschiedlichen Druckeinstellungen für den Standard gebe beide Drucker mit passendem Namen frei (im Beispiel Drucker Farbe und Drucker sw). Mit dem Script oben verbinde ich jeweils den Drucker als Standard, der dauernd benötigt wird (also entweder Farbe oder sw), in manchen Fällen auch zusätzlich den anderen (wenn normalerweise sw benötigt wird und nur ab und zu Farbe). Auf diese Weise müssen sich die MA nicht um die Druckereinstellungen kümmern und es besteht die berechtigte Hoffnung, daß die Standardeinstellungen auch dem entsprechen, was der MA erwartet.
Nun klarer?
geTuemII
Ok, dann konstruiere ich mal ein Szenario; der Klassiker: du hast einen Farblaser, auf den aber nur einige Abteilungen wirklich dauernd farbig drucken müssen, allen anderen reicht sw. Wenn du jetzt einen Drucker einrichtest und freigibst, muß immer eine der Gruppen die Druckereinstellungen verstellen.
Mein Vorgehen: ich lege zwei Drucker mit demselben Treiber an, konfiguriere die unterschiedlichen Druckeinstellungen für den Standard gebe beide Drucker mit passendem Namen frei (im Beispiel Drucker Farbe und Drucker sw). Mit dem Script oben verbinde ich jeweils den Drucker als Standard, der dauernd benötigt wird (also entweder Farbe oder sw), in manchen Fällen auch zusätzlich den anderen (wenn normalerweise sw benötigt wird und nur ab und zu Farbe). Auf diese Weise müssen sich die MA nicht um die Druckereinstellungen kümmern und es besteht die berechtigte Hoffnung, daß die Standardeinstellungen auch dem entsprechen, was der MA erwartet.
Nun klarer?
geTuemII
Hallo,
ich greife den Thread mal wieder auf mit einem Problem:
Das Skript habe ich über Jahre begeistert unter Win XP eingesetzt. Nach der Umstellung auf Win7 stellt sich das Problem, dass bei der Ausführung der Benutzer gefragt wird, ob er die Druckertreiber installieren will. Kann man das irgendwie unterdrücken?
Gruß
Thomas
ich greife den Thread mal wieder auf mit einem Problem:
Das Skript habe ich über Jahre begeistert unter Win XP eingesetzt. Nach der Umstellung auf Win7 stellt sich das Problem, dass bei der Ausführung der Benutzer gefragt wird, ob er die Druckertreiber installieren will. Kann man das irgendwie unterdrücken?
Gruß
Thomas