Jump to content
Sign in to follow this  
mamamia

Netzwerkdrucker installation mit ADS Gruppen, WSH und Powershell

Recommended Posts

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

Share this post


Link to post

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.

Share this post


Link to post
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Werbepartner:



×
×
  • Create New...