Jump to content

Netzwerkdrucker installation mit ADS Gruppen, WSH und Powershell


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Servus,

 

gleich eins vorweg, ich weiss im 2k8R2 gehts auch über GPO´s ;)

Möchte hier aber mal meine Lösungen für alle anderen Vorstellen.

 

Vorraussetzungen: Powershell 2.0 (+Quest CMDLETs), WSH, AD Gruppen für die Druckerzuordnung

 

Die AD Gruppen werden wie die Drucker benannt, User oder Abteilungsgruppen dann den Druckergruppen hinzugefügt:

Drucker-Gruppen-Namen:

DE-P-IT-001

DE-P-IT-002

DE-P-IT-003

...

 

Beim Anmelden wird dann geprüft, in welcher Gruppe der User direkt oder indirekt (Group nesting) Mitglied ist.

 

Hier die WSH Lösung:

' Region Description
'
' Name:			performPrinterInstallation
' Author:		mamamia
' Version:		0.4
'			0.4 | Anpassung an neue Firma
'			0.3 | Gruppenzugehörigkeit in eigenes Array verlagert
'			0.2 | Multidomänfahig gemacht
'			0.1 | Grundscript
' Description:	Verteilt Drucker anhand von Zugehörigkeit einer Druckergruppe
' 
' 
' EndRegion

Set objNetwork 	= CreateObject("WScript.Network")
Set WSHShell	= CreateObject("WScript.Shell")
Set oFileSys 	= CreateObject("Scripting.FileSystemObject")
Set objcon 		= CreateObject("ADODB.Connection")

name 		= WSHShell.ExpandEnvironmentStrings("%USERNAME%")
PrintServer		= "\\Printserver\"
Domain 		= objNetwork.UserDomain	

Dim strLDAPQuery
Dim objcon
strPrinterOU = "<LDAP://OU der Drucker>;(&(objectClass=group)); distinguishedName,name;subtree"

' Falls Variablen nicht gesetzt wurden, Script beenden
If strLDAPQuery = "" Or strPrinterOU = "" Then
WScript.Quit
End If

On Error Resume Next
' Userobjekt deklarieren um auf Attribute zugreifen zu können
objcon.Open "Provider=ADSDSOObject"
Set rs 		= objcon.Execute(strLDAPQuery)
Set objUser = GetObject(rs("adspath"))
If Err.number <> 0 Then
WScript.Quit
End If
On Error Goto 0

Dim UserGroups()

If IsArray(objUser.memberOf) = 0 Then
ReDim UserGroups(1)
UserGroups(0) = objUser.memberOf
Else
ReDim UserGroups(UBound(objUser.memberOf))
I = 0
For Each Group In objUser.memberOf
	UserGroups(I) = Group
	I = I + 1
Next
End If

' OU Auslesen um Drucker Gruppen zu ermitteln
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objcon
objCommand.CommandText = strPrinterOU
Set objRecordSet = objCommand.Execute

' Prüfen ob User in einer DruckerGruppe ist oder eine Gruppe in der DruckerGruppe in der der User Mitglied ist
' Bsp1: User direkt in Gruppe DE-P-IT-001
' Bsp2: User in der Gruppe DE-DG-IT; DE-DG-IT Mitglied der Gruppe DE-P-IT-001

While Not objRecordSet.EOF
Set objGroup = GetObject ("LDAP://" & objRecordSet.Fields("distinguishedName"))
objGroup.GetInfo
' wenn User keine Gruppenmitgliedschaft hat

On Error Resume Next
	arrMembersOf = objGroup.GetEx("member") ' wenn DruckerGruppe keine Mitglieder enthält gibt es einen Runtimeerror, der wird hier abgefangen
	FehlerCode = Err.number
On Error Goto 0
If Not FehlerCode <> 0 Then
	For Each Group In UserGroups
		If Group = objRecordSet.Fields("distinguishedName") Then ' Wenn User in einer PrinterGruppe
			installPrinter objRecordSet.Fields("name")
			gefunden = True
		End If
	Next
	If gefunden = False Then
		For Each strMemberOf In arrMembersOf
			For Each Group In UserGroups
				If Group = strMemberOf Then	' Wenn eine Gruppe in der der User ist Mitglied ist
					installPrinter objRecordSet.Fields("name")
				End If
			Next
		Next
	End If
End If
gefunden = False
objRecordSet.MoveNext	
Wend
objcon.Close 
WScript.Quit

Function installPrinter (PrinterName)
Err.Clear
On Error Resume Next
	objNetwork.AddWindowsPrinterConnection PrintServer & PrinterName
	FehlerNr = Err.number
	Fehler   = Err.Description
On Error Goto 0

Select Case FehlerNr
	Case "-2147023095"
		Fehler = "Gruppe in AD entspricht nicht dem Druckernamen. Schreibweise prüfen!"
End Select
End Function

Link zu diesem Kommentar

Hier die Powershelllösung:

# Region Description
#
# Name:		mapNetworkprinter
# Author:	mamamia
# Version:	0.1
# Description:	Netzwerkdrucker werden gemäß Gruppenzugehörigkeit gemappt
# 
# EndRegion

Add-PSSnapin *Quest*

$net = new-Object -com WScript.Network
Get-QADMemberOf $ENV:USERNAME -Indirect -Name 'DE-P*' | foreach {$net.AddWindowsPrinterConnection("\\Printserver\"+$_.Name)}

 

Das PS-Script ist noch in der Entwicklung ;)

 

Ich finde, dass ist auch ein recht ansehnlicher Vergleich, zwischen Powershell und WSH, wie viel einfacher hier doch einiges ist!

Auf die Prüfung von vorhanden sein der Drucker habe ich verzichtet, da die Funktionen dies selber tun.

Sollte ein Netzwerkdrucker gemappt sein, dann wird dieser übersprungen.

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...