AD PrimaryGroup fehlt

  • 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
    [autoit]

    ; 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

    [/autoit]

    2. Eine WellKnownSID in einen Namen umsetzen:

    Spoiler anzeigen
    [autoit]

    ; 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

    [/autoit]

    Nun ermittele ich alle Mitglieder einer Gruppe mit der Originalfunktion "_ADGetGroupMembers" aus der "ADFunctions.au3". ( Hier der Code: )

    Spoiler anzeigen
    [autoit]

    Func _ADGetGroupMembers(ByRef $members, $groupdn, $sort = 0)
    ;If _ADObjectExists($group) = 0 Then Return 0

    Local $oUsr, $objCommand, $groups

    [/autoit] [autoit][/autoit] [autoit]

    $objCommand = ObjCreate("ADODB.Command")
    $objCommand.ActiveConnection = $objConnection
    $objCommand.Properties ("Searchscope") = 2

    [/autoit] [autoit][/autoit] [autoit]

    Dim $members[1]
    $i = 0

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    $rangemodifier = $i * 1000
    $range = "Range=" & $rangemodifier & "-*"
    $strCmdText = "<LDAP://" & $strHostServer & "/" & $groupdn & ">;;member;" & $range & ";base"
    $objCommand.CommandText = $strCmdText
    $objRecordSet = $objCommand.Execute
    $membersadd = $objRecordSet.fields (0).Value

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    $objRecordSet.Close

    $members[0] = UBound($members) - 1

    If $sort = 1 Then
    _ArraySort($members, 0, 1)
    EndIf

    Return 1
    EndFunc ;==>_ADGetGroupMembers

    [/autoit]

    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

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hilft das?^^

    [autoit]

    ; Generated by AutoIt Scriptomatic

    [/autoit][autoit][/autoit][autoit]

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"

    [/autoit][autoit][/autoit][autoit]

    $Output=""
    $Output = $Output & "Computer: " & $strComputer & @CRLF
    $Output = $Output & "==========================================" & @CRLF
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_GroupUser", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit][autoit][/autoit][autoit]

    If IsObj($colItems) then
    For $objItem In $colItems
    $Output = $Output & "GroupComponent: " & $objItem.GroupComponent & @CRLF
    $Output = $Output & "PartComponent: " & $objItem.PartComponent & @CRLF
    if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    $Output=""
    Next
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_GroupUser" )
    Endif

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]
  • Ich suchte aber, passend zu den anderen "ADFunctions", eine LDAP Lösung.

    Micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Ein Objekt "PrimaryGroupID" hat jeder User. Aber der Wert dieses Objekts lautet z.B. "1107". Wie kann ich jetzt per LDAP die passende Gruppe zu der Nr. 1107 herausfinden ?

    Lösung gefunden ! Ich werde den Code noch etwas überarbeiten und stelle dann morgen die Lösung hier ein. Besten Dank trotzdem an alle die versucht haben zu helfen.

    Gruß
    Micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    2 Mal editiert, zuletzt von Micha_he (25. Juli 2007 um 21:40)

  • Hier nun meine gesamte Lösung.

    Das Script erstellt eine HTML-Datei über alle Gruppen und deren Mitglieder innerhalb des aktuellen AD.

    Spoiler anzeigen
    [autoit]

    ; Diese Script erstellt eine Übersicht über alle Gruppen einer Domäne.
    ; Zur Ausführung sind Domänen-Admin-Rechte notwendig
    ; Es wird auch die Primär-Gruppe eines Benutzers beachtet
    ;
    ; Es wird die UDF-Datei "ADFunctions.au3" im Unterordner "Include" erwartet
    ;
    ; geschrieben von Michael Schröder, 25.07.2007

    Opt("MustDeclareVars",1)
    #include <include\ADFunctions.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $grparray[1], $userarray[1], $grpindex, $userindex
    Dim $memindex, $memarray[1], $file, $name, $mitglieder
    Dim $outfile = "ADGruppenuebersicht.htm"

    [/autoit] [autoit][/autoit] [autoit]

    SplashTextOn("","Bitte warten, die Datei" & @CRLF & $outfile & @CRLF & "wird erzeugt." ,"400","100","-1","-1",33,"Times New Roman","18","700")
    ; Ein Array wird mit allen AD-Gruppen gefüllt
    _ADGetAllGroups($grparray,$strDNSDomain)
    ; Ein Array wird mit allen AD-Usern gefüllt
    _ADGetAllUsers($userarray,$strDNSDomain)
    ; das User-Array wird um eine Spalte mit der 'PrimaryGroup' erweitert
    $userarray = _PGroupAdd($userarray)
    $file = FileOpen($outfile,1)
    ; die HTML-Datei wird erzeugt
    FileWriteLine($file,"<HTML>")
    FileWriteLine($file,"<BODY>")
    FileWriteLine($file,"<TABLE BORDER=" & chr(34) & "1" & chr(34) & ">")
    FileClose($file)
    For $grpindex = 1 to $grparray[0]
    ; ein Array wird mit den Gruppenmitgliedern gefüllt
    _ADGetGroupMembers($memarray,$grparray[$grpindex],1)
    ; da die User fehlen bei denen diese Gruppe die primäre ist,
    ; durchsuchen wir das User-Array nach primären Mitgliedschaften
    ; und fügen diese User an das Array der Gruppen-Mitglieder an
    For $userindex = 1 to $userarray[0][0]
    If $userarray [$userindex][1] = $grparray[$grpindex] then
    _ArrayAdd($memarray,$userarray[$userindex][0])
    $memarray[0] = UBound($memarray)-1
    EndIf
    Next
    ; sortieren neu
    _ArraySort($memarray,0,1)
    ; und füllen die Tabellenfelder mit Daten
    $file = FileOpen($outfile,1)
    FileWriteLine($file,"<TR>")
    FileWriteLine($file,"<TD>")
    FileWriteLine($file,_ADDNToSamAccountName($grparray[$grpindex]))
    FileWriteLine($file,"</TD>")
    FileWriteLine($file,"<TD>")
    For $memindex = 1 to $memarray[0]
    $name = _ADDNToSamAccountName($memarray[$memindex])
    if $name = "" then
    Select
    Case StringInStr($memarray[$memindex],"S-1-1-0") > 0
    $name = _ADGetWellKnownSIDName($memarray[$memindex])
    Case Else
    $name = $memarray[$memindex]
    EndSelect
    EndIf
    $mitglieder &= $name & ", "
    Next
    If $mitglieder <> "" then
    FileWriteLine($file, StringLeft($mitglieder,StringLen($mitglieder)-2))
    $mitglieder = ""
    Else
    FileWriteLine($file, "&nbsp;")
    EndIf
    FileWriteLine($file,"</TD>")
    FileWriteLine($file,"</TR>")
    FileClose($file)
    Next
    ; und schließen den HTML-Code ab
    $file = FileOpen($outfile,1)
    FileWriteLine($file,"</TABLE>")
    FileWriteLine($file,"</BODY>")
    FileWriteLine($file,"</HTML>")
    FileClose($file)
    SplashOff()

    [/autoit] [autoit][/autoit] [autoit]

    ; hier wird mittels zweier ADFunktionen, ein Array mit Usern
    ; um die primäre Gruppe, in einer zweiten Spalte erweitert
    Func _PGroupAdd($array)
    Dim $arrayneu[UBound($array)][UBound($array)]
    Dim $index
    $arrayneu[0][0] = $array[0]
    For $index = 1 to UBound($array)-1
    $arrayneu[$index][0] = $array[$index]
    $arrayneu[$index][1] = _ADGetPrimaryGroupDN(_ADGetPrimaryGroupID($array[$index]))
    Next
    Return $arrayneu
    EndFunc

    [/autoit]


    Im Anhang ist auch noch eine aktualisierte und erweiterte UDF "ADFunctions.au3" die von obigem Script benötigt wird.

    Viel Spaß damit
    Micha_he

    Edit BugFix: Bitte Spoiler verwenden