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

VBA Access Discussion :

Requête LDAP vers Table Access [2007-2010]


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Requête LDAP vers Table Access [2007-2010]
    Bonjour à tous,

    Afin de mettre les bases, il faut savoir que je n'ai presque aucune expérience en VBA.

    Voici ce que je cherche à faire :

    Aller chercher la liste des utilisateurs de l'Active Directory dans une OU particulière puis la mettre dans une table access.
    Il ne me faut que le nom et prenom des personnes.

    J'ai cherché la solution un peu partout, y compris sur ce forum, mais le code qui fonctionne ailleurs ne fonctionne pas chez moi.

    La solution la plus complète et qui correspond à mes besoins se trouve ici : http://www.developpez.net/forums/d10...ive-directory/

    J'ai donc pris le code, et l'ai changé pour correspondre à mes besoins :

    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
     
    Option Compare Database
     
     
     
    Function blabla()
     
    Dim strScope As String, strAttrs As String, strFilter As String, strBase As String, strDomainDN As String, strPath As String
        Dim LDAP As String, group As String, login As String, nom As String, mbrf As String
        Dim prenom As String, validite As String, expi As String, org As String
        Dim tvar() As String
        Dim sql As String
        Dim Database1 As Database
        Dim objconn As Object, objRS As Object, objuser As Object
        Dim member As Variant
        Dim i As Integer
     
     
        Set Database1 = CurrentDb() 'Database1 est la base de donnée dans laquel on travaille
        strDomainDN = "OU=FR-Dieppe-Site,OU=Users and Groups,OU=France,OU=EUR,OU=Organizations,DC=nestle,DC=com"
        strBase = "<LDAP://" & strDomainDN & ">;" 'Définition de l'objet
        strFilter = "(&(objectclass=user)(objectcategory=person));" 'Filtre le jeu d'enregistrement afin de garder que les utilisateurs dans l'objet AD
        strAttrs = "samaccountname;" 'Correspond à l'attribut de l'objet que l'on va regarder
        strScope = "subtree" 'On pourra rechercher les utilisateurs dans l'arborescence
        i = 1
     
     
     'Connection à la base
        Set objconn = CreateObject("ADODB.Connection") 'Création d'un objet pour la connexion
        objconn.Provider = "ADsDSOObject" 'Définition du pilote de connexion
        objconn.Open "Active Directory Provider" 'Ouverture de la base
     
        'Validation de la connexion
        Set objRS = objconn.Execute(strBase & strFilter & strAttrs & strPath & strScope)
        objRS.MoveFirst 'Requête d'action sur la recherche.
     
     
        Do Until objRS.EOF
            LDAP = (objRS.Fields(0).Value)  'Obtient le lien LDAP de l'objet trouver
            Set objuser = GetObject("LDAP://" & LDAP & "")
     
     
        Loop
     
    Database1.Close
    Set objRS = Nothing
    Set objconn = Nothing
    End Function
    Lorsque j'execute cette fonction, j'ai une erreur à la ligne 40.

    Le message d'erreur est le suivant :

    "Erreur d'exécution '-2147016646 (8007203a)':

    Erreur d'Automation
    Le serveur n'est pas opérationnel."

    J'ai fait plusieurs recherches sur ce message, mais n'est rien trouvé de probant.

    Toute aide sera la bienvenue.
    Je vous remercie par avance.

    Cordialement

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Salut,
    Ton problème m'a intéressé mais c'est la première que j'essaie d'interroger un LDAP en VBA
    Alors j'ai fais qqes tests et ce code m'a retourné pas mal de lignes :
    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
    Option Compare Database
     
    Private Sub btn_AD_Click()
    'Déclaration des variables
        On Error Resume Next
        Dim strScope As String, strAttrs As String, strFilter As String, strBase As String, strDomainDN As String, strPath As String
        Dim LDAP As String, group As String, login As String, nom As String, mbrf As String
        Dim prenom As String, validite As String, expi As String, org As String
        Dim objconn As Object, objRS As Object, objuser As Object
     
        strDomainDN = "monDomain.local"
        strBase = "<LDAP://" & strDomainDN & ">;" 'Définition de l'objet
        strFilter = "(&(objectclass=user)(objectcategory=person));" 'Filtre le jeu d'enregistrement afin de garder que les utilisateurs dans l'objet AD
        strAttrs = "distinguishedname;" 'Correspond à l'attribut de l'objet que l'on va regarder
        strScope = "subtree" 'On pourra rechercher les utilisateurs dans l'arborescence
     
        'Connection à la base
        Set objconn = CreateObject("ADODB.Connection") 'Création d'un objet pour la connexion
        objconn.Provider = "ADsDSOObject" 'Définition du pilote de connexion
        objconn.Open "Active Directory Provider" 'Ouverture de la base
     
        'Validation de la connexion
        Set objRS = objconn.Execute(strBase & strFilter & strAttrs & strPath & strScope)
        objRS.MoveFirst 'Requête d'action sur la recherche.
     
        Do Until objRS.EOF
            LDAP = (objRS.Fields(0).Value)  'Obtient le lien LDAP de l'objet trouver
            Set objuser = GetObject("LDAP://" & LDAP & "")
            DoEvents
            Debug.Print objuser.Name
            objRS.MoveNext
        Loop
     
        Set objRS = Nothing
        Set objconn = Nothing
    End Sub
    ça c'était juste avant que je commence à rédiger ce post. J'ai voulu relancer le code à l'instant pour vérifier un truk et je viens d'avoir la même erreur que toi !
    Je refais un test demain matin.
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Salut, merci pour ton aide. Je continu aussi de mon côté à regarder ce qui ne va pas.

    En tous les cas, il semble que ce bout de code va bien chercher les informations au bon endroit.
    En effet, lorsque l'erreur survient, en faisait "débugger", quand je passe ma souris sur la ligne 40 surlignée en jaune, il me met "ldap = nomduuser"

    Et ce "nomduuser", c'est bien un nom présent dans l'AD à l'endroit indiqué dans le chemin ligne 20 " strDomainDN ".
    Par contre, c'est un user situé en plein milieu de l'AD, alors qu'il aurait été plus logique que ce soit le tout premier.

    M'enfin, la logique et le code, personnellement, j'ai abandonné l'idée

    Je continu mes recherches aussi. Si tu as du nouveau, je suis intéressé.

    EDIT : j'ai ajouté le bout de code que tu as mis lignes 29 à 31 et je n'ai eu aucune erreur...
    En tous les cas, cela ne m'a pas alimenter ma table. Il faut que je regarde comment alimenter la table via VBA, il me semblait pourtant que c'était la partie "déclaration des variables".

    Je regarde ça et te tiens informé. C'est tout de même étrange ces erreurs "aléatoires". Hier, avant la ligne 40, c'est la 23 qui me posait problème...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Je viens de réessayer et toujours l'erreur ligne 23 comme quoi le serveur n'est pas opérationnel.
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    LOOOOL. En fait j'avais laissé comme valeur "monDomain.local" sur la variable de domaine !!!! Valeur que j'avais modifiée pour poster sur le forum Sinon ça interroge bien le LDAP mais j'ai des erreurs comme toi. Alors j'ai rajouté : On Error Resume Next. Pas de message d'erreur mais à un moment le traitement continue de tourner et ne m'affiche plus rien....J'ai été obligé de cliquer sur le bouton STOP dans le VBE pour arrêter l'exécution du code. J'ai l'impression qu'il s'agissait d'une boucle sans fin
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    C'est sur que ça marche moins bien si tu mets pas le bon chemin
    Pas le temps de regarder en détail ce matin, j'ai pas mal de boulot avec les utilisateurs.

    Je regarde ça dès que j'ai le temps, j'espère cet après-midi.

  7. #7
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 869
    Points : 3 448
    Points
    3 448
    Par défaut
    Bonjour Schtroumpf76, paidge,

    Je ne suis pas familier avec la méthode que vous utilisé, mais voici une méthode qui parcours le fichier du début à la fin (ici je récupère les contacts qui font parti du groupe membre):
    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
    Function OuvertureMembreExchange()
    On Error GoTo OuvertureMembreExchange_Err
     
        Const ADS_SCOPE_SUBTREE = 2
        Dim objConnection As ADODB.Connection
        Dim objCommand As ADODB.Command
        Dim objRecordSet As ADODB.Recordset
     
        DoCmd.Hourglass True
     
        Set objConnection = CreateObject("ADODB.Connection")
        Set objCommand = CreateObject("ADODB.Command")
     
        objConnection.Provider = "ADsDSOObject"
        objConnection.Open "Active Directory Provider"
        Set objCommand.ActiveConnection = objConnection
        objCommand.Properties("Page Size") = 1000
        objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
     
        strSQL = "SELECT mailNickname, name, sn, givenName, mail, initials, displayName, streetAddress, postOfficeBox, l, st, postalCode, co, "
        strSQL = strSQL & "homePhone, pager, mobile, facsimileTelephoneNumber, ipPhone, whenCreated, whenChanged, memberOf FROM 'LDAP://OU=Contacts,DC=LeServeur,DC=local' "
        strSQL = strSQL & "WHERE objectCategory='contact' And memberOf = 'CN=Membres,OU=Contacts,DC=LeServeur,DC=local'"
     
        objCommand.CommandText = strSQL
        Set objRecordSet = objCommand.Execute
     
        Do Until objRecordSet.EOF
                  'Ici l'action que tu veux
            objRecordSet.MoveNext
        Loop
     
        objRecordSet.Close
        Set objRecordSet = Nothing
        Set objConnection = Nothing
        Set objCommand = Nothing
     
        DoCmd.Hourglass False
        Exit Function
     
    OuvertureMembreExchange_Err:
        MsgBox "Impossible de mettre à jour le serveur Exchange, les données des membres ne seront donc pas à jour!", vbCritical
        DoCmd.Hourglass False
     
    End Function
    La différence avec ton code est que j'utilise l’objet command et dans l'aide d'Access:
    Pour exécuter une requête sans utiliser d’objet Command, passez une chaîne de requête à la méthode Execute d’un objet Connection. Toutefois, un objet Command est nécessaire si vous voulez rendre persistant le texte de commande et l’exécuter de nouveau, ou utiliser des paramètres de requête.
    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour Robert1957,

    Je te remercie pour ton aide, je vais regarder ça ASAP.

    Je n'ai malheureusement que peu de temps en ce moment, pas mal de boulots annexes.
    Dès que j'ai le temps de faire les tests, je te fais un retour.

    Cordialement

    EDIT : Je viens de tester à l'instant, et j'ai une erreur à la ligne 5 de ton code.

    "Dim objConnection As ADODB.Connection"

    "erreur de compilation

    Type défini par l'utilisateur non défini"

    Comme je l'ai dit plus haut, je n'ai absoluement aucune connaissance en VBA.
    J'espère pouvoir m'y pencher ce weekend, après cela, je serai 2 semaines en formation à faire du Unix, je relancerai donc le sujet après cela.

    Je vous remercie à tous pour l'aide apportée à un allergique du code

    PS : je ne passe pas le sujet en résolu, car je compte relancer plus tard la discussion, mais pas d'inquiétude, dès que j'ai ce qu'il me faut, cela sera fait.

  9. #9
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 869
    Points : 3 448
    Points
    3 448
    Par défaut
    Bonjour Schtroumpf76,

    C'est parce qu'il te manque la référence des objets ADO Microsoft (ActiveX Data Objects).

    Soit tu installes la référence dans Outils/Références, soit tu fais du late binding.

    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

Discussions similaires

  1. [Access 2007 - 2010] Exécuter requête ajout macro
    Par shiriom dans le forum Macros Access
    Réponses: 4
    Dernier message: 28/09/2013, 22h07
  2. données tableau excel vers table access ?
    Par alexkickstand dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/09/2007, 21h11
  3. fichier txt vers table access Shema.ini
    Par psyko72 dans le forum VB.NET
    Réponses: 1
    Dernier message: 05/07/2007, 11h13
  4. [VB 2005 express] Afficher un champ d'une table Access 2007
    Par Xsara 167 cv dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/03/2007, 13h16
  5. import rapport BO vers table Access
    Par bouba_95 dans le forum Access
    Réponses: 2
    Dernier message: 10/01/2007, 15h26

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