Installation in das WinSys-Dir kopiert und registriert.
Bei der Deinstallation wird die Datei automatisch mit entfernt.
Beim Start wird das Form
„frmAutoLogOff“ geladen. Dieses Form fragt aller 60 Sek den Zustand des Flags
aus der der Tabelle
tbl_AutoLogOff ab.
Ist dieser False ändert sich nichts, ist er aber True (durch den Admin gesetzt) dann wird das
Form
„frmAutoLogOffMsgBox“ in allen FE’s geladen, das den User darauf hinweist, das
sein Programm in 60 Sek geschlossen wird.
Private Sub Form_Timer()
Static MsgBoxDone As Boolean
Dim strMsg As String
Dim AutoLogOff As Boolean
Dim db As DATABASE, rs As Recordset
AutoLogOff = False
On Error Resume Next
Set db = CurrentDb()
Set rs = db.OpenRecordset("tbl_AutoLogOff", dbOpenSnapshot)
rs.MoveFirst
AutoLogOff = rs("LogOffFlag")
rs.Close
db.Close
On Error GoTo 0
If AutoLogOff Then
If Not MsgBoxDone Then
Beep
DoCmd.OpenForm "frmAutoLogOffMsgBox"
MsgBoxDone = True
Else
Application.Quit 'Access beenden...
End If
End If
End Sub
Danach muss durch den Admin der Flag wieder auf False gesetzt werden.
Natürlich können auch andere Zeiten eingstellt werden. Die Einstellung erfolgt über das Timer-Ereignis des Forms
„frmAutoLogOff“
Wie kann ich das in der Praxis nutzen?
Die Tabelle tbl_AutoLogOff in das BE kopieren und mit dem FE verknüpfen.
Die Formulare frm_Flag, frmAutoLogOff und frmAutoLogOffMsgBox in das FE kopieren.
Das Form frmAutoLogOff in dem Makro Autoexec laden.

Das Form frm_Flag für den Admin zugängig machen um den Flag zu ändern.
2. Userverwaltung und Zugang
Die Userverwalung benötigt die Tabelle tbl_User , die Abfrage qry_Filter_logon, das Modul mod_Funktionen und die
Formulare frm_User_anmelden, frm_User_Passwort_Neu, frm_PW_Return und frm_Userstamm.
Das Form frm_Start kann ein beliebiges sein.
Wie funktionierts:
Beim Start der DB wird automatisch das Formular frm_User_anmelden geladen.
Dieses Form steuert den Zugang zur DB. Das Form bezieht seine Daten aus der Tabelle tbl_User.
Folgende Felder sind enthalten. Bei Bedarf können weitere Felder hinzugefügt werden:
User_ID = Autowert
User_Kennung = Eine Kennung die mittels CRC32 Algorithmus aus Vor-und Nachname ermittelt wird.
User_Name = Vor- und Nachname des Users
User_Passwort = Ein, mittels Hash-Algorithmus, verschlüsseltes Passwort
User_Status = Hier im Bsp sind 4 Statusangaben möglich (können aber erweitert werden)
0=Admin, 1=Bearbeiter, 2=Aufsicht, 3=Gast
logon = zeigt an ob der User derzeitig in die DB eingeloggt ist
deaktiv = hier hat der Admin User auf deaktiv zu setzen (User wird im Anmeldeform nicht angezeigt.)
Die Abfrage qry_Filter_logon dient als Datenherkunft für das Startformular um den angemeldeten User anzuzeigen
und beim Schliessen den logonFlag zu löschen.
Im Modul mod_Funktionen sind einige Funktionen enthalten:
Function „atCNames“ = ermittelt den angemeldeten Systemuser.
Function „tk_Controls_Property“ = zur Manipulation von Eigenschaften mehrere Controls gleichzeitig näheres dazu hier:
Manipulation von Control-Properties in Formularen
Function „CreateKennung“ = Erstellt mittels CRC32 Algorithmus die Userkennung. Benötigt die Datei „CrypterPW.dll“
Das Formular frm_User_anmelden
Datenherkunft tbl_User
Im Kombinationsfeld „Bitte User auswählen:“ wird der User für die Anmeldung ausgewählt.
Aus Demozwecken wird der Name und die Kennung angezeigt. In der Praxis empfielt sich nur die Kennung anzuzeigen.
Nach der erfolgten Auswahl des Users wird das Textfeld für die Passwort-Eingabe freigegeben.
Nach der Eingabe des Passwortes werden die Buttons „Anmelden“ und „Passwort ändern“ freigegeben.
Erst nach einem Klick auf den jeweiligen Button wird das Passwort geprüft.
Da das Passwort mittels Hash-Algorithmus, welche nicht rekursiv arbeitet, kann die Prüfung nur dahin gehend erfolgen,
das die Eingabe ebenfalls verschlüsselt wird und beide Strings miteinander verglichen werden:
Dim PW_Crypter As String
PW_Crypter = PWCrypter.GetPasswordHash(Me!txt_PW_Eingabe)
If PW_Crypter = Me!txt_PW Then
MsgBox "Anmeldung in Ordnung." & vbNewLine & "Sie werden weitergeleitet.", vbInformation, "Hinweis"
'...
Die gleiche Prüfung erfolgt bei dem Klick auf den Button „Passwort ändern“.
Ist das Ergebnis falsch erfolgt kein Zugang und die DB wird geschlossen.
Soll das Passwort geändert werden, öffnet sich ein 2. Anmeldeform in dem das neue Passwort 2x eingegeben werden muß.
Sind beide Eingaben identisch wird das Passwort wieder mittels Hash verschlüsselt und in die Tabelle tbl_User zurückgeschrieben.
Danach das Form schliessen und im Anmeldeform sich mit dem neuen Passwort anmelden.
Hinweis:
Eine Löschen des Passwortes von aussen würde nichts nützen, da der Laufzeitfehler 94 ausgelöst würde und der
schliesst das Programm.
Ein Auslesen aus der Tabelle und dann vielleicht reinkopieren geht auch nicht, da ja das lesbare Passwort verschlüsselt und
mit dem hinterlegten verglichen wird.
Und ein Entschlüsseln dürfte sicher nicht unmöglich aber einige Zeit dauern, wenn es so aus sieht: k¯Ú†6�¹6dßÅÍÃÀTq.
Jetzt zum zweiten Teil bei erfolgreicher Anmeldung:
Me.logon = True
DoCmd.RunCommand acCmdSaveRecord
In der 1.Zeile „Me.logon = True wird der Logon-Status in die Tabelle tbl_User geschrieben. Dieser ermöglicht dem Admin
zu sehen wer gerade eingeloggt ist.
DoCmd.RunCommand acCmdSaveRecord ist erforderlich um den Logon-Status im Startform und die Userdaten darzustellen.
DoCmd.OpenForm "frm_Start"
Forms!frm_Start.Requery
Forms!frm_Start.Refresh
Hinweis:
Um zu gewährleisten das der Logon-Status nach Schliessen der DB wieder zurückgesetzt wird, ist es nicht möglich das
Form frm_Start über das Fenstermenü oder das „X“ zu schliessen.
Dieses wird ermöglicht durch eine unsichtbare Checkbox im Startform, die als Standardwert False hat.
Im Entladen-Ereignis ist folgender Code hinterlegt:
Private Sub Form_Unload(Cancel As Integer)
If Me!conClose = False Then Cancel = True
End Sub
Dieser Code lässt ein Schliessen nicht zu. Erst wenn die Checkbox den Wert True hat, kann die DB geschlossen werden.
Dieses setzt natürlich voraus das, das Startform immer geöffnet sein muss.
Ein Schliessen wäre dann über den Button „Programm Beenden“ möglich.
Dieser setzt die Checkbox auf True, den Logon auf False und schliesst die DB.
Private Sub btn_exit_Click()
Me!conClose = True
Me!logon = False
DoCmd.Quit
End Sub
Weiter im Anmeldecode:
If Forms!frm_Start!txt_User_Status = 0 Then
tk_Controls_Property Forms!frm_Start.Form, "X", "Enabled", True
Forms!frm_Start!txt_status = "Administrator"
ElseIf Forms!frm_Start!txt_User_Status = 1 Then
tk_Controls_Property Forms!frm_Start.Form, "XY", "Enabled", True
Forms!frm_Start!txt_status = "Bearbeiter"
ElseIf Forms!frm_Start!txt_User_Status = 2 Then
tk_Controls_Property Forms!frm_Start.Form, "XYZ", "Enabled", True
Forms!frm_Start!txt_status = "Aufsicht"
Else
tk_Controls_Property Forms!frm_Start.Form, "XYZG", "Enabled", True
Forms!frm_Start!txt_status = "Gast"
End If
DoCmd.Close acForm, "frm_User_anmelden"
Zuerst wird das Feld „Status“ im Startform gefüllt durch die If...Else Schleife.
Sollen andere oder zusätzliche Bezeichnungen eingefügt werden, muss dieser Codeteil angepasst werden.
Der Aufruf der der Funktion „tk_Controls_Property” bewirkt die Freischaltung der jeweiligen Buttons aufgrund
des Status des eingeloggten Users.
Genauere Erläuterungen zur Funktionsweise gibt es hier: Manipulation von Control-Properties in Formularen
und würde den Rahmen hier sprengen. Nur kurz zur Erläuterung.
Alle anderen Argumente der Funktion bitte auf der Website nachschlagen.
Die Buttons oder andere Controls, die nur der Admin benutzen kann, erhalten die Marke(Tag) „X“
Für Bearbeiter lautet die Marke „XY“
Für Aufsichten lautet die Marke „XYZ“
Und für Gäste lautet die Marke „XYZG“
Da die Funktion mittels „Instr“-Funktion prüft ob der String in der Marke enthalten ist, würde sich folgende Möglichen ergeben:
Admins könnten alle Buttons benutzen die als Marke „X“, „XY“, „XYZ“ und „XYZG“ enthalten, da hier überall ein „X“
enthalten ist, deshalb:
tk_Controls_Property Forms!frm_Start.Form, "X", "Enabled", True
Bearbeiter könnten nur die Buttons benutzen die als Marke „XY“, „XYZ“ und „XYZG“ enthalten, da hier überall ein „XY“
enthalten ist, deshalb:
tk_Controls_Property Forms!frm_Start.Form, "X", "Enabled", True
Aufsichten könnten nur die Buttons benutzen die als Marke „XYZ“ und „XYZG“ enthalten, da hier überall ein „XYZ“
enthalten ist, deshalb:
tk_Controls_Property Forms!frm_Start.Form, "XYZ", "Enabled", True
Gäste könnten nur die Buttons benutzen die als Marke „XYZG“ enthalten, da hier überall ein „XYZG“
enthalten ist, deshalb:
tk_Controls_Property Forms!frm_Start.Form, "XYZG", "Enabled", True
Am Ende wird noch das Anmeldeform geschlossen:
DoCmd.Close acForm, "frm_User_anmelden"
Das Formular frm_Start bedarf keiner großen Erklärungen, da es nur zur Demonstration enthalten ist.
Es ist beliebig anpassbar, da die Grundeinstellungen hierfür schon im Form frm_User_anmelden getätigt wurden.
Das Feld „aktueller System User“ enthält den angemeldeten SystemUser und wird von der Funktion „atCNames()“ ermittelt.
Dient aber nur zur Information.
Im Feld „angemeldeter User“ ist der angemeldete User enthalten. Datenquelle ist die Abfrage qry_Filter_logon.
Die Herkunft für das Feld „Status“ wurde schon weiter oben behandelt.
Je nach Status erfolgt die Freigabe der angezeigten Buttons. Wobei hier in der Bsp-DB nur die Buttons “DB Log Off Flag“
(Funktion wurde oben behandelt) und der Button „Stammdaten User“ ein Funktion haben.
Alle anderen sind nur zu Demonstration der Rechtevergabe enthalten.
Rechtevergabe und Marke (Tag) der Buttons:
Bezeichnung des Buttons
Stammdaten User
DB Log Off Flag
Stammdaten Mitarbeiter
Tagesdaten
Testdaten
|
Marke(Tag)
X
X
XY
XYZ
XYZG
|
Rechte für:
Admins
Admins
Admins, Mitarbeiter
Admins, Mitarbeiter, Aufsichten
Admins, Mitarbeiter, Aufsichten und Gäste
|
Kommen wir jetzt zum Formular frm_Userstamm. Hier hat der Admin die Möglichkeit neuer User anzulegen,
zu deaktivieren (nicht löschen) oder Passwörter zurück zusetzen.
Erklärung der einzelnen Funktionen:
1. User-Passwort zurücksetzen
Der Admin hat zur keiner Zeit die Möglichkeit das Passwort eines User auszulesen, da die Hash-Verschlüsselung hier nicht rekursiv
arbeitet. Hat ein User sein Passwort vergessen, kann der Admin nur das Passwort auf einen Standardwert zurücksetzen.
Danach muss der User sofort das Standardpasswort ändern.
Im Form frm_Userstamm wählt der Admin den betreffenden User aus, mit einem Klick auf den Button „PW zurück setzen“
wird das Form frm_PW_Return kurz ausgeblendet aufgerufen und das Passwort zurückgesetzt.
So erfolgt die Rücksetzung:
Dim PWCrypter As New clsCryptPassword
Private Sub Form_Load()
Me!txt_User_Passwort = PWCrypter.GetPasswordHash("start")
DoCmd.RunCommand acCmdSaveRecord
MsgBox "Passwort wurde erfolgreich zurückgesetzt", vbInformation + vbOKOnly, "PW zurückgesetzt"
DoCmd.Close acForm, "frm_PW_Return"
End Sub
Im Load-Ergeinis des Forms frm_PW_Return wird der obige Code ausgeführt, wobei natürlich das neue Passwort (hier „start“)
beliebig festgelegt werden kann.
2. User deaktivieren
Es besteht nicht die Möglichkeit User zu löschen sondern nur zu deaktivieren. Deaktive User sind nicht mehr im Anmeldeform
sichtbar. Ist sicherlich nicht immer erwünscht. Sollen User gelöscht werden, dann müsste der Punkt „Löschen zulassen“ im Form
frm_Userstamm aktiviert werden. Das kann jeder halten wir er will.
3. User anlegen
Wenn ein User neu angelegt werden soll, ist es nur erforderlich den Usernamen und den Status zu setzen.
Als Start-Passwort wird hier „start“ automatisch vorgeben und verschlüsselt. Die Userkennung wird nach einem weiteren
Verschlüsselungsalgorithmus, aus der CrypterPW.dll berechnet. Die Berechnung erfolgt aus dem Usernamen.
Private Sub txt_User_Name_AfterUpdate()
Me.txt_User_Kennung = CreateKennung(Me.txt_User_Name)
End Sub
Es besteht aber die Gefahr, das User den gleichen Vor- und Nachnamen haben, dann käme es zur Vergabe der gleichen Kennung.
In diesem Fall müsste die UserId mit einbezogen werden. Da dieses Feld ein Autowert ist, dürfte es zu keinen
Dopplungen mehr kommen.
Private Sub txt_User_Name_AfterUpdate()
Me.txt_User_Kennung = CreateKennung(Me.txt_User_ID & Me.txt_User_Name)
End Sub
Wie kann ich das in der Praxis nutzen?
Die Tabelle tbl_User in das BE kopieren und mit dem FE verknüpfen.
Die Abfrage qry_Filter_logon und die Formulare frm_User_anmelden, frm_User_Passwort_Neu, frm_PW_Return
und frm_Userstamm und das Modul mod_Funktionen in das FE kopieren.
Außerdem wird ein Startformular benötigt das ähnlich dem in der Bsp-DB gelagert ist, zumindest in Funktionalität.
Die CrypterPW.dll muss per Verweis in das FE eingebunden werden.
Auf einem anderen Rechner ist diese DLL auch mittels Regserv32 zu registrieren.
Zusammenfassung
Diese Bsp-DB erhebt nicht den Anspruch auf Vollständigkeit und auch nicht vollständige Sicherheit, aber sie zeigt vielleicht
eine Möglichkeit, eine einfache Userverwaltung und daraus abgeleitete Rechte zu verwenden.
Es gäbe auch die Möglichkeit das Ganze zu erweitern, z.B. im Sinne von Formularrechten wie Bearbeiten, Löschen oder Anfügen
je nach Status.
Weiterlesen...