Netzwerkdrucker automatisch verbinden - ein Lösungsvorschlag
30.11.2006
08:11:00 Uhr51339 Aufrufe
10 Antworten
08:11:00 Uhr
10 Antworten
Noch nicht bewertet
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
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:
01.
PC001;S\\printserver1\drucker1;\\printserver2\drucker7 02.
PC002;\\printserver2\drucker7;S\\printserver1\drucker2 03.
PC003 04.
PC004;\\PC001\druckerXY 05.
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:
01.
'******************************************************************* 02.
'*DruckerVerbinden.vbs 03.
'* 04.
'* Verbindet anhand des Rechnernamens alle in der Drucker.ini angegebenen 05.
'* Netzdrucker mit dem PC und setzt auch passend den Standarddrucker 06.
'* 07.
'* 2006 by Thomas 08.
'* für Script Host Version 5.6 09.
'* 10.
'******************************************************************* 11.
12.
13.
'* Konstanten und Variablen 14.
Const ForReading = 1, ForWriting = 2 15.
Dim WSHNet, WSHShell, fso, IniFile, POP, PCName, Meldung, Argument, i, strPrinter 16.
17.
Dim objNetwork, objPrinters 18.
Dim intLoop 19.
20.
Set WSHNet = CreateObject("WScript.Network") 21.
Set WSHShell = CreateObject("WScript.Shell") 22.
Set fso = CreateObject("Scripting.FileSystemObject") 23.
Set IniFile = fso.OpenTextFile(WshShell.ExpandEnvironmentStrings("%LOGONSERVER%") & "\NETLOGON\DRUCKER\Drucker.ini", ForReading, False) 24.
25.
On Error Resume Next 26.
27.
PCName = UCase(WSHNet.ComputerName) 28.
29.
'Zeilenweises Einlesen der ini-Datei 30.
Do While Not IniFile.AtEndOfStream 31.
strRecord = IniFile.ReadLine 32.
if strRecord = "" Then 33.
Else 34.
'Aufteilen der eingelesenen Zeile durch ein Trennzeichen in ein Array 35.
arrRecord = Split(strRecord, ";") 36.
'Wenn der 1. Wert im Array = Rechnername dann weitermachen 37.
If arrRecord(0) = PCName Then 38.
i = 0 39.
'Zählen der übergebenen Argumente 40.
For Each Argument in arrRecord 41.
i = i + 1 42.
Next 43.
'Anzahl der Drucker im Array = übergebene Argumente - 1 (da PCName = 1. Argument) 44.
i = i - 1 45.
'Wenn nur ein Argument (der Rechnername) übergeben wurde, wird das Skript beendet 46.
If i = 0 Then 47.
WScript.Quit 48.
End if 49.
50.
'Ist midestens ein Drucker vorhanden, dann werden erst mall ALLE Netzwerkdrucker getrennt 51.
Set objNetwork = WScript.CreateObject("WScript.Network") 52.
Set objPrinters = objNetwork.EnumPrinterConnections 53.
For intLoop = 0 to objPrinters.Count - 1 54.
objNetwork.RemovePrinterConnection objPrinters.Item(intLoop),-1,-1 55.
WScript.Sleep 500 56.
Next 57.
58.
'Für jedes Argument >0 wird ein Drucker verbunden 59.
Do while i > 0 60.
'Steht ein "S" an erster stelle, dann wird es der Standarddrucker 61.
If Left(arrRecord(i), 1) = "S" Then 62.
strPrinter = Right(arrRecord(i),Len(arrRecord(i))-1) 63.
WSHNet.AddWindowsPrinterConnection strPrinter 64.
WSHNet.SetDefaultPrinter strPrinter 65.
'Sleep wurde eingebaut, da bei ein paar Rechnern keine Drucker verbunden wurden 66.
WScript.Sleep 1000 67.
i = i - 1 68.
Else 69.
'Kein "S" kein Standarddrucker 70.
WSHNet.AddWindowsPrinterConnection arrRecord(i) 71.
WScript.Sleep 1000 72.
i = i - 1 73.
End If 74.
Loop 75.
'Meldung = "Druckerverbindung für " & PCName & " erfolgreich" 76.
'POP = WSHShell.Popup(Meldung,3,"Euer Druckerskript") 77.
WScript.Quit 78.
End if 79.
End If 80.
LoopIch 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:
01.
WSHShell.run WshShell.ExpandEnvironmentStrings("%LOGONSERVER%") & "\NETLOGON\DRUCKER\DruckerVerbinden.vbs", 0, trueEs 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
geTuemII schreibt am 05.12.2006 um 20:45:44 Uhr
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
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
hydrotoxin schreibt am 18.04.2007 um 12:51:19 Uhr
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
Dynadrate schreibt am 13.05.2007 um 13:21:38 Uhr
Hi,
es gibt unter Windows 2003 eine Printserver Funktion. Zusammen mit einem Login-skript wie KixTart scheint mir es eine gute Möglichkeit zu sein, Drucker User-oder Computerbezogen zu verbinden.
Hat der Printserver von 2003 irgendwelche Macken von denen ich noch nichts weiß?
es gibt unter Windows 2003 eine Printserver Funktion. Zusammen mit einem Login-skript wie KixTart scheint mir es eine gute Möglichkeit zu sein, Drucker User-oder Computerbezogen zu verbinden.
Hat der Printserver von 2003 irgendwelche Macken von denen ich noch nichts weiß?
Kampfnudel schreibt am 22.02.2008 um 15:24:25 Uhr
Nun du kannst Problemlos die Drucker Personen zuweisen (was bei 400 Personen dumm ist) und computer bezogen hat zumindenst bei mir nicht funktioniert
Tom73 schreibt am 22.02.2008 um 19:26:12 Uhr
computer bezogen hat zumindenst bei mir nicht funktioniert
Warum eigentlich? Hat das mit dem Skript zu tun oder ist es eher was organisatorisches, also haben sich etwa die Benutzer quergestellt?Ich muss zugeben, dass ich das Skript (leider) nicht für alle Rechner verwenden kann (kein technischer sondern ein organisatorischer Grund), weil manche Benutzer besondere Einstellungen für ihre Drucker benötigen (wollen...). Nachdem das Skript durchgelaufen ist, sind ja nur wieder die Standardeinstellungen des Druckers aktiv.
Thomas
geTuemII schreibt am 23.02.2008 um 01:25:54 Uhr
Leg doch für die verschiedenen Konfigurationen unterschiedliche Drucker samt Freigaben auf dem Server an. Das funktioniert bei mir gut, und die Streitereien unter den Usern, wer welche Einstellung verdreht hat, sind deutlich weniger geworden. 
geTuemII
geTuemII
Kampfnudel schreibt am 24.02.2008 um 08:50:21 Uhr
Hmm das Verstehe ich nicht ganz wie du das meinst? Kannst du das etwas Ausführlicher schreiben?
geTuemII schreibt am 25.02.2008 um 13:27:23 Uhr
@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
hochmohr schreibt am 19.12.2011 um 12:30:58 Uhr
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







