ad
Goto Top

automatisches mappen von Druckern in der Domäne mit Loadbalancing der Druckserver

Hallo und guten Tag,

ich hatte mich immer darüber geärgert das die Funktion von Microsoft theoretisch vorhanden ist, aber leider nicht nutzbar.
Ich war es aber auch leid immer bei einem neuen Drucker die batchdatei anzupassen.
Dieses Script benötigt keine erneute Anpassung (ausser es hat einer noch einen Verbesserungsvorschlag face-smile ) mehr.

Hoffe das jemand was damit anfangen und einsetzen kann.

Voraussetzung:

- lesenden Remotzugriff auf WMI-Objekt der Print-Server
- den Druckspoolern unterschiedlichen AD-Gruppen zuordnen

---------------------------------- install_print.vbs ----------------------------------------
' <Kommentar>  
' Michael Volk, 03.03.2009  

' Fehlerhandling einschalten  
'On Error Resume Next  

'Definition der Druckspool-Server  
ArrServer = Array("PRINT01", "PRINT02")  

'Variable leeren  
ServerStatus = "0"  

'Überprüfung der Betriebssystem-Version  

if CheckOS = 2195 then
'Windows 2000'  
'Wscript.echo "Win2K"  
vDefaultPrinter = DelAllPrinter_Win2K
Spooler (ArrServer)
SetDefaultPrinter_Win2K (vDefaultPrinter)
else
'>Windows 2000'  
'Wscript.echo "otherWin"  
vDefaultPrinter = DelAllPrinter_other
Spooler (ArrServer)
SetDefaultPrinter_other (vDefaultPrinter)
end if

'Ermittelt Betriebssystem-Version (Build-Version)  
Function CheckOS
Set objWMIService = GetObject("winmgmts:" _  
& "{impersonationLevel=Impersonate}!\\localhost" & "\root\cimv2")  
Set colOperatingSystems = objWMIService.ExecQuery _
("Select * from Win32_OperatingSystem")  
For Each objOperatingSystem in colOperatingSystems
CheckOS = objOperatingSystem.BuildNumber
Next
End Function

'Ermittlung des DefaultPrinters und Löschung aller installierten Netzwerkdrucker  
'Routine für Windows 2000 (Build=2195)  

Function DelAllPrinter_WIN2K
'Wscript.echo "DelAllPrinter"  
'Fehlerhandling einschalten  
On Error Resume Next

'Variablendeklaration  
Dim wmi, localPrinters, localPrinter, KeyX, WSHShell

Set objNetwork = CreateObject("WScript.Network")  
'Via WMI alle Drucker suchen, die lokal installiert sind.  
Set wmi = GetObject("winmgmts:\\.\root\CIMV2")  
Set localPrinters = wmi.InstancesOf("Win32_Printer", 48)  
Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\localhost" & "\root\cimv2")  
Set WSHShell = WScript.CreateObject("WScript.Shell")  
KeyX = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"  
DefaultPrinter = WshShell.RegRead( KeyX )
vDefaultPrinter = Left ( DefaultPrinter, InStr( DefaultPrinter, ",")-1 )  
'Wscript.echo "" & vDefaultPrinter  
DelAllPrinter_Win2K = vDefaultPrinter

'alle gefundenen Drucker durchlaufen ...  
For Each localPrinter In localPrinters
' ... und prüfen ob es ein Netzwerkdrucker ist.  
If left(localPrinter.ServerName,2) = "\\" Then  
' Wenn ja, dann wird er gelöscht  
objNetwork.RemovePrinterConnection localPrinter.Name
End If
Next
End Function


Sub SetDefaultPrinter_Win2K (vDefaultPrinter)
' Fehlerhandling einschalten  
'Wscript.echo "DefaultPrinter"  
On Error Resume Next
gefunden = 0
Set WshNetwork = CreateObject("WScript.Network")  
Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\localhost" & "\root\cimv2")  
Set dPrinters = objWMIService.ExecQuery("select * from Win32_Printer where Location='Kopierraum'")  
Set colItems = objWMIService.ExecQuery("select * from Win32_Printer where servername is not null")  
Dim KeyX, WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")  
KeyX = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"  
DefaultPrinter = WshShell.RegWrite( KeyX )
vDefaultPrinter = Left ( DefaultPrinter, InStr( DefaultPrinter, ",")-1 )  
'Wscript.echo "" & vDefaultPrinter  
For Each objItem in colItems
if gefunden = 0 then
nDefaultPrinter = objItem.ShareName
dPrinterPath = objItem.Caption
if (vDefaultPrinter = dPrinterPath) then
WshNetwork.SetDefaultPrinter dPrinterPath
gefunden = 1
Else
gefunden = 0
end if
end if
Next
if gefunden = 0 Then
For Each dprinter in dprinters
'Wscript.echo "DisplayName: " & dprinter.ShareName  
Printer = dprinter.Caption
WshNetwork.SetDefaultPrinter Printer
'Wscript.echo "Abbruch: " & Printer  
Next
end if
End Sub

'Einrichtung aller Netzwerkdrucker  
'Übergabeparameter: strDruckspooler (= Druckspool-Server)  
Sub InstallPrinter(strDruckspooler)
'Wscript.echo "InstallPrinter"  
'Fehlerhandling einschalten  
On Error Resume Next
objPrinters = Array(50)
Set objWMIService = GetObject("winmgmts:\\" & strDruckspooler & "\root\cimv2")  
Set objPrinters = objWMIService.ExecQuery("Select Caption from Win32_Printer where not Name='Fax'")  
Set WshNetwork = CreateObject("WScript.Network")  
Set FileSysObj = CreateObject("Scripting.FileSystemObject")  
For Each objPrinter In objPrinters
PrinterPath="\\" & strDruckspooler & "\" & objPrinter.Caption  
WshNetwork.AddWindowsPrinterConnection PrinterPath, "PrinterDriver"  
Next
End Sub

'Ermittlung des aktiven Druckspool-Servers  
Sub Spooler (ArrServer)
'Fehlerhandling einschalten  
On Error Resume Next
For Each strDruckspooler In ArrServer
Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & strDruckspooler & "\root\cimv2")  
Set colItems = objWMIService.ExecQuery("Select * from Win32_Service where Name = 'Spooler'")  
For Each objItem in colItems
if (objItem.State = "Running" and ServerStatus = "0") then  
InstallPrinter (strDruckspooler)
ServerStatus = "1"  
end if
Next
Next
End Sub

'Löschen der lokalen netzwerkdrucker und ermitteln des DefaultPrinter  
Function DelAllPrinter_other
' 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)  
Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\localhost" & "\root\cimv2")  
Set colItems = objWMIService.ExecQuery("Select ShareName from Win32_Printer where Default='True'")  
'Wscript.echo "HELLO: " & colItems  
For Each objItem in colItems
DelAllPrinter_other = objItem.ShareName
Next
' 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  
localPrinter.Delete_
' Fehlerhandling  
If Err.number <> 0 Then
Wscript.echo "Fehler beim löschen des Druckers: " _  
& localPrinter.Name & " --- " & Err.number  
Err.Clear
End If
End If
Next
End Function

Sub SetDefaultPrinter_other (vDefaultPrinter)
' Fehlerhandling einschalten  
'Wscript.echo "DefaultPrinter"  
On Error Resume Next
gefunden = 0
Set WshNetwork = CreateObject("WScript.Network")  
Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\localhost" & "\root\cimv2")  
Set dPrinters = objWMIService.ExecQuery("select * from Win32_Printer where Location='Kopierraum'")  
Set colItems = objWMIService.ExecQuery("select * from Win32_Printer where shared = true")  
For Each objItem in colItems
if gefunden = 0 then
nDefaultPrinter = objItem.ShareName
dPrinterPath = objItem.Caption
if (vDefaultPrinter = nDefaultPrinter) then
WshNetwork.SetDefaultPrinter dPrinterPath
gefunden = 1
Else
gefunden = 0
end if
end if
Next
if gefunden = 0 Then
For Each dprinter in dprinters
Wscript.echo "DisplayName: " & dprinter.ShareName  
Printer = dprinter.Caption
WshNetwork.SetDefaultPrinter Printer
Wscript.echo "Abbruch: " & Printer  
Next
end if
End Sub

-----------------------------------------------------------------------------------------------------------------------

Viel Spaß

Michael

Content-Key: 128265

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

Ausgedruckt am: 19.03.2024 um 03:03 Uhr

Mitglied: neueradmuser
neueradmuser 29.10.2009 um 21:47:11 Uhr
Goto Top
Hi, leider sagt mir dein script nicht so wirklich viel, auch wenn ich so scripte mag ;)

kennst du evtl eine Möglichkeit gewisse Drucker im Netzwerk zu verteilen und oder abzuändern?
haben an die 100-150 Workstations und div. Server... jeder soll alle Drucker installiert bekommen, und sich dann seinen "lieblingsdrucker" aussuchen können. möglichst der der am nächsten zum Arbeitsplatz ist.

Leider bin ich in sowas nicht so fit ... hast du eine Idee?

mfg
Mitglied: Dani
Dani 29.10.2009 um 23:04:23 Uhr
Goto Top
Hi,
vor Weg...deine Frage hat nichts mit dem Tipp buw. Anleitung zu tun. Bitte daher einen neue Frage formulieren. Du darfst gerne per Link auf diesen Beitrag verweisen.


Grüße,
Dani (Editor)