Option Explicit '------------------------------------------------------------------------- ' querybasedsg.vbs ' ' Beschreibung: ' ' Pflegt Gruppenmitgliedschaft anhand eines LDAP-Query ' ' Laufzeitfehler werde nicht abgefangen und beenden das Skript. ' ' Das Skript wird mit den Berechtigungen des angemeldeten Benutzers ' ausgeführt. Die entsprechenden Berechtigungen sind sicher zu stellen ' ' (c)2004 Net at Work Netzwerksysteme GmbH ' ' Version 1.0 (18. Apr 2005) ' + einfache Variante nicht Optimiert, da alle Objekte durchlaufen werden ' Version 2.0 (19. Apr 2005) ' + LDAPFilter im Query eingestellt ' + Gruppenmitgliedschaft auf einen Schlag ersetzen ' Nachteil: Immer die komplette Mitgliedsliste wird repliziert ' Besser wäre es die Gruppe zu editieren ' Version 2.1 (14. Apr 2009) ' remod mit "MOD"ulo damit Gruppen >100 Eintraege funktionieren '------------------------------------------------------------------------- Const ADS_PROPERTY_UPDATE = 2 Const LogFile = "C:\debug.log" ' Pfad und Dateiname der Log-Datei Const LogLevel = 5 ' errorlogging 0=no logging, 1=Fatal 2=Error 3=Warning 4=information 5=debug Dim Count ' Dim objCommand, objConnection, objGroup, objRecordSet, objRootDSE Dim strAttributes, strBase, strDNSDomain, strFilter, strGroupDN, strLDAPFilter, strQuery WScript.Echo WScript.ScriptName & " wurde gestartet." AppendLog "Skript gestartet", 4 Select Case WScript.Arguments.Count Case 2 ' Gruppe und LDAPQuery" strGroupDN = WScript.Arguments.Unnamed.Item(0) ' Gruppe aus Kommandozeile übernehmen strLDAPFilter = WScript.Arguments.Unnamed.Item(1) ' LDAP Filter Case 3 ' Gruppe Feld und Wert strGroupDN = WScript.Arguments.Unnamed.Item(0) ' Gruppe aus Kommandozeile übernehmen strLDAPFilter = WScript.Arguments.Unnamed.Item(1) & "=" & WScript.Arguments.Unnamed.Item(2) ' LDAPFeld Case Else AppendLog "Falsche Aufrufparameter", 2 WScript.echo "Aufrufen mit" WScript.echo "CSCRIPT querybasedsg.vbs gruppe ldapfeld inhalt" WScript.echo " z.B. gruppe cn=QBDN1,ou=Test,dc=msxfaq,dc=de" WScript.echo " z.B. LdapFeld = HomeMDB oder Department" WScript.echo " z.B. LdapWert = cn=srv01 oder Vertrieb o.a" WScript.echo " oder" WScript.echo "CSCRIPT querybasedsg.vbs gruppe ldapfiltert" WScript.echo " z.B. gruppe cn=QBDN1,ou=Test,dc=msxfaq,dc=de" WScript.echo " z.B. LdapFilter = Department=Vertrieb" End Select 'strGroupDN = "cn=QBDN1,ou=Test,dc=msxfaq,dc=de" ' Gruppe, die gepflegt wird Set objGroup = GetObject("LDAP://" & strGroupDN) ' Gruppenobjekt binden Set objRootDSE = GetObject("LDAP://RootDSE") ' DNS domain name finden strDNSDomain = objRootDSE.Get("defaultNamingContext") Set objCommand = CreateObject("ADODB.Command") ' mit ADO das Active Directory durchsuchen Set objConnection = CreateObject("ADODB.Connection") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" objCommand.ActiveConnection = objConnection strBase = "" ' Gesamte Domäne durchsuchen strFilter = "(&(objectCategory=person)(objectClass=User)("&strLDAPFilter&"))" ' Filter für only User objects. strAttributes = "distinguishedName" ' Gebraucht wird nur der DN strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree" ' LDAP query zusammenbauen objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 100 ' max 100 Ergebnisse auf einmal erhalten objCommand.Properties("Timeout") = 30 ' Timeout 30 Sekunden objCommand.Properties("Cache Results") = False Set objRecordSet = objCommand.Execute ' und los Count = 0 Redim Preserve arrMember(100) Do until objRecordSet.EOF ' jeden Datensatz einzeln bearbeiten. Count = Count + 1 arrMember(Count-1) = objRecordSet.Fields("distinguishedName").Value ' DN ermitteln und speichern WScript.echo Count-1 & ":" & arrMember(Count-1) If Count mod 100 = 0 Then Redim Preserve arrMember(Count+100) ' Array vergroessern End If objRecordSet.MoveNext ' Nächster Benutzer Loop 'WScript.echo "Arraygroesse:" & Count Redim Preserve arrMember(Count-1) 'For Count = 0 To uBound(arrMember) ' WScript.echo Count & ":"& arrMember(Count) 'Next objGroup.PutEx ADS_PROPERTY_UPDATE, "member",arrMember objGroup.SetInfo Set objGroup = Nothing AppendLog "Skript beendet", 4 WScript.Echo WScript.ScriptName & " wurde beendet." WScript.quit(0) Sub AppendLog(strLog, errlevel) 'Fügt einen Eintrag in die Log-Datei ein Dim file Dim fs If LogLevel>=errlevel Then Set fs = CreateObject("Scripting.FileSystemObject") Set file = fs.OpenTextFile(LogFile, 8, True) file.Write(Now & ",") Select Case errlevel Case 1 file.Write("Fatal Line:" & Err.Source & ":") Case 2 file.Write("Error:") Case 3 file.Write("Warning:") Case 4 file.Write("Information:") Case 5 file.Write("Debug:") Case Else file.Write("Code:"&errlevel) End Select file.WriteLine(","&strLog) file.Close End If End Sub