IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Récupérer le groupe d'un utilisateur par requête LDAP


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 113
    Points
    113
    Par défaut Récupérer le groupe d'un utilisateur par requête LDAP
    Bonjour bonjour,

    Pour permettre d'identifier les droits de l'utilisateur qui a ouvert le fichier xls, je récupère l'identifiant de l'utilisateur.
    Ensuite, j'aimerai récupérer le(s) groupe(s) auquel il appartient, sur Active Directory, par l'intermédiaire d'une requête LDAP.

    Le code que j'utilise est celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    ' Parametrage du LDAP
    Dim objConnection As ADODB.Connection
    Dim objCommand As ADODB.Command
    Dim objRecordset As ADODB.Recordset
     
    Set objConnection = New ADODB.Connection
    Set objCommand = New ADODB.Command
    Set objRecordset = New ADODB.Recordset
     
    Const ADS_SCOPE_SUBTREE = 2
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
     
    ' Commande d'interrogation
    objCommand.CommandText = "SELECT * FROM 'LDAP://dc=domaine,dc=fr' WHERE objectCategory='User' And samAccountName = '" & login & "'"
    Set objRecordset = objCommand.Execute
    MsgBox Str(objRecordset.Fields.Count)
    objRecordset.MoveFirst
     
    For i = 0 To objRecordset.Fields.Count - 1
            MsgBox objRecordset.Fields(i).Name
            MsgBox objRecordset.Fields(i).Value
    Next
     
    ' Cloture de la connexion
    objRecordset.Close
    Set objRecordset = Nothing
    Set objCommand = Nothing
    Set objConnection = Nothing
    Le code fonctionne, mais je ne récupère pas d'informations concernant le(s) groupe(s).

    J'ai trouvé un autre code, mais en VB 2005, qui pourrait permettre de le récupérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Dim searcher As DirectorySearcher = Nothing
    Dim colEntry As New Collections.Generic.List(Of String) 
    Try
     
    'Objet de notre utilisateur de la hiérarchie Active Directory.
    searcher = New DirectorySearcher(New DirectoryEntry("LDAP://" & domain, username, password)) 
    'On va chercher ici un objet de type user et dont le nom d'ouverture de session = <username>.
    searcher.Filter = String.Concat("(&(objectClass=User) (sAMAccountName=", username, "))") 
    'Ne récupère que la propriété MemberOf.
    searcher.PropertiesToLoad.Add("MemberOf") 
    'Recherche et retourne la première entrée trouvée.
    Dim result As SearchResult = searcher.FindOne 
    'Parcours le contenu de la propriété MemberOf de notre entrée trouvée.
    For i As Integer = 0 To result.Properties("MemberOf").Count - 1 
    'Récupère la chaine LDAP.
    Dim sProp As String = result.Properties("MemberOf")(i) 
    'Extrait le nom du groupe de la chaine.
    colEntry.Add(sProp.Substring(3, sProp.IndexOf(",") - 3)) 
    Next
    Catch ex As Exception 
    exeption = ex
     
    Finally
     
    'Libère les ressources.
     
    searcher.Dispose()
     
    End Try
    Est-ce qu'il est possible de convertir ce code pour Excel ? Quelles références dois-je importer ?

    Merci.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 113
    Points
    113
    Par défaut
    Je me répond.

    En fait il est tout à fait possible d'utiliser "memberOf" dans la liste des attributs de la requête LDAP.
    Je devais mal l'utiliser...
    Cet attribut retourne un tableau de variants, voici donc le code correct à utiliser pour récupérer la liste des groupes AD d'un utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
        Dim adoConnection As ADODB.Connection
        Dim adoCommand As ADODB.Command
        Dim adoRecordset As ADODB.Recordset
        Dim strBase, strFilter, strAttributes, strQuery As String
        Dim listGroups() As Variant
        Dim i As Integer
     
        'Initialisation des objets ADO
        Set adoCommand = New ADODB.Command
        Set adoConnection = New ADODB.Connection
        Set adoRecordset = New ADODB.Recordset
     
        adoConnection.Provider = "ADsDSOObject"
        adoConnection.Open "Active Directory Provider"
        adoCommand.ActiveConnection = adoConnection
     
        'Recherche du domaine Active Directory
        strBase = "<LDAP://dc=domaine;dc=fr>"
     
        'Filtre sur l'utilisateur
        strFilter = "(&(objectCategory=user)(samAccountName=" & login & "))"
     
        'On récupère l'ensemble des groupes de l'utilisateur 
        strAttributes = "memberOf"
     
        'Construction de la requête LDAP
        strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
        adoCommand.CommandText = strQuery
        adoCommand.Properties("Page Size") = 300
        adoCommand.Properties("Timeout") = 30
        adoCommand.Properties("Cache Results") = False
     
        'Exécution de la requête
        Set adoRecordset = adoCommand.Execute
     
        'Parcours des résultats de la requête 
        Do Until adoRecordset.EOF
     
            'On stocke l'ensemble des groupes dans un tableau de variants
            listGroups = adoRecordset.Fields("memberOf").Value
     
            'Pour chaque élément du tableau
            For i = 0 To UBound(listGroups)
                Dim chaine_groupe As Variant
                Dim groupTmp As String
     
                chaine_groupe = listGroups(i)
                'On extrait la donnée qui nous intéresse (le nom exact du groupe)
                groupTmp = Mid(chaine_groupe, InStr(chaine_groupe, "CN=") + 3, InStr(chaine_groupe, ",OU=") - 4)
                MsgBox groupTmp
     
            Next
     
            ' Move to the next record in the recordset.
            adoRecordset.MoveNext
        Loop
     
        ' Clean up.
        adoRecordset.Close
        adoConnection.Close

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer les groupes d'un utilisateur dans LDAP
    Par Invité dans le forum Langage
    Réponses: 0
    Dernier message: 01/09/2010, 10h59
  2. Réponses: 8
    Dernier message: 20/08/2009, 17h58
  3. Réponses: 3
    Dernier message: 11/03/2009, 14h47
  4. récupérer info d'une table par requête..
    Par the_youpi dans le forum SQL
    Réponses: 4
    Dernier message: 20/06/2007, 16h11
  5. Réponses: 1
    Dernier message: 04/06/2007, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo