Hallo zusammen
eine Adress-Datenbank wurde von mir erstellt und dazu eine Benutzeranmeldung mit VBA. Es existiert eine Tabelle für "Benutzer", "Benutzergruppen" und "Berechtigungen. Die Anmeldung an sich funktioniert, allerdings funktionieren die Brechtigungen nicht, diese werden durch den User "Admin" ersetzt/übergangen, dieser User existiert aber nicht in meiner Tabelle "Benutzer", dadurch wird wohl auch die Berechtigungsstufe nicht gesetzt.
Nach erfolgreicher Anmeldung wird mir auch die korrekte Berechtigungsstufe angezeigt, also Anwender oder Administrator. Die Berechtigungen sollen Änderungen im Formular "Contact List" verhindern oder erlauben. Wenn ich dieses Formular starte mit Debugging, bekomme ich die Ausgabe:
Aktueller Benutzername: Admin
Benutzergruppen_ID:
Kann mir jemand sagen, wie ich in meiner Datenbank diesen User abschalten oder deaktivieren bzw. verhindere dass der sich "vordrängelt"? Es scheint ein Standard-User von Access zu sein?
Erstellt wurde die DB mit Access 2016
Hallo,
wie genau ist die Anmeldung realisiert?
Zitat von: mark_k am Februar 07, 2024, 10:23:19Aktueller Benutzername: Admin
"Admin" klingt sehr danach als würdest du den Benutzer über die
CurrentUser Funktion ermitteln. - Dies ist leider das alte Benutzerverwaltungssystem von Access, dass mit dem neuen .accdb Dateiformat nicht mehr funktioniert.
Wenn das so ist, solltest du nach einer alternativen Möglichkeit recherchieren. Z.B. über den Windows Benutzer.
Hallo Klaus,
es geht hier um eine Adress-Datenbank. Realisiert habe ich das mit einer Tabelle die Adressen beinhaltet und dazu ein Formular mit Anmeldemaske.
Das Formular nennt sich "Benutzeranmeldung":
Private Sub Befehl21_Click()
' Überprüft, ob die Anmeldeinformationen korrekt eingegeben wurden.
If Nz(Me.Benutzername, "") = "" Or Nz(Me.Passwort, "") = "" Then
MsgBox "Bitte Benutzername und Passwort eingeben", vbExclamation, "Eingabe erforderlich"
Me.Benutzername.SetFocus
' Anmeldeinformationen sind korrekt
Else
' Überprüft, ob der Benutzername existiert.
If IsNull(DLookup("Benutzername", "Benutzer", "Benutzername='" & Me.Benutzername & "'")) Then
MsgBox "Benutzername ist nicht korrekt", vbExclamation, "Eingabe erforderlich"
Me.Benutzername.SetFocus
' Überprüft, ob das Passwort korrekt eingegeben wurde.
ElseIf IsNull(DLookup("Passwort", "Benutzer", "Benutzername='" & Me.Benutzername & "' AND Passwort='" & Me.Passwort & "'")) Then
MsgBox "Passwort ist nicht korrekt", vbExclamation, "Eingabe erforderlich"
Me.Passwort.SetFocus
Else
' Lese die Benutzergruppen-ID aus der Tabelle "Benutzer"
Dim BenutzergruppenID As Integer
BenutzergruppenID = DLookup("Benutzergruppen_ID", "Benutzer", "Benutzername='" & Me.Benutzername & "'")
' Überprüfe die Berechtigungen basierend auf der Benutzergruppen-ID
Select Case BenutzergruppenID
Case 1 ' Administratoren
DoCmd.Close acForm, "Benutzeranmeldung"
MsgBox "Anmeldung erfolgreich als Administrator!", vbExclamation, "Anmeldung"
' Öffne das Formular "Contact Start"
DoCmd.OpenForm "Contact Start"
Case 2 ' Anwender
DoCmd.Close acForm, "Benutzeranmeldung"
MsgBox "Anmeldung erfolgreich als Anwender!", vbExclamation, "Anmeldung"
' Öffne das Formular "Contact Start" im nur-Lese-Modus
DoCmd.OpenForm "Contact Start", , , , acFormReadOnly
End Select
End If
End If
End Sub
Private Sub Passwort_AfterUpdate()
Befehl21_Click
End Sub
Dazu habe ich die Tabellen "Benutzer", "Benutzergruppen" und "Berechtigungen" erstellt.
Nachdem der Login durchgeführt wurde, wird automatisch das Formular geschlossen und das Formular "Contact Start" geöffnet. Hier wird dann über die Schaltfläche "Befehl16" das Formular "Contact List" geöffnet, das mit der Tabelle "Contact" verknüpft ist:
Private Sub Befehl16_Click()
' Überprüfe den aktuellen Benutzernamen
Debug.Print "Aktueller Benutzername: " & CurrentUser()
' Überprüfe die Benutzergruppen-ID des aktuellen Benutzers
Dim BenutzergruppenID As Variant
BenutzergruppenID = DLookup("Benutzergruppen_ID", "Benutzer", "Benutzername='" & CurrentUser() & "'")
Debug.Print "Benutzergruppen_ID: " & BenutzergruppenID
' Überprüfe, ob der Benutzer ein Administrator ist
If Not IsNull(BenutzergruppenID) Then
' Überprüfe die Berechtigung für das Formular "Contact List"
If CheckBerechtigung(CLng(BenutzergruppenID), "Contact List") Then
' Der Benutzer hat die Berechtigung, öffne das Formular "Contact List"
DoCmd.OpenForm "Contact List"
Else
' Der Benutzer hat keine Berechtigung, zeige eine Meldung
MsgBox "Sie haben keine Berechtigung, dieses Formular zu öffnen.", vbExclamation, "Berechtigungsfehler"
End If
Else
' Falls die Benutzergruppen-ID nicht gefunden wird, zeige eine Meldung
MsgBox "Benutzer nicht gefunden.", vbExclamation, "Berechtigungsfehler"
End If
End Sub
Function CheckBerechtigung(BenutzergruppenID As Long, Formularname As String) As Boolean
' Überprüfe die Berechtigung für das Formular
Dim BerechtigungsLevel As Variant
BerechtigungsLevel = DLookup("BerechtigungsLevel", "Berechtigungen", "Benutzergruppen_ID=" & BenutzergruppenID & " AND Formularname='" & Formularname & "'")
' Gib TRUE zurück, wenn der Benutzer die Berechtigung hat
CheckBerechtigung = (Not IsNull(BerechtigungsLevel) And BerechtigungsLevel = "Lesen")
End Function
Der Inhalt der Tabelle "Contacts" soll über das Formular "Contact List" angepasst werden können, allerdings nur von Administratoren, Anwender dürfen keine Änderungen vornehmen.
@PhilS Hallo Phil, über den Windows Benutzer wäre eine super Sache, wie müsste das denn aussehen?
Noch vor drei Monaten hatte ich keine Ahnung von Access und VBA, die habe ich mir alles im Selbststudium beigebracht, denke man kann hier von erweiterten Grundkenntnissen sprechen. Die Beiträge im Forum hier hatten mir sehr geholfen. :)
Hallo,
wo kommt denn der Benutzername her ?
Aus der Tabelle "Benutzer".
Tabelle:
Benutzer_ID
Benutzername
Passwort
Benutzergruppen_ID
Tabelle Benutzergruppen:
Benutzergruppen_ID
Benutzergruppenname
Tabelle Berechtigungen:
Berechtigungs_ID
Benutzergruppen_ID
Formularname
Berechtigungslevel
Beziehungen auf Benuzergruppen_ID ist gesetzt.
Die Anmeldung an sich funktioniert, das Formular "Benutzeranmeldung" wird geschlossen und die Berechtigung "Anwender" oder "Administration" korrekt in einem Popup angezeigt, die Anmeldung funktioniert also, nur die greifen die Berechtiungen nicht.
PhilS hatte ja geschrieben, dass es wohl an der Version liegt, warum sich der "Admin" vordrängelt.
Zitat von: mark_k am Februar 08, 2024, 12:02:01PhilS hatte ja geschrieben, dass es wohl an der Version liegt, warum sich der "Admin" vordrängelt.
Jein.
Das Kernproblem ist, dass du selbst deine eigene Benutzerverwaltung gebaut hast, dann aber in deinem Code trotzdem die eingebaute
CurrentUser-Funktion von Access/JET/ACE verwendest, die mit deiner eigenen Benutzerverwaltung absolut nichts zu tun hat und somit einen völlig anderen Benutzernamen (Admin) liefert.
Hallo Phil,
vielen Dank für Deine Erklärung.
Mit "Environ("USERNAME")" habe ich es auch getstet, aber leider ohne Erfolg, Angemeldet ist immer "Admin".
Hättest Du vielleicht eine Idee, wie ich das lösen könnte? Oder ist mein Code schon mit Denkfehlern belegt?
Zitat von: mark_k am Februar 09, 2024, 14:22:38Angemeldet ist immer "Admin".
Hättest Du vielleicht eine Idee, wie ich das lösen könnte? Oder ist mein Code schon mit Denkfehlern belegt?
Ja, dein Code ist mit Denkfehlern belegt. Das hatte ich dir bereits in jedem vorigen Beitrag hier in diesem Thread geschrieben.
Du verwendest die
CurrentUser-Funktion des obsoleten Access-Sicherheitssystems. Diese Funktion wird in einer .accdb-Datei immer den Standard-Benutzer "Admin" ermitteln.
Das habe ich schon verstanden, aber wie wäre der Lösungsansatz in meinem Code?
Zitat von: mark_k am Februar 10, 2024, 09:12:16Das habe ich schon verstanden, aber wie wäre der Lösungsansatz in meinem Code?
In deinem Code brauchst du eine Funktion, die dir den Benutzernamen basierend auf deiner eigenen Implementierung der Benutzerverwaltung liefert.
Bei der Verwendung von Windows Accounts wäre das schon:
Environ("USERNAME") Die Funktion kannst du auch in eine eigene Funktion verpacken:
Public Function AktuellerBenutzername As String
AktuellerBenutzername = [size=3][font=Courier New]Environ("USERNAME") [/font][/size]
End FunctionAnalog müsstest du bei deinem eigenen, nicht Windows basierenden, Benutzerverwaltung vorgehen. Du schreibst eine Funktion, die den aktuellen Benutzer aus deinem Anmeldeprozess liefert.
Ich habe es mit Environ("USERNAME") umgesetzt und es funktioniert jetzt.
Dazu habe ich noch ein Textfeld erstellt, dass bei der Anmeldung den aktuell angemeldeten Anwender mit seiner Berechtigung anzeigt.
Vielen Dank! :)