Wie versprochen, hier noch das Script.
Aber aufgepasst. WSH ist nicht meine Sprache. Es läuft, es macht
Logdateien und bei mir funktioniert es. Ich habe aber nur Windows XP im Einsatz.
Also auf eigene Gefahr. :-)
Wer Verbesserungsvorschläge hat, her damit. :-)
' Name: ConnectToPrinter.vbs
' Author: Roland Schumacher Alias GENiALi - http://blog.geniali.ch/
' Version: 1.0
' Description: Script das anhand des Feldes "Info" im AD die entsprechenden Drucker installiet.
' So kann man Zentral alle Drucker installieren lassen und auf "Kundenweinfach eingehen.
' Datum: 30.05.2007
Option Explicit
' Const
Const ForAppending = 8
Const LOGFOLDER = "\\Server\V\Support\Logs\Druckerinstallation\"
' EndConst
' Ein paar Variablen definieren
Dim network, user, userDn, adsInfo, sPcName
Dim oUser, printerInfo, line, lines, printerInfos
' Fehlerhandling einschalten
On Error Resume Next
' Eine aktuelle Instanz des Netzwerkobjects holen
Set network = CreateObject("WScript.Network")
' Benutzername und PC Name ermitteln.
user = network.UserName
sPcName = network.ComputerName
'Fehlerhandling mit LogFile Eintrag
If Err.number <> 0 Then
WriteLogError("Fehler beim auslesen der Userinfos wie Username und PC name: " _
& Err.number)
WriteLogError(Err.Source)
WriteLogError(Err.Description)
Err.Clear
End If
' LDAP Pfad fden akteullen User ermitteln/erstllen
Set adsInfo = CreateObject("ADSystemInfo")
userDn = "LDAP://" & adsInfo.UserName
' Das Userobject aus dem AD auslesen und auf das Feld Info zugreiffen
Set oUser = GetObject(userDn)
printerInfo = oUser.info
'Fehlerhandling mit LogFile Eintrag
If Err.number <> 0 Then
WriteLogError("Fehler beim auslesen der Infos aus dem AD: " _
& userDn & " --- " & Err.number)
WriteLogError(Err.Source)
WriteLogError(Err.Description)
Err.Clear
End If
' Array erstellen wo alle Drucker rein kommen. 50 sollten reichen. :-)
lines = Array(50)
lines = Split(printerInfo, VbCrLf)
'Fehlerhandling mit LogFile Eintrag
If Err.number <> 0 Then
WriteLogError("Fehler beim auftrennen der Druckerdefinitionsliste: " _
& printerInfo & " --- " & Err.number)
WriteLogError(Err.Source)
WriteLogError(Err.Description)
Err.Clear
End If
'Alle Netzwerkdrucker löschen
If UBound(lines) > 0 Then
DelAllPrinter
' Alle definierten Drucker aus dem Feld Info durchlaufen
For Each line In lines
'Die Definition zerlegen.
printerInfos = Split(line, ";")
'Fehlerhandling mit LogFile Eintrag
If Err.number <> 0 Then
WriteLogError("Fehler beim auftrennen der Druckerdefinition in die einzelnen Felder: " _
& line & " --- " & Err.number)
WriteLogError(Err.Source)
WriteLogError(Err.Description)
Err.Clear
End If
' Wenn eine Druckerdefinition ein ++ hat ist es der Standartdrucker
If printerInfos(0) = "++" Then
SetPrinter printerInfos(2), printerInfos(1), vbTrue
End If
' Wenn nur ein + ist wird der Drucker einfach mitinstalliert.
If printerInfos(0) = "+" Then
SetPrinter printerInfos(2), printerInfos(1), vbFalse
End If
Next
Else
WriteLogInfo("Es wurden keine Drucker zum installieren gefunden")
End If
' Installiert den Drucker
' PrintServer = Name der Servers
' PrinterName = Freigabename des Druckers
' Default = ist True wenn es der Standartdrucker ist
Sub SetPrinter(PrintServer, PrinterName, Default)
' Fehlerhandling einschalten
On Error Resume Next
' Drucker installieren.
network.AddWindowsPrinterConnection "\\" & PrintServer & "\" & PrinterName
WriteLogInfo("\\" & PrintServer & "\" & PrinterName & " wurde installiert.")
' Als Standart setzen wenn Default True ist.
If Default = vbTrue Then
network.SetDefaultPrinter "\\" & PrintServer & "\" & PrinterName
End If
' Fehlerhandling
If Err.number <> 0 Then
WriteLogError("Fehler beim verbinden des Druckers: " _
& "\\" & PrintServer & "\" & PrinterName & " --- " & Err.number)
WriteLogError(Err.Source)
WriteLogError(Err.Description)
Err.Clear
End If
End Sub
' Löscht alle Drucker die Netzwerkdrcker sind.
Sub DelAllPrinter
' Fehlerhandling einschalten
On Error Resume Next
' Ein paar Variabeln deklarieren
Dim wmi, localPrinters, localPrinter
' Via WMI alle Drucker suchen die lokal installiert sind.
Set wmi = GetObject("winmgmts:\\.\root\CIMV2")
Set localPrinters = wmi.InstancesOf("Win32_Printer", 48)
' alle gefundenen Drucker durchlaufen ...
For Each localPrinter In localPrinters
' ... und prüfen ob es ein Netzwerkdrucker ist.
If localPrinter.Network = vbTrue Then
' Wenn ja, dann wird er gelöscht
WriteLogInfo(localPrinter.Name & " wurde gelöscht")
localPrinter.Delete_
' Fehlerhandling
If Err.number <> 0 Then
WriteLogError("Fehler beim löschen des Druckers: " _
& localPrinter.Name & " --- " & Err.number)
WriteLogError(Err.Source)
WriteLogError(Err.Description)
Err.Clear
End If
End If
Next
End Sub
' Schreibt eine Logdatei weg.
Sub WriteLogInfo(Meldung)
Dim logFile, fs, stream, text
logFile = LOGFOLDER & user & "." & sPcName & ".info.log"
Set fs = CreateObject("Scripting.FileSystemObject")
Set stream = fs.OpenTextFile(logFile, ForAppending, vbTrue)
text = Now() & " - " & user & " - " & Meldung
stream.WriteLine(text)
stream.Close
End Sub
' Schreibt eine Logdatei weg.
Sub WriteLogError(Meldung)
Dim logFile, fs, stream, text
logFile = LOGFOLDER & user & "." & sPcName & ".error.log"
Set fs = CreateObject("Scripting.FileSystemObject")
Set stream = fs.OpenTextFile(logFile, ForAppending, vbTrue)
text = Now() & " - " & user & " - " & Meldung
stream.WriteLine(text)
stream.Close
End Sub
Jetzt fehlt nur noch der Hinweis wie man das Script starten kann.
Mir sind zwei Möglichkeiten bekannt.
1. Via GPO
Das sieht dann so aus. Ich gehe mal davon aus, dass der Umgang mit dem
GPO Editor klar ist.
2. Via Loginscript
Man fügt folgende Zeile im Loginscipt ein.
cscript.exe %0\..\ConnectToPrinter.vbs //B //T:120
//B -> Batchmodus, zeigt keine Fehlermeldungen an.
//T:120 -> Timeout für das Scirpt. Hat hier im Maximum 120 Sekunden zeit sein Job zu machen.