Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Tabellen von Access 2007-ACCDBs schützen

Wie bereits in diesem Artikel erwähnt, kann man die Tabellen in ACCDBs - dem Datenbankformat von Access 2007 - durchaus wie in vorherigen Access-Versionen schützen. Wer eine geschützte mdb-Datei hat, kann diese einfach hochkonvertieren und entsprechend anpassen; das Anwenden des Sicherheitssystems bei bestehenden .accdb-Dateien ist etwas aufwendiger.

Neue mdw-Datei erstellen

Als Beispiel dient eine Datenbank namens Unsicher.accdb, die alle Tabellen der Nordwind-Datenbank enthält.

Als erstes braucht man eine neue mdw-Datei, welche die Benutzer und die Benutzergruppen speichert. Den Dialog zum Erzeugen einer solchen Datei und zum Einstellen dieser Datei als aktuelle mdw-Datei können Sie nicht über die Benutzeroberfläche öffnen, sondern nur mit dem folgenden Befehl, den Sie im Direktfenster absetzen:

DoCmd.RunCommand acCmdWorkgroupAdministrator

 

Abbildung 1: Der Arbeitsgruppenadministrator

Mit einem Klick auf Erstellen legen Sie eine neue Arbeitsgruppendatei an. Geben Sie die geforderten Daten ein und wählen Sie Ort und Name der Datei aus. Sie brauchen der Arbeitsgruppendatei nicht beizutreten, das erledigen Sie auf einem anderen Wege. Anderenfalls müssten Sie nämlich nach dem Sichern der Datenbank ohnehin wieder zur Standardarbeitsgruppendatei zurückkehren.

Schließen Sie die Datenbank nun. Öffnen Sie diese dann erneut, indem Sie eine Verknüpfung oder eine Batch-Datei mit dem folgenden Inhalt anlegen:

"C:\Programme\Microsoft Office\Office12\MSACCESS.EXE" \Unsicher.accdb /wrkgrp <Pfad>\Sicher.mdw

Nach dem Öffnen können Sie erneut den Arbeitsgruppenadministrator öffnen, um zu kontrollieren, ob die Datenbank an der richtigen Arbeitsgruppendatei hängt.

Sicherheitssystem aktivieren

Das Sicherheitssystem aktivieren Sie, indem Sie dem Benutzer Admin ein Kennwort zuweisen. Dies ist der Benutzer, mit dem die Datenbank standardmäßig geöffnet wird und der alle Berechtigungen hat. Wenn er ein Kennwort hat, muss der nächste Benutzer, der die Datenbank öffnet, dieses angeben - oder er meldet sich unter einem anderen Benutzer an.

Das Kennwort ändern Sie mit der folgenden Routine:

Public Function SetPassword(strUsername As String, strPasswordOld As String, strPasswordNew As String)

    Dim wrk As DAO.Workspace

    Dim usr As DAO.User

    Set wrk = DBEngine.Workspaces(0)

    Set usr = wrk.Users(strUsername)

    usr.NewPassword strPasswordOld, strPasswordNew

End Function

 

Nach dem Ändern mit dem folgenden Aufruf erscheint beim nächsten Öffnen der Dialog zum Abfragen des Kennworts:

SetPassword "admin", "", "kennwort"

Neuen Admin anlegen

Nun legen Sie einen neuen Benutzer an, der später als neuer Administrator fungieren wird. Dies erledigen Sie mit dieser Routine:

Public Function AddUser(strUsername As String, strPID As String, strPassword As String) As Boolean

    Dim wrk As DAO.Workspace

    Dim usr As DAO.User

    On Error GoTo AddUser_Err

    Set wrk = DBEngine.Workspaces(0)

    Set usr = wrk.CreateUser(strUsername, strPID, strPassword)

    wrk.Users.Append usr

    AddUser = True

AddUser_Exit:

    Exit Function

AddUser_Err:

    Select Case Err.Number

        Case 3390   'User schon vorhanden

            Resume AddUser_Exit

        Case Else

            MsgBox Err.Number & " " & Err.Description

    End Select

    Resume AddUser_Exit

End Function

 

Der Aufruf lautet:

AddUser "AiUAdmin", "AiUAdmin", "kennwort"

 

Diesen Benutzer fügen Sie nun zur Administratoren-Gruppe hinzu. Die benötigte Funktion sieht so aus:

Public Function AddUserToGroup(strUsername As String, strGroup As String) As Boolean

    Dim wrk As DAO.Workspace

    Dim grp As DAO.Group

    Dim usr As DAO.User

    On Error GoTo AddUserToGroup_Err

    Set wrk = DBEngine(0)

    Set grp = wrk.Groups(strGroup)

    Set usr = grp.CreateUser(strUsername)

    grp.Users.Append usr

    AddUserToGroup = True

AddUserToGroup_Exit:

    Exit Function

AddUserToGroup_Err:

    Select Case Err.Number

        Case 3032 'User schon in Gruppe

            Resume AddUserToGroup_Exit

        Case 3265 'Gruppe nicht vorhanden

            Resume AddUserToGroup_Exit

        Case 3030 'User nicht vorhanden

            Resume AddUserToGroup_Exit

        Case Else

            MsgBox Err.Number & " " & Err.Description

    End Select

    Resume AddUserToGroup_Exit

End Function

 

Der Aufruf lautet:

AddUserToGroup "AiUAdmin", "Admins"

Administrator entmachten

Damit der bestehende Administrator keine Rechte mehr hat, erledigen Sie zwei Dinge: Erstens entziehen Sie dem Benutzerkonto Admin alle Rechte an der Datenbank selbst (also beispielsweise die administrativen Rechte - die Berechtigungen an den Tabellen folgen später), und zweitens entfernen Sie den Benutzer aus der Gruppe Admins.

Die Rechte entziehen Sie mit dieser Routine:

Public Function SetPermissions(strUserOrGroup As String, lngPermissions As PermissionEnum) As Boolean

    Dim db As DAO.Database

    Dim con As DAO.Container

    Set db = DBEngine(0)(0)

    Set con = db.Containers("Tables")

    con.UserName = strUserOrGroup

    con.Permissions = lngPermissions

    con.Documents.Refresh

    SetPermissions = True

SetPermissions_Exit:

    Exit Function

SetPermissions_Err:

    Resume SetPermissions_Exit

End Function

 

Aufruf:

SetPermissions "admin", dbSecNoAccess

 

Das Entfernen aus der Benutzergruppe erledigt diese Prozedur:

Public Function RemoveUserFromGroup(strUsername As String, strGroup As String)

    Dim wrk As DAO.Workspace

    Dim usr As DAO.User

    Dim grp As DAO.Group

    On Error GoTo RemoveUserFromGroup_Err

    Set wrk = DBEngine(0)

    Set grp = wrk.Groups(strGroup)

    grp.Users.Delete strUsername

    RemoveUserFromGroup = True

RemoveUserFromGroup_Exit:

    Exit Function

RemoveUserFromGroup_Err:

    Select Case Err.Number

        Case 3265 'User oder Group nicht vorhanden

            Resume RemoveUserFromGroup_Exit

        Case Else

            MsgBox Err.Number & " " & Err.Description

    End Select

    Resume RemoveUserFromGroup_Exit

End Function

 

Aufruf:

RemoveUserFromGroup "admin", "admins"

 

Neuen Admin zum Besitzer der Tabellen machen

Um den neuen Administrator wirklich allmächtig zu machen, müssen Sie ihn noch zum Besitzer aller Datenbankobjekte machen. Das geschieht, indem Sie eine neue Datenbank im Kontext des neuen Administrators anlegen. Dazu öffnen Sie Access mit einer Verknüpfung, die der oben verwendeten ähnelt, aber keine Access-Datenbank öffnet, sondern nur eine Access-Sitzung im Kontext der angegebenen Arbeitsgruppen-Informationsdatei. Melden Sie sich unter dem Namen des neuen Administrators an.

Legen Sie dann eine neue accdb-Datenbank, beispielsweise namens Sicher.accdb an und importieren Sie die Tabellen aus der vorherigen Datenbank Unsicher.accdb.

Wenn Sie diese Datenbank nun schließen und ganz normal, also ohne Angabe der neuen Arbeitsgruppen-Informationsdatei öffnen, werden Sie unter dem Admin-Konto angemeldet. Dieses hat aber keine Berechtigungen mehr an der Datenbank und auch nicht mehr an den Objekten. Trotzdem darf man scheinbar noch alles - warum das? Ganz einfach: Es fehlt nämlich noch ein kleiner Schritt, und zwar das Umwandeln der Tabellen in Systemobjekte. Dies geschieht mit der folgenden Routine, die alle vorhandenen Tabelle in Systemtabellen umwandelt:

Public Function MakeSystemObjects()

    Dim db As DAO.Database

    Dim tdf As DAO.TableDef

    Set db = DBEngine(0)(0)

    For Each tdf In db.TableDefs

        If (tdf.Attributes And TableDefAttributeEnum.dbSystemObject) = False Then

            tdf.Attributes = tdf.Attributes Or TableDefAttributeEnum.dbSystemObject

        End If

    Next tdf

End Function

Berechtigungen für Objekte setzen

Nun fehlt nur noch die Möglichkeit, differenzierte Berechtigungen für Benutzer und Benutzergruppen zu setzen. Zu beachten ist hierbei, dass man Berechtigungen auf eine Tabelle sowohl für einen Benutzer als auch für dessen Benutzergruppen setzen kann und dass Access jeweils die höheren Berechtigungen zulässt. Wenn ein Benutzer selbst keine Zugriffsrechte für eine Tabelle besitzt, eine seiner Gruppen aber schon, dann "erbt" der Benutzer die Gruppenzugriffsrechte.

Im einzelnen gibt es zwei Funktionen zum Festsetzen von Berechtigungen. Die erste setzt die allgemeinen Berechtigungen für die Datenbank fest. Die sollten Sie Benutzern auf jeden Fall entziehen, weil dieser sich sonst selbst die Zugriffsrechte an den Objekten zuweisen kann. Die zweite legt die Berechtigungen für die verschiedenen Tabellen fest. Hier können Sie sowohl einen Benutzer- als auch einen Gruppennamen angeben.

Die erste Routine namens SetPermissions erwartet die Angabe von Benutzer- oder Gruppenname und der Berechtigungen auf die Datenbank. Mit der folgenden Anweisung entziehen Sie dem Benutzer admin alle Rechte:

SetPermissions "admin", dbSecNoAccess

 

Die Funktion sieht so aus:

Public Function SetPermissions(strUserOrGroup As String, lngPermissions As PermissionEnum) As Boolean

    Dim db As DAO.Database

    Dim con As DAO.Container

    Set db = DBEngine(0)(0)

    Set con = db.Containers("Tables")

    con.UserName = strUserOrGroup

    con.Permissions = lngPermissions

    SetPermissions = True

SetPermissions_Exit:

    Exit Function

SetPermissions_Err:

    Resume SetPermissions_Exit

End Function

 

Die zweite Funktion dient dem Festlegen der Berechtigungen von Benutzern oder Benutzergruppen an den einzelnen Tabellen. Der folgende Aufruf würde dem Benutzer admin beispielsweise ausschließlich das Lesen der in der Tabelle tblPersonal enthaltenen Daten erlauben:

SetPermissionsObject "admin", "tblArtikel", dbSecRetrieveData

 

Die Funktion sieht so aus:

Public Function SetPermissionsObject(strUserOrGroup As String, strObject As String, lngPermissions As PermissionEnum) As Boolean

    Dim db As DAO.Database

    Dim con As DAO.Container

    Dim doc As DAO.Document

    Set db = DBEngine(0)(0)

    Set con = db.Containers("Tables")

    Set doc = con.Documents(strObject)

    con.UserName = strUserOrGroup

    doc.Permissions = lngPermissions

End Function

Konstanten für Berechtigungen

Die Berechtigungen vergibt man mit den folgenden Konstanten - zunächst für Tabellen (Quelle: Onlinehilfe Access 2003):

dbSecReadDef: Der Benutzer kann die Tabellendefinition sowie Spalten- und Indexinformationen lesen.
DbSecWriteDef: Der Benutzer kann die Tabellendefinition sowie Spalten- und Indexinformationen ändern.
DbSecRetrieveData: Der Benutzer kann Daten vom Document-Objekt abrufen.
DbSecInsertData: Der Benutzer kann Datensätze hinzufügen.
DbSecReplaceData: Der Benutzer kann Datensätze ändern.
DbSecDeleteData: Der Benutzer kann Datensätze löschen.

Für die Datenbank selbst gelten diese Konstanten:

DbSecDBAdmin: Der Benutzer kann eine Datenbank replizieren und das Datenbankkennwort ändern.
DbSecDBCreate: Der Benutzer kann neue Datenbanken erstellen. Diese Einstellung ist nur im Databases-Container der Arbeitsgruppeninformationsdatei (System.mdw).
dbSecDBExclusive: Der Benutzer hat exklusiven Zugriff auf die Datenbank.
dbSecDBOpen: Der Benutzer kann die Datenbank öffnen.

Weitere Hinweise

Wenn Sie die obigen Routinen selbst weiterentwickeln oder ändern möchten und sich wundern, warum der VBA-Editor für viele Methoden und Eigenschaften keine Intellisense-Unterstützung liefert, liegt das schlicht und einfach daran, dass diese ja offiziell von Access nicht mehr unterstützt werden. Die Methoden liegen allerdings noch vor und Sie können diese auch per Intellisense erreichen. Dazu müssen Sie lediglich den Objektkatalog öffnen und aus dem Kontextmenü den Eintrag Verborgene Elemente anzeigen auswählen. Im Objektkatalog erscheinen Elemente wie Username oder Permissions nun in hellgrauer Schriftfarbe.

Verknüpfung

Wenn Sie mit verschiedenen Benutzern und Berechtigungen experimentieren möchten, legen Sie am besten ein paar Verknüpfungen auf dem Desktop an, mit denen Sie sich im Kontext verschiedener Benutzer an die Datenbank anmelden. Dazu verwenden Sie entweder die in Windows eingebaute Variante oder schreiben eine Zeile wie die folgende in eine Textdatei namens <IhrWunschname>.bat, die Sie anschließend per Doppelklick ausführen können:

"C:\Programme\Microsoft Office\Office12\MSACCESS.EXE" c:\Sicher.accdb /wrkgrp c:\Sicher.mdw /user aiuadmin /pwd kennwort

© 2003-2015 André Minhorst Alle Rechte vorbehalten.