tom73
Goto Top

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:
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

Content-ID: 45690

Url: https://administrator.de/contentid/45690

Ausgedruckt am: 22.11.2024 um 07:11 Uhr

geTuemII
geTuemII 05.12.2006 um 20:45:44 Uhr
Goto Top
Hallo Tom,

schick face-smile 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
gemini
gemini 15.12.2006 um 22:16:23 Uhr
Goto Top
@geTuemII
in der Drucker.ini muß der Rechnername groß geschrieben sein,
... lässt sich so umgehen:
If UCase(arrRecord(0)) = PCName Then

gemini
hydrotoxin
hydrotoxin 18.04.2007 um 12:51:19 Uhr
Goto Top
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
Dynadrate
Dynadrate 13.05.2007 um 13:21:38 Uhr
Goto Top
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ß?
Kampfnudel
Kampfnudel 22.02.2008 um 15:24:25 Uhr
Goto Top
Nun du kannst Problemlos die Drucker Personen zuweisen (was bei 400 Personen dumm ist) und computer bezogen hat zumindenst bei mir nicht funktioniert
Tom73
Tom73 22.02.2008 um 19:26:12 Uhr
Goto Top
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
geTuemII 23.02.2008 um 01:25:54 Uhr
Goto Top
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. face-wink

geTuemII
Kampfnudel
Kampfnudel 24.02.2008 um 08:50:21 Uhr
Goto Top
Hmm das Verstehe ich nicht ganz wie du das meinst? Kannst du das etwas Ausführlicher schreiben?
geTuemII
geTuemII 25.02.2008 um 13:27:23 Uhr
Goto Top
@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
hochmohr
hochmohr 19.12.2011 um 12:30:58 Uhr
Goto Top
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