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.
No responses yet