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

VBScript Discussion :

Requête et Extraction LDAP en VBA


Sujet :

VBScript

  1. #1
    Candidat au Club
    Requête et Extraction LDAP en VBA
    Bonjour,

    Je commence sur VBA et j'aimerais extraire des informations depuis un LDAP (serveur LDAP différent d'un contrôleur de domaine AD). J'arrive à me connecter mais j'ai un problème avec mon recordset pour extraire les données.

    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
     
    Sub Extract_LDAP()
    Dim objConnection, objCommand, objRecordSet, objFSO, objF
    Dim sName, strPath, strName, strManager, StrTmp
    Const ADS_SCOPE_SUBTREE = 2
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Set objFSO = CreateObject("Scripting.FileSystemObject")
     
    strName = "output.csv"
    strPath = ".\"
    If (objFSO.FileExists(strPath & strName)) Then
    objFSO.DeleteFile strPath & strName
    End If
    Set objF = objFSO.CreateTextFile(strPath & strName)
    objF.Close
    Set objF = objFSO.openTextFile(strPath & strName, ForAppending)
     
    sUser = "admin"
    sDN = "cn=" & sUser & ",dc=company,dc=com"
    sRoot = "LDAP://127.0.0.1:1389/dc=company,dc=eu"
     
    Dim oDS: Set oDS = GetObject("LDAP:")
    Dim oAuth: Set oAuth = oDS.OpenDSObject(sRoot, sDN, "password", 0)
     
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand = CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider", sDN, "password"
    Set objCommand.ActiveConnection = objConnection
     
    objCommand.Properties("Page Size") = 100
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
     
    objCommand.CommandText = "SELECT attribut1,attribut2 FROM 'LDAP://127.0.0.1:1389/OU=people,dc=company,dc=com'" & "WHERE objectClass='person'"
    Set objRecordSet = objCommand.Execute
     
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst
     
    Do Until objRecordSet.EOF
    sName = objRecordSet.Fields("attribut1").Value
     
    strDescription = ""
    If Not (IsNull(objRecordSet.Fields("attribut2").Value)) Then
    For Each StrTmp In objRecordSet.Fields("attribut2").Value
    strManager = StrTmp
    Next
    End If
     
    objF.WriteLine (sName & ";" & strManager)
    objRecordSet.MoveNext
    Loop
    objF.Close
     
    End Sub


    L'erreur pointe sur la ligne suivante :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    For Each StrTmp In objRecordSet.Fields("attribut2").Value

  2. #2
    Rédacteur/Modérateur

    Salut

    Je commence sur VBA
    ce que tu nous montres n'est pas du VBA mais du VBScript, donc dans le bon forum.

    Un For Each variable in .... parcours une collection, objRecordSet.Fields("attribut2").Value, n'est pas une collection/tableau, objRecordSet.Fields("attribut2") doit être employé pour parcourir l'ensemble des enregistrements.

    En lisant ton code je ne comprends pas ton algo:
    pourquoi ne pas faire simplement strManager = objRecordSet.Fields("attribut2").value ?, pourquoi tentes tu de passer par une boucle.
    ProgElecT
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  3. #3
    Rédacteur/Modérateur

    Re

    Autre chose, ta ligne 35 et inutile, la ligne 39 est suffisante.

    Ta boucle Do .... Loop je la verrai mieux comme ceci
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Do Until objRecordSet.EOF
    	sName = objRecordSet.Fields("attribut1").Value
    	If Not (IsNull(objRecordSet.Fields("attribut2").Value)) Then
    		strManager = "Non renseigné"
    		Else		
    		strManager = objRecordSet.Fields("attribut2").Value
    	End If
    	objF.WriteLine (sName & ";" & strManager)
    	objRecordSet.MoveNext
    Loop
    strDescription supprimé ainsi que la boucle For Each (posant problème).
    ProgElecT
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  4. #4
    Modérateur

    N'est-ce pas l'inverse qu'il fallait dans les lignes 3 à 7 ?
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If IsNull(objRecordSet.Fields("attribut2").Value) Then        
         strManager = "Non renseigné"
    Else        
         strManager = objRecordSet.Fields("attribut2").Value     
    End If
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  5. #5
    Rédacteur/Modérateur

    Salut l_autodidacte

    Je viens de vérifier, tu m'as donné le doute
    Citation Envoyé par Script56.CHM
    Renvoie une valeur booléenne indiquant si une expression contient des données valides ou non (Null).

    IsNull(expression)
    L'argument expression représente toute expression.

    Notes
    La fonction IsNull renvoie la valeur True si l'argument expression est Null, autrement dit s'il ne contient aucune donnée valide ; dans le cas contraire, la fonction IsNull renvoie la valeur False.
    Motif de l’édit:
    Tu as raison l_autodidacte.
    Mea-culpa, dans ma proposition, je n'ai pas vue le Not, Copier/Coller rapide à partir du code posté par flacko_, désolé
    ProgElecT
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  6. #6
    Candidat au Club
    Merci à vous deux!