AD GetUserGroups

  • Hey,


    ich würde gerne alle Gruppen auflisten die ein Benutzer hat.


    AutoIt
    _AD_Open()
    
    
            Local $Groups = _AD_GetUserGroups(@UserName)
                _GUICtrlListView_AddArray($Gruppen,$Groups)
    
    
    _AD_Close()


    GuiListView.au3" (474) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    DllStructSetData($tBuffer, "Text", $aItems[$iI][0])
    DllStructSetData($tBuffer, "Text", ^ ERROR

    Wo liegt der Fehler?

  • Der Array ist nicht im Format wie es _GUICtrlListView_AddArray benötigt.

    _AD_GetUserGroups returns a one-based one dimensional array of group names (FQDN) the user is a member of
    _GUICtrlListView_AddArray expects a 2D array.

  • Kann leider am Wochende nicht weiter am Script arbeiten.
    Wie würde man das dann realisieren?

    _GUICtrlListView_AddItem ?

    Solange eine Schleife laufen lassen bis alle Informationen von _AD_GetUserGroups im ListView stehen?

    AutoIt
    $Groups = _AD_GetUserGroups(@Username)
    For $i = 0 To UBound -1
        _GUICtrlListView_AddItem($GUI,$Groups)
    Next
  • Denke, das sollte so funktionieren.

    • Offizieller Beitrag

    Naja, ich kenne Dein ListView nicht und weiß nicht, was Du als Array zurückbekommst, deswegen muss ich etwas spekulieren, aber ich denke das müsste dann so aussehen:

  • Hallo @Kazume,

    Sollte aus dem Bsp. von Oscar hervorgehen. Allerdings möchte ich dich doch noch darauf hinweisen, dass du in deinem Bsp. Ubound falsch verwendest.

    Code
    $Groups = _AD_GetUserGroups(@Username)
    For $i = 0 To UBound -1
        _GUICtrlListView_AddItem($GUI,$Groups)
    Next

    So geht das nicht. Siehe Bsp. von Oscar und Autoit-Hilfe.

    Grüße autoiter

  • Naja, ich kenne Dein ListView nicht und weiß nicht, was Du als Array zurückbekommst, deswegen muss ich etwas spekulieren, aber ich denke das müsste dann so aussehen:

    Werde es mir am Montag mal anschauen. Vielen Dank schon mal dafür ;)

    Hallo @Kazume,

    Sollte aus dem Bsp. von Oscar hervorgehen. Allerdings möchte ich dich doch noch darauf hinweisen, dass du in deinem Bsp. Ubound falsch verwendest.

    Code
    $Groups = _AD_GetUserGroups(@Username)
    For $i = 0 To UBound -1
        _GUICtrlListView_AddItem($GUI,$Groups)
    Next

    So geht das nicht. Siehe Bsp. von Oscar und Autoit-Hilfe.

    Also innerhalb der () noch die Variable angeben die das Array beinhaltet ?

  • Ubound hat noch eine weitere Konsequenz. Schau dir einfach die Hilfe an. Das ist nichts mit Winkelzügen. Ein Durchlesen der Beschreibung muss alle deine Fragen beantworten.

    Grüße autoiter

  • AutoIt
    Global $aListView[UBound($aADGroup)][3] ; <- ein entsprechend großes 2D-Array erstellen
    
    
    For $i = 0 To UBound($aADGroup) - 1 ; alle Einträge aus dem AD-Array durchlaufen
    	$aListView[$i][0] = $aADGroup[$i] ; Gruppe als Item eintragen
    	$aListView[$i][1] = '' ; <- hier kannst Du noch Einträge für die SubItems vornehmen
    	$aListView[$i][2] = '' ; <- hier kannst Du noch Einträge für die SubItems vornehmen
    Next


    Wäre jemand so nett es mir zu erklären, was genau da passiert ?


    Soweit klappt es aufjedenfall. Im ListView steht jetzt CN=Wert,OU=Wert,OU=Wert,DC=Wert,DC=Wert
    Gibt es die möglichkeit nur den Wert von CN zu haben ohne die restlichen Sachen?


    AutoIt
    $aListView[$i][0] = Stringreplace($aADGroup[$i],"CN=","")
    	$aListView[$i][1] = Stringreplace($aADGroup[$i],"DC=","")

    Das klappt nicht so ganz >:D

  • Hi Kazume,

    ich hatte schon angefangen hier zu antworten. Mir ist dann aber klar geworden, dass du besser eine genauere Beschreibung bringst, bevor ich hier irgendeinen Mist schreibe.

    Zeig doch bitte mal einen Schnipsel aus $aADGroup. Ich würde nämlich gerne wissen, ob du das Array 1zu1 in der Listview darstellen möchtest, oder du immer drei Zeilen aus dem Array in eine Zeile in der Listview packen willst.

    AutoIt
    $aListView[$i][0] = Stringreplace($aADGroup[$i],"CN=","")
    	$aListView[$i][1] = Stringreplace($aADGroup[$i],"DC=","")

    Dein Codebeispiel sieht mehr nach letzterem aus..


    Zu deiner Frage, was da passiert:

    AutoIt
    Global $aListView[UBound($aADGroup)][3] ; <- ein entsprechend großes 2D-Array erstellen
    
    
    For $i = 0 To UBound($aADGroup) - 1 ; alle Einträge aus dem AD-Array durchlaufen
    	$aListView[$i][0] = $aADGroup[$i] ; Gruppe als Item eintragen
    	$aListView[$i][1] = '' ; <- hier kannst Du noch Einträge für die SubItems vornehmen
    	$aListView[$i][2] = '' ; <- hier kannst Du noch Einträge für die SubItems vornehmen
    Next


    Oscar hat dir ja Anmerkungen dazu geschrieben. Das heißt du verstehst den Rest nicht?

    Die Variable $aListView[UBound($aADGroup)][3] erstellst du, weil du sie gleich mit Inhalten füllen möchtest. Die Anzahl der "Zeilen" wird dabei auf die Anzahl der Zeilen von $aADGroup festgelegt, weil Oscar davon ausging, dass du jede Zeile aus $aADGroup in eine "Zeile" der Listvieww schreiben wolltest.


    For $i = 0 To UBound($aADGroup) - 1 Hier wird eine For ... Next-Schleife ausgeführt und die Variable $i mit der Durchlaufnummer gefüllt. $i hat erst den Wert 0, dann 1, dann 2, ..., dann die letzte Zeilennummer aus $aADGroup. Das - 1 steht dahinter, weil das Array eine Zeile weniger hat, als Ubound anzeigt (Ubound gibt in der Zeile Null die Anzahl der Array-Elemente an).

    In der Schleife wird nun in die "Zeile" 0 und "Spalte" 1 des Listview-Arrays ($aListView) die "Zeile" 0 aus dem aADGroup-Array, in "Zeile" 0 und "Spalte" 2 des Listview-Arrays irgendwas und in "Zeile" 0 und "Spalte" 3 des Listview-Arrays irgendwas eingetragen. Danach das gleiche für die jeweilige "Zeile" 1 der Arrays, danach für Zeile 2 und so weiter bis zur letzten Zeile von aADGroup.

    Mein Tipp:
    Benutze die Hilfe. Lerne Schleifen zu benutzen und zu verstehen und prüfe ob du dieses Array-Tut hier verstehst: http://www.bug-fix.info/array_tut.htm

    Grüße autoiter

  • Code
    $aListView[$i][0] = _AD_GetObjectAttribute($aADGroup[$i], "displayname") ; Gruppe als Item eintragen

    sollte das gewünschte Ergebnis bringen.

    • Offizieller Beitrag

    Wie ich oben schon schrieb, musste ich spekulieren, was Dein ListView und die Array-Rückgabe angeht.
    Hättest Du Dein Script gepostet und mehr Infos geliefert, dann hättest Du schon längst das richtige Ergebnis. :whistling:

    Wenn Du nur den einen Wert brauchst, dann reicht ja auch eine Spalte im Listview.
    Demzufolge müsste das dann eher so aussehen:

  • Oscar,
    funktioniert Dein Skript auch mit escapten CN?
    Also wenn z.B. CN=Meier\, Markus,OU=Wert,DC=Wert,DC=Wert dann sollte in der Listview "Meier Markus" stehen und nicht "Meier\, Markus".
    Da würde dann _AD_FixSpecialChars helfen.

    • Offizieller Beitrag

    Nein, mein Script funktioniert dann so nicht.
    Der RegExp liest auch nur bis zum nächsten Komma, weil ich keine Ahnung habe, was da als Rückgabe alles möglich ist. Ich kenne mich mit Active Directory nicht aus.

    Wenn im ListView aber sowieso nur wenige (< 20) Einträge stehen werden, dann kann man sich das mit "_GUICtrlListView_AddArray" auch schenken und gleich "GUICtrlCreateListViewItem" nehmen.
    Einen merklichen Geschwindigkeitsgewinn bekommt man bei "_GUICtrlListView_AddArray" eigentlich erst wenn im ListView viele Einträge (Items/SubItems) erstellt werden sollen.

  • Code
    $aListView[$i][0] = _AD_GetObjectAttribute($aADGroup[$i], "displayname") ; Gruppe als Item eintragen

    sollte das gewünschte Ergebnis bringen.

    Das bringt ein Fehlerscreen.
    Water.png

    Wie ich oben schon schrieb, musste ich spekulieren, was Dein ListView und die Array-Rückgabe angeht.
    Hättest Du Dein Script gepostet und mehr Infos geliefert, dann hättest Du schon längst das richtige Ergebnis. :whistling:

    Wenn Du nur den einen Wert brauchst, dann reicht ja auch eine Spalte im Listview.
    Demzufolge müsste das dann eher so aussehen:

    Funktioniert perfekto !
    Danke :klatschen:

    Lese mir dann mal alles mögliche zum Thema Array & StringRegExReplace durch um es zu verstehen :D


    Edit : Es können auch wesentlich mehr Rechte sein als 20.

  • Mein Fehler. Sollte natürlich

    Code
    $aListView[$i][0] = _AD_GetObjectAttribute($aADGroup[$i], "cn") ; Gruppe als Item eintragen

    lauten.

  • :D