Ich habe zu der UDF-Datei "ADFuctions.au3" (http://www.autoitscript.com/forum/index.php?showtopic=37378&hl=adfunctions ) folgende Erweiterungen geschrieben:
1. Ermitteln aller Gruppen unterhalb eine LDAP-Pfades:
Spoiler anzeigen
; Function _ADGetAllGroups
Func _ADGetAllGroups(ByRef $groups,$path)
Dim $objGroup
Dim $item
$objGroup = ObjGet("LDAP://" & $path)
For $item In $objGroup
If $item.class = "group" then
_ArrayAdd ($groups, $item.distinguishedName)
$groups[0] = Ubound($groups)-1
Else
_ADGetAllGroups($groups,$item.distinguishedName)
EndIf
Next
Return
EndFunc
; End Function _ADGetAllGroups
2. Eine WellKnownSID in einen Namen umsetzen:
Spoiler anzeigen
; Function _ADGetWellKnownSIDName
Func _ADGetWellKnownSIDName($dn)
Dim $sid
$sid = StringMid($dn,StringInStr($dn,"CN=")+3)
$sid = StringStripWS(StringLeft($sid,StringInStr($sid,",")-1),2)
Select
Case $sid = "S-1-5-32-544"
Return("Administratoren")
Case $sid = "S-1-5-32-547"
Return("Hauptbenutzer")
Case $sid = "S-1-5-32-551"
Return("Sicherungs-Operatoren")
Case $sid = "S-1-5-32-545"
Return("Benutzer")
Case $sid = "S-1-5-7"
Return("Anonymous-Anmeldung")
Case $sid = "S-1-5-11"
Return("Authentifizierte Benutzer")
Case $sid = "S-1-5-3"
Return("Batch")
Case $sid = "S-1-3-0"
Return("Ersteller-Besitzer")
Case $sid = "S-1-3-1"
Return("Erstellergruppe")
Case $sid = "S-1-5-1"
Return("Dialup")
Case $sid = "S-1-1-0"
Return("Jeder")
Case $sid = "S-1-5-4"
Return("Interaktiv")
Case $sid = "S-1-5-18"
Return("System")
Case $sid = "S-1-5-2"
Return("Netzwerk")
Case $sid = "S-1-5-10"
Return("Selbst")
Case $sid = "S-1-5-6"
Return("Service")
Case $sid = "S-1-5-13"
Return("TerminalserverBenutzer")
Case $sid = "S-1-5-1000"
Return("Andere Organisation")
Case $sid = "S-1-5-15"
Return("Diese Organisation")
Case Else
Return()
EndSelect
EndFunc
; End Function _ADGetWellKnownSIDName
Nun ermittele ich alle Mitglieder einer Gruppe mit der Originalfunktion "_ADGetGroupMembers" aus der "ADFunctions.au3". ( Hier der Code: )
Spoiler anzeigen
Func _ADGetGroupMembers(ByRef $members, $groupdn, $sort = 0)
;If _ADObjectExists($group) = 0 Then Return 0
Local $oUsr, $objCommand, $groups
$objCommand = ObjCreate("ADODB.Command")
$objCommand.ActiveConnection = $objConnection
$objCommand.Properties ("Searchscope") = 2
Dim $members[1]
$i = 0
While 1
$rangemodifier = $i * 1000
$range = "Range=" & $rangemodifier & "-" & $rangemodifier + 999
$strCmdText = "<LDAP://" & $strHostServer & "/" & $groupdn & ">;;member;" & $range & ";base"
$objCommand.CommandText = $strCmdText
$objRecordSet = $objCommand.Execute
$membersadd = $objRecordSet.fields (0).Value
If $membersadd = 0 Then ExitLoop
ReDim $members[UBound($members) + 1000]
For $j = $rangemodifier + 1 To $rangemodifier + 1000
$members[$j] = $membersadd[$j - $rangemodifier - 1]
Next
$i += 1
$objRecordSet.Close
WEnd
$rangemodifier = $i * 1000
$range = "Range=" & $rangemodifier & "-*"
$strCmdText = "<LDAP://" & $strHostServer & "/" & $groupdn & ">;;member;" & $range & ";base"
$objCommand.CommandText = $strCmdText
$objRecordSet = $objCommand.Execute
$membersadd = $objRecordSet.fields (0).Value
ReDim $members[UBound($members) + UBound($membersadd) ]
[/autoit] [autoit][/autoit] [autoit]For $j = $rangemodifier + 1 To $rangemodifier + UBound($membersadd)
$members[$j] = $membersadd[$j - $rangemodifier - 1]
Next
$objRecordSet.Close
$members[0] = UBound($members) - 1
If $sort = 1 Then
_ArraySort($members, 0, 1)
EndIf
Return 1
EndFunc ;==>_ADGetGroupMembers
Diese Funktion gibt mir zwar einige der Mitglieder aus, es fehlen aber die Mitglieder, die die jeweilige Gruppe als PRIMÄRE Gruppe haben ! Das heißt jeder User fehlt in der Gruppe, die seine primäre Gruppe ist.
Hat jemand eine Idee für eine Erweiterung / Verbesserung ?
Oder hat jemand zufällig eine eigene Funktion geschrieben ?
Gruß
Micha_he