Verzeichnisdienste: Wie kann ich Access-Datenbanken mit Active Directory integrieren?

Ziel: Benutzer abfragen, Gruppen prüfen, AD als Datenquelle nutzen

Access läuft bei Dir lokal – aber Deine Benutzerkonten hängen am AD.
Du willst:

  • wissen, wer eingeloggt ist
  • prüfen, ob jemand Admin ist
  • evtl. Daten aus dem AD abrufen

Das geht. Mit LDAP, ADODB und ein bisschen VBA.

Variante 1: Aktuellen Benutzer ermitteln

Public Function HoleBenutzername() As String
    HoleBenutzername = Environ("USERNAME")
End Function

Oder gleich vollqualifiziert:

Public Function HoleDomänenBenutzer() As String
    HoleDomänenBenutzer = Environ("USERDOMAIN") & "\" & Environ("USERNAME")
End Function

Damit hast Du schon mal, wer da vor dem Rechner sitzt.

Variante 2: Benutzer aus AD abfragen (per LDAP)

Du willst wissen, ob ein Benutzer aktiv ist oder in einer bestimmten Gruppe?

Public Function HoleBenutzerAttribute(sAM As String) As String
    Dim conn As Object, cmd As Object, rs As Object
    Set conn = CreateObject("ADODB.Connection")
    Set cmd = CreateObject("ADODB.Command")

    conn.Provider = "ADsDSOObject"
    conn.Open "Active Directory Provider"

    Set cmd.ActiveConnection = conn
    cmd.CommandText = _
        "SELECT displayName, mail FROM 'LDAP://DC=deinefirma,DC=local' WHERE sAMAccountName='" & sAM & "'"

    Set rs = cmd.Execute

    If Not rs.EOF Then
        HoleBenutzerAttribute = rs.Fields("displayName") & " <" & rs.Fields("mail") & ">"
    Else
        HoleBenutzerAttribute = "Unbekannt"
    End If

    rs.Close: conn.Close
End Function

Achtung: Domainnamen im LDAP-Pfad anpassen (DC=deinefirma,DC=local).

Variante 3: Gruppenmitgliedschaft prüfen

Public Function IstBenutzerInGruppe(sAM As String, gruppenname As String) As Boolean
    Dim conn As Object, cmd As Object, rs As Object
    Set conn = CreateObject("ADODB.Connection")
    Set cmd = CreateObject("ADODB.Command")

    conn.Provider = "ADsDSOObject"
    conn.Open "Active Directory Provider"
    Set cmd.ActiveConnection = conn

    cmd.CommandText = _
        "SELECT memberOf FROM 'LDAP://DC=deinefirma,DC=local' WHERE sAMAccountName='" & sAM & "'"

    Set rs = cmd.Execute

    Do Until rs.EOF
        If InStr(1, rs.Fields("memberOf"), gruppenname, vbTextCompare) > 0 Then
            IstBenutzerInGruppe = True
            Exit Function
        End If
        rs.MoveNext
    Loop

    IstBenutzerInGruppe = False
End Function

Typischer Aufruf:

If IstBenutzerInGruppe(Environ("USERNAME"), "AccessAdmins") Then
    MsgBox "Du darfst das hier."
Else
    MsgBox "Zutritt verweigert."
    DoCmd.Quit
End If

Variante 4: Alle Benutzer einer OU laden

Z. B. für Auswahlfelder, Rechteverwaltung oder Sync

Public Sub LadeBenutzer()
    Dim conn As Object, cmd As Object, rs As Object
    Set conn = CreateObject("ADODB.Connection")
    Set cmd = CreateObject("ADODB.Command")

    conn.Provider = "ADsDSOObject"
    conn.Open "Active Directory Provider"
    Set cmd.ActiveConnection = conn

    cmd.CommandText = _
        "SELECT sAMAccountName, displayName FROM 'LDAP://OU=Mitarbeiter,DC=deinefirma,DC=local' WHERE objectClass='user'"

    Set rs = cmd.Execute

    Do While Not rs.EOF
        Debug.Print rs!displayName & " (" & rs!sAMAccountName & ")"
        rs.MoveNext
    Loop

    rs.Close: conn.Close
End Sub

Ideal für ein Rechte-Pflegeformular oder eine User-Verwaltung in Access.

Variante 5: Login-Funktion mit Gruppenprüfung

Public Function LoginCheck() As Boolean
    Dim benutzer As String
    benutzer = Environ("USERNAME")

    If IstBenutzerInGruppe(benutzer, "AccessNutzer") Then
        LoginCheck = True
    Else
        MsgBox "Kein Zugriff. Wende dich an die IT.", vbCritical
        DoCmd.Quit
    End If
End Function

Aufruf z. B. beim Öffnen des Startformulars.

Best Practices

  • Gruppen zentral verwalten – nicht in Access speichern
  • Gruppen statt Einzelbenutzer prüfen
  • Gruppen als „AccessMitarbeiter“, „AccessAdmin“ benennen
  • LDAP-Pfade möglichst generisch halten oder konfigurieren
  • Bei vielen Abfragen: Timeout setzen, Paging vermeiden

Einsatzszenarien

  • Rechteverwaltung
  • Protokollierung wer was getan hat
  • Benutzer-Vorauswahl in Formularen
  • Schnittstelle zu HR (wer ist aktiv, wer nicht?)
  • Reporting nach AD-Zugehörigkeit (z. B. nach Abteilung)

Fazit für Entwickler

Access kann AD. Nicht alles – aber genug für saubere Rollenlogik und Benutzerprüfung.

Nach oben scrollen