[R] Ecriture récursive dans un array multidimentionnel

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
lokidor
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 08 févr. 2011 10:57
Localisation : Sophia Antipolis
Status : Hors ligne

[R] Ecriture récursive dans un array multidimentionnel

#1

Message par lokidor »

Bonjour à tous,

Je suis actuellement en train d'écrire un script permettant de recenser tous les groupes d'un utilisateur, y compris les éventuels groupes contenus par d'autres groupes.

l'idée c'est de les ranger dans un array en ayant un truc du genre :
Screen020.jpg
j'ai pensé à faire une fonction récursive mais j'avoue ne pas m'en sortir.

Pour le moment, j'ai a peu près ce qu'il me faut mais pas sous la bonne forme.

J'ai la liste des groupe de premier niveau ainsi que la liste des sous groupes de chaque groupe de 1er niveau, mais pas dans le même array, enfin si mais en écrasant ce qu'il y a avant, sans insérer là ou il faut.

Voila mon code.

Code : Tout sélectionner

global $MOF_grp
Global $MOF_cpt = 0

;fonction qui va chercher la liste des memberOf d'un user AD et le retourne dans un tableau $memberof
Func ADGetUserGroups(ByRef $memberof, $user = @UserName)

    Local $objItem

    $strHostServer = $objRootDSE.Get("dnsHostName") ; Retrieve the name of the connected DC

    $objItem = ObjGet("LDAP://" & $strHostServer & "/" & $user) ; Retrieve the COM Object for the logged on user

    $memberof = $objItem.GetEx("memberof")

    $count = UBound($memberof)

    _ArrayInsert($memberof, 0, $count)

EndFunc   ;==>_ADGetUserGroups


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg

    Case $MOF_GO

        $MOF_user = GUICtrlRead($MOF_user_input);on lit l'entrée de l'utilisateur (à savoir quel user AD on doit aller regarder)

        $MOF_user_DN  = _ADSamAccountNameToFQDN($MOF_user);on met le nom donné sous la bonne forme pour AD

        ADGetUserGroups($MOF_grp, $MOF_user_DN); on appel la fonction qui va bien une premiere fois
        _ArrayDisplay($MOF_grp)

        For $MOF_cpt=1 to $MOF_grp[0];et pour chaque ligne retournée précédement, on rappel la même fonction
            ADGetUserGroups($MOF_grp[$MOF_cpt], $MOF_grp[$MOF_cpt])
            _ArrayDisplay($MOF_grp[$MOF_cpt])
        Next

    EndSwitch
WEnd
 
Le but du jeu pour les test n'est pas d'avoir tous les sousousousousousousousousousousous-groupes, juste 2 pour le début, mais si il est possible d'implanter de la récursivité, cela me permettrait très simplement d'aller jusqu'à tel ou tel niveau de profondeur dans les sous groupes.

Merci à tous par avance
Modifié en dernier par lokidor le mer. 02 mars 2011 13:13, modifié 1 fois.
Loki,

Le monde avance grâce aux paresseux!
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Ecriture récursive dans un array multidimentionnel

#2

Message par Yogui »

Bonsoir,

J'ai rapidement fait une recherche sur le forum anglophone et :
; *****************************************************************************
; Example 1
; Returns a recursively searched list of groups the currently logged on user
; is a member of.
; For groups that are inherited, the FQDN of the group or user, and the FQDN(s)
; of the group(s) it was inherited from, seperated by '-->'
; *****************************************************************************

Code : Tout sélectionner

#include <AD.au3>

Global $aUser[1]
$usersname = @username
; Open Connection to the Active Directory
_AD_Open()

; Returns a recursively searched list of groups the currently logged on user is a member of
$aUser = _AD_RecursiveGetMemberOf($usersname,10,0)
If $aUser[0] = 0 Then
    MsgBox(64, "Active Directory Functions - Example 1", "User '" & $usersname & "' has not been assigned to any group")
Else
    ; For groups that are inherited, the return is the FQDN of the group or user, and the FQDN(s) of the group(s) it
    ; was inherited from, seperated by '-->'
    _ArrayDisplay($aUser, "Active Directory Functions - Example 1 - Group names user '" & $usersname & "' is a member of", -1, 0, "|", " --> ")
EndIf

; Close Connection to the Active Directory
_AD_Close()
http://www.autoitscript.com/forum/topic ... ge__hl__ad

A voir si ce bout de code est adaptable à votre problématique
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Ecriture récursive dans un array multidimentionnel

#3

Message par jchd »

Si tu emploies une matrice multi-dimensionnelle, elle risque de prendre beaucoup de place s'il elle n'est pas complète (= si c'est une "sparse-array").

Perso, je pense que tu aurais intérêt à construire une table SQLite (temporaire en mémoire avec recopie possible sur disque) pour refléter l'intégralité des relations d'appartenance que tu peux rencontrer.
L'intérêt est que SQL te permettra une organisation bien plus rationnelle de ces données et des outils de recherche puissants et simples à mettre en oeuvre.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
lokidor
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 08 févr. 2011 10:57
Localisation : Sophia Antipolis
Status : Hors ligne

Re: [..] Ecriture récursive dans un array multidimentionnel

#4

Message par lokidor »

@Yogui : La fonction utilisée dans mon code est justement une adaptation de la fonction _ADRecursiveGetMemberOf contenue dans l'UDF ADfunctions.au3 trouvée sur le forum anglais ^^. J'ai fini mon époque de débile qui pose la question avant d'avoir cherché seul :p
Grand merci quand même à toi qui à pris sur ton temps pour me venir en aide ;)


@jchd : Merci pour l'idée. J'ai déjà fait du SQL mais jamais sur AutoIT. J'imagine cependant que ça ne doit pas être bien différent qu'avec du PHP. J'entame mes recherches de suite et je vous tiens au courant.
Loki,

Le monde avance grâce aux paresseux!
lokidor
Niveau 3
Niveau 3
Messages : 36
Enregistré le : mar. 08 févr. 2011 10:57
Localisation : Sophia Antipolis
Status : Hors ligne

Re: [..] Ecriture récursive dans un array multidimentionnel

#5

Message par lokidor »

Bon pour finir, j'ai décider d'écrire dans CSV au fur et à mesure plutôt que de m'embêter la vie avec SQL qui n'est pas adapté à me besoins finalement, l'appli a besoin de portabilité :/

C'est moins pratique, moins joli et moins simple mais sa correspond mieux au besoin finalement.

En tout cas merci de votre aide et bonne journée à tous
Loki,

Le monde avance grâce aux paresseux!
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Ecriture récursive dans un array multidimentionnel

#6

Message par jchd »

Comme tu veux, mais côté portabilité je vois mal ce qu'on peut objectivement imaginer de plus portable que SQLite mais une chose est sûre : ce n'est certainement pas du .CSV
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [R] Ecriture récursive dans un array multidimentionnel

#7

Message par GaRydelaMer »

Bonsoir


Au mélange des deux solution:

XML

Tu pourras ainsi gréer les groupes et les users et le lien entre les 2.

jette un œil à MSXML.

Je regarde coder vers cette idées.
Répondre