Access DB in LDAP reinschreiben

Moderator: ModerationP

Access DB in LDAP reinschreiben

Beitragvon ghebrezghiher » 11. Okt 2019, 16:27

Guten Tag,

ich bin neu in Access und darf gleich eine LDAP abfrage erstellen. Kurz mal zu meinem vorhaben:

Ich habe eine Tabelle(tblAddress) wo Mitarbeiterdaten drin stehen. Darin ist der Benutzername, Checkbox ob Erledigt und IP-Adresse vermerkt. Nun möchte ich über LDAP den User mit dem Benutzername finden und die IP-Adresse in das Feld IPAddress im AD eintragen und wenn er das gemacht hat in meiner Tabelle den Haken auf Erledigt setzten.

Habt ihr mir jemand ein Beispielcode wie das aussehen kann?

Vielen Dank im voraus!

Thomas
ghebrezghiher
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28
Registriert: 13. Sep 2019, 11:36

Re: Access DB in LDAP reinschreiben

Beitragvon Bitsqueezer » 11. Okt 2019, 18:48

Hallo,

ist jetzt nicht wirklich schwer, dazu was zu finden:
http://www.office-loesung.de/ftopic173732_0_0_asc.php
http://www.office-loesung.de/ftopic380440_0_0_asc.php
http://www.office-loesung.de/ftopic95581_0_0_asc.php

Einfach mal nach VBA und LDAP suchen...

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7219
Registriert: 21. Jun 2007, 12:17

Re: Access DB in LDAP reinschreiben

Beitragvon ghebrezghiher » 14. Okt 2019, 08:02

Hallo Christian,

Danke habe ich auch schon bereits gemacht aber leider bringt mich das nicht weiter oder ich verstehe es einfach nicht :roll:

Habe mal einen Code kopiert und den versucht auf meine Anforderungen zu ändern, jedoch ohne erfolg.

Hier mal mein Code:

Code: Alles auswählen
''Verbindung mit AD aufnehmen
    Set objDSE = GetObject("LDAP://vcdtm01.emea.hause.biz")
    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open
    Set objCommand = CreateObject("ADODB.Command")
    Set objCommand.ActiveConnection = objConnection
''Directory nach User Account durchsuchen
    objCommand.CommandText = _
            "SELECT vwgPreferredUserAccount " & _
            "FROM 'LDAP://" & objDSE.Get("dc=hause,dc=vwg,dc=com") & "' " & _
            "WHERE objectCategory='person' AND PreferredUserAccount='" & Suchbegriff & "*'"
    Set objRecordset = objCommand.Execute
    Do While Not objRecordset.EOF
        If Not (IsNull(objRecordset.Fields("PreferredUserAccount))) Then objRecordset.Fields("IPaddress") = Me!IP_Adresse.Value
        objRecordset.MoveNext
    Loop
    objRecordset.Close
    objConnection.Close


Meine Frage ist jetzt wie ich genau die Verbindung starte was kommt wo rein?

Set objDSE = GetObject("LDAP://"der Host?")

oder hier den Host?

objConnection.Provider = "ADsDSOObject"

Wo kommt dann die Base und meine Benutzerdaten dann rein?

Sorry arbeite das erste mal damit möchte es aber wirklich lernen!

Grüße

Thomas
ghebrezghiher
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28
Registriert: 13. Sep 2019, 11:36

Re: Access DB in LDAP reinschreiben

Beitragvon Bitsqueezer » 14. Okt 2019, 08:58

Hallo,

mit grundsätzlichem LDAP sollte man sich schon mal befaßt haben.

https://www.ip-insider.de/was-ist-ldap- ... -a-581204/
https://www.ibm.com/support/knowledgece ... 804a0.html
https://www.faq-o-matic.net/2008/01/13/ ... directory/
https://www.tecchannel.de/a/ldap-abfrag ... len,464680

Um nur ein paar Grundlagenartikel zu listen...

Hier ist ein Modul, daß ich 2012 geschrieben habe, um generell in der aktiven Domäne Informationen über den aktiven User in ein Excel-Tabellenblatt zu kopieren. Die entsprechenden "Range"-Befehle mußt Du dann natürlich in Access herausnehmen.

Welche Felder Dir Dein Active Directory zurückliefert, ist individuell von Deiner Domäne abhängig. Statt der hier verwendeten Feldliste kannst Du also einfach "SELECT *" verwenden, um erst mal alle Felder zu erhalten und dann herauszufiltern, welche Felder Du haben willst und wie sie genau heißen.
Code: Alles auswählen
Option Explicit

'---------------------------------------------------------------------------------------
' Module    : modLDAP
' Author    : Christian Coppes
' Date      : 11.01.2012
' Purpose   : Active Directory Attribute mit LDAP laden
'---------------------------------------------------------------------------------------

'#######################################################################################
'---------------------------------------------------------------------------------------
'----------------------------------- Constants  ----------------------------------------
'---------------------------------------------------------------------------------------
'#######################################################################################

Private Const cMODULENAME = "modLDAP"

'#######################################################################################
'---------------------------------------------------------------------------------------
'--------------------------------------- Methods ---------------------------------------
'---------------------------------------------------------------------------------------
'#######################################################################################

Public Sub LoadUserData(ByVal strUserLogin As String)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim cmd As ADODB.Command
   
    Dim objRoot As ActiveDs.IADs
    Dim objDomain As ActiveDs.IADs
    Dim objUser As ActiveDs.IADs
    Dim strDomain As String
    Dim i As Long
   
    Dim fld As ADODB.Field
   
    Set cn = New ADODB.Connection
    cn.Provider = "ADsDSOObject"
    cn.Open "Active Directory Provider"
   
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = cn
   
    ' Pfad der gegenwärtigen Domäne (LDAP) einholen
    Set objRoot = GetObject("LDAP://rootDSE")
    strDomain = objRoot.Get("defaultNamingContext")
    'strDomain = objRoot.Get("rootDomainNamingContext")
    Set objDomain = GetObject("LDAP://" & strDomain)
   
    cmd.CommandText = " SELECT sAMAccountName, distinguishedName, mail,personalTitle, sn, name, initials,givenName, telephoneNumber, ipPhone, " & _
                      "        mobile, otherTelephone, facsimileTelephoneNumber, " & _
                      "        otherFacsimileTelephoneNumber, homePhone, " & _
                      "        department, company, co, l, c, st, buildingName, roomNumber, secretary, manager, postalCode, street, " & _
                      "        title, preferredLanguage, employeeType" & _
                      "   FROM '" & objDomain.ADsPath & "' " & _
                      "  WHERE samAccountType=805306368 " & _
                      "    AND sAMAccountName = '" & strUserLogin & "'"

'"  WHERE objectCategory='user' " & _

    Set rs = cmd.Execute

    If Not (rs.EOF And rs.BOF) Then
        Set objUser = GetObject("LDAP://" & rs.Fields("distinguishedName"))
   
        i = 2
        For Each fld In rs.Fields
            i = i + 1
            Cells(5, i) = fld.Name
        Next
           
       
        Range("A5") = "UserGUID"
        Range("A6") = fnFormatGUID(objUser.GUID)
       
        Range("C6").CopyFromRecordset rs
    Else
        MsgBox "Could not find or load the user!"
    End If
   
    rs.Close
    Set rs = Nothing
   
    cn.Close
    Set cn = Nothing
End Sub

Public Sub EnterUserID()
    Dim strInput As String
    strInput = InputBox("Bitte Windows Login eingeben:")
    If Not (strInput = "") Then
        LoadUserData strInput
    End If
End Sub

Private Function fnFormatGUID(strGUID As String) As String
    fnFormatGUID = UCase("{" & Left(strGUID, 8) & "-" & Mid(strGUID, 9, 4) & "-" & _
                         Mid(strGUID, 13, 4) & "-" & Mid(strGUID, 17, 4) & "-" & Right(strGUID, 12) & "}")
End Function


Mit der Sub "EnterUserID" wird eine InputBox geöffnet, in die man die gewünschte UserID eingeben kann und dann werden die Informationen in ein Excel-Blatt kopiert.

Das kannst Du Dir dann für Deine Zwecke anpassen, da Du ja nach einem anderen Attribut suchen und eine Userliste ausgeben lassen willst.
Eine Angabe eines Servers oder einer Domäne ist hier nicht notwendig, da einfach die Domäne aus dem LDAP selbst bezogen wird, also aus dem Active Directory, in das man gerade eingeloggt ist.

Zum Testen kannst Du den Code oben einfach in Excel in ein Standardmodul einfügen, dann erstellst Du auf einem Sheet einen Button und verweist ihn auf das Makro "EnterUserID".

Da das Modul Early Binding einsetzt, brauchst Du die Referenz auf "Microsoft ActiveX Data Objects 6.1 Library" (ADO 6.1) und "Active DS Type Library", zu finden unter "C:\Windows\SysWOW64\activeds.tlb", falls es nicht in Deiner Liste auftaucht.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7219
Registriert: 21. Jun 2007, 12:17

Re: Access DB in LDAP reinschreiben

Beitragvon ghebrezghiher » 15. Okt 2019, 07:36

Hallo Christian,

leider habe ich den Code immer noch nicht wirklich zum laufen gebracht. Ich habe mittlerweile unzählige Beispiele versucht und komme gerade nicht wirklich weiter.
Nun arbeite ich grad mit diesem Code. Vlt kannst du mir sagen wo hier der Fehler liegt?

Code: Alles auswählen
Private Sub BTNldap_Click()

    Const ADS_SCOPE_SUBTREE = 3
    Dim objConnection As Object
    Dim objCommand As Object
    Dim objRecordSet As Recordset
    Dim IP As String
   
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand = CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Properties("User ID") = "Administrator"
    objConnection.Properties("Password") = "123456789"
    objConnection.Properties("Encrypt Password") = True
    objConnection.Open "Active Directory Provider"
   
    Set objCommand.ActiveConnection = objConnection
   
    objCommand.CommandText = "Select IPadress from " & _
                            "'LDAP://vc18.emea.hause.com:2636>;" & _
                            "WHERE objectCategory='person' AND PreferredUserAccount='Thomas'"
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
   
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst
   
    Do Until objRecordSet.EOF
       IP.AddItem objRecordSet.Fields("IPadress").Value
       objRecordSet.MoveNext
    Loop

End Sub


Was ist genau der Active Directory Provider? und wo trage ich die Base/Pfad ein?

Sorry stehe grad voll auf dem schlauch und würde mich sehr auf Hilfe freuen!

Danke

Thomas
ghebrezghiher
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28
Registriert: 13. Sep 2019, 11:36

Re: Access DB in LDAP reinschreiben

Beitragvon Bitsqueezer » 15. Okt 2019, 08:26

Hallo,

Du hast doch den Provider schon eingetragen. Hinter "Open" muß nichts mehr stehen.

Hast Du den Code oben schon ausprobiert? Der ermittelt alle nötigen Parameter selbst. Ein Benutzername/Kennwort ist bei LDAP i.d.R. nicht erforderlich.

Nochmal: Grundlagenartikel lesen.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7219
Registriert: 21. Jun 2007, 12:17

Re: Access DB in LDAP reinschreiben

Beitragvon ghebrezghiher » 15. Okt 2019, 08:34

Hallo,

Grundlagen hab ich mir zwar durchgelesen und denke auch grob verstanden zu haben nur den Code kriege ich nicht zum laufen. Wenn ich das so ausführe kommt der Fehler:

Laufzeitfehler ' -2147217900 (80040e14'):
Der Befehl enthielt mindestens einen Fehler.

Hier

Code: Alles auswählen
Set objRecordSet = objCommand.Execute
ghebrezghiher
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28
Registriert: 13. Sep 2019, 11:36

Re: Access DB in LDAP reinschreiben

Beitragvon Bitsqueezer » 15. Okt 2019, 08:39

Hallo,

und nochmal: Code oben ausprobiert? Füge das mal in Excel ein und teste es, wie beschrieben.

Wenn das geht, taste Dich mit dem Code an das ran, was Du haben willst.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7219
Registriert: 21. Jun 2007, 12:17

Re: Access DB in LDAP reinschreiben

Beitragvon ghebrezghiher » 15. Okt 2019, 09:32

Hallo Christian,

habe es gerade in Excel getestet und ich bekomme die selbe Fehlermeldung beim

Code: Alles auswählen
Set rs = cmd.Execute


Hier der angepasste Code:

Code: Alles auswählen
Option Explicit

Private Const cMODULENAME = "modLDAP"

Public Sub LoadUserData(ByVal strUserLogin As String)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim cmd As ADODB.Command
   
    Dim objRoot As ActiveDs.IADs
    Dim objDomain As ActiveDs.IADs
    Dim objUser As ActiveDs.IADs
    Dim strDomain As String
    Dim i As Long
   
    Dim fld As ADODB.Field
   
    Set cn = New ADODB.Connection
    cn.Provider = "ADsDSOObject"
    cn.Open "Active Directory Provider"
   
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = cn
   
    ' Pfad der gegenwärtigen Domäne (LDAP) einholen
    Set objRoot = GetObject("LDAP://rootDSE")
    strDomain = objRoot.Get("defaultNamingContext")
    'strDomain = objRoot.Get("rootDomainNamingContext")
    Set objDomain = GetObject("LDAP://" & strDomain)
   
    cmd.CommandText = " SELECT sn, IPadress, givenName, " & _
                      "   FROM '" & objDomain.ADsPath & "' " & _
                      "  WHERE PreferredUserAccount = '" & strUserLogin & "'"
                     
'"  WHERE objectCategory='user' " & _

    Set rs = cmd.Execute

    If Not (rs.EOF And rs.BOF) Then
        Set objUser = GetObject("LDAP://" & rs.Fields("IPadress"))
   
        i = 2
        For Each fld In rs.Fields
            i = i + 1
            Cells(5, i) = fld.Name
        Next
           
       
        Range("A5") = "UserGUID"
        Range("A6") = fnFormatGUID(objUser.GUID)
       
        Range("C6").CopyFromRecordset rs
    Else
        MsgBox "Could not find or load the user!"
    End If
   
    rs.Close
    Set rs = Nothing
   
    cn.Close
    Set cn = Nothing
End Sub

Public Sub EnterUserID()
    Dim strInput As String
    strInput = InputBox("Bitte Windows Login eingeben:")
    If Not (strInput = "") Then
        LoadUserData strInput
    End If
End Sub

Private Function fnFormatGUID(strGUID As String) As String
    fnFormatGUID = UCase("{" & Left(strGUID, 8) & "-" & Mid(strGUID, 9, 4) & "-" & _
                         Mid(strGUID, 13, 4) & "-" & Mid(strGUID, 17, 4) & "-" & Right(strGUID, 12) & "}")
End Function


ghebrezghiher
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28
Registriert: 13. Sep 2019, 11:36

Re: Access DB in LDAP reinschreiben

Beitragvon Bitsqueezer » 15. Okt 2019, 09:41

Hallo,

bist Du sicher, daß Du überhaupt ein LDAP zur Verfügung hast...?

Das Active Directory muß in einem lokalen Netzwerk sein, nicht etwa als Azure-Domäne oder Ähnliches.

Mehr als das kann ich Dir nicht sagen, da mußt Du Dich an Deinen lokalen Domänenadmin wenden.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7219
Registriert: 21. Jun 2007, 12:17

Re: Access DB in LDAP reinschreiben

Beitragvon ghebrezghiher » 15. Okt 2019, 12:20

Hallo Christian,

AD ist im Lokalen Netzwerk. Ein Kollege hat auch ein Tool VS2017 mit AD Zugriff und da funktioniert alles.

Im strDomain = objRoot.Get("defaultNamingContext")

gibt er auch die richtigen Informationen an den strDomain durch. Aber danach der Bekannte Fehler beim

Set rs = cmd.Execute
ghebrezghiher
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28
Registriert: 13. Sep 2019, 11:36

Re: Access DB in LDAP reinschreiben

Beitragvon Bitsqueezer » 15. Okt 2019, 13:05

Hallo,

wenn dem so ist, hast Du den Code von mir mal OHNE irgendwelche Anpassungen laufenlassen?

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7219
Registriert: 21. Jun 2007, 12:17

Re: Access DB in LDAP reinschreiben

Beitragvon ghebrezghiher » 15. Okt 2019, 16:24

Hallo Christian,

Jetzt läuft er durch und öffnet die Msgbox"Could not find or load the user!" ist ja schon mal ein gutes Zeichen! Nun habe ich die Select Abfrage etwas angepasst damit er auch was findet:

Code: Alles auswählen
    cmd.CommandText = " SELECT mail, sn, cn, givenName" & _
                      " FROM '" & objDomain.ADsPath & "' " & _
                      " WHERE objectClass='person' " & _
                      " AND sn = '" & strUserLogin & "'"


Die Abfrage macht er zwar aber dann bei:

Code: Alles auswählen
        Set objUser = GetObject("LDAP://" & rs.Fields("cn"))


Kommt der Fehler "Laufzeitfehler '-2147016646 (8007203a)': Automatisierungsfehler Der Server ist nicht funktionstüchtig."

Woran kann das liegen?

Vielen Dank für deine Mühe

Grüße

Thomas
ghebrezghiher
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28
Registriert: 13. Sep 2019, 11:36

Re: Access DB in LDAP reinschreiben

Beitragvon Bitsqueezer » 15. Okt 2019, 17:50

Hallo,

wieso änderst Du den Code dauernd?

Die Messagebox kommt, weil unter der gegebenen Bedingung kein User zu finden ist.
Wenn Dein LDAP funktioniert, dann mußt Du einen Benutzernamen in die Inputbox eingeben, der im Active Directory existiert und dann gibt Dir das Modul die Daten dieses Users an.

Du kannst nicht einfach ein beliebiges Attribut nehmen und es mit Set objUser zuweisen, es muß schon das richtige Objekt sein.

Also: Es funktioniert, wenn Du einen Usernamen eingibst und Du in Excel die Daten des Users zurückbekommst. OHNE CODEÄNDERUNG!!

Einfach "EnterUserID" im VBA-Direktfenster aufrufen, wenn Du keinen Button gebaut hast.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7219
Registriert: 21. Jun 2007, 12:17

Re: Access DB in LDAP reinschreiben

Beitragvon ghebrezghiher » 16. Okt 2019, 07:05

Hallo Christian,

ja es funktioniert aber nicht ohne Änderung des Codes, da er nicht alle Felder die in der Select-Abfrage stehen findet. Ist aber nicht schlimm nach der Anpassung der Felder funktioniert es jetzt dann auch. Vielen Dank für deine Hilfe bringt mich schon sehr weiter bei meinem vorhaben. Jedoch was mich da verwundert ist, dass ich nicht alle Felder auswähle kann.

Kann somit auch ein Feld beschreiben werden im AD?

Grüße

Thomas
ghebrezghiher
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28
Registriert: 13. Sep 2019, 11:36

Nächste

Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste