mamamia 13 Geschrieben 26. November 2010 Melden Teilen Geschrieben 26. November 2010 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 Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 26. November 2010 Autor Melden Teilen Geschrieben 26. November 2010 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. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.