Tipps "n" Tricks
Anwender-Software - Access

Last Update: 24. Dezember 2001/Webmaster

Zugriff auf geschützte Datenbanken mit VBA
Problem: Access 97/2000
  Auch wenn Sie keine Systemdatenbank für Arbeitsgruppen mit Benutzer- und Gruppenberechtigungen einsetzen, können Sie Ihre Access-Datenbanken vor unerlaubten Zugriffen schützen. Dafür legen Sie einfach ein Datenbankkennwort fest. In Access 97 wählen Sie dafür das Menü Extras - Zugriffsrechte - Datenbankkennwort zuweisen an. In Access 2000 lautet der Befehl Extras - Sicherheit - Datenbankkennwort zuweisen. Anschliessend tippen Sie das gewünschte Kennwort ein, und schon ist die aktuelle Datenbank geschützt: Ein Öffnen der Datenbank ist in Zukunft nur noch mit Hilfe des Kennworts möglich. Das gilt allerdings auch, wenn Sie per Programmcode auf eine geschützte Datenbank zugreifen wollen. Es wäre sicherlich keine gute Lösung, die Ausführung von VBA-Prozeduren jedesmal durch eine Aufforderung zur Kennworteingabe zu unterbrechen. Um mit geschützten Datenbanken arbeiten zu können, ohne auf Benutzereingaben angewiesen zu sein, geben Sie das Kennwort im Programmcode an. 
Lösung: Dazu ein Beispiel.

Angenommen, Sie hätten eine Datenbank namens SICHER.MDB, der Sie das Datenbankkennwort "schutz" zugewiesen haben. Nun wollen Sie aus einer zweiten MDB-Datei per VBA-Code auf die geschützte Datenbank zugreifen - in den folgenden Programmzeilen etwa, um die Tabellennamen auszulesen.

Dazu legen Sie in der zweiten Access-Datenbank ein neues Modul an, in das Sie folgenden Code eingeben:

Access 97 mit DAO:

Sub PWD_Zugriff()
Dim dbExtDB As Database
Dim tblExtDB As TableDef
Dim strAktDBPfad As String
Dim strAusgabe As String

  strAktDBPfad = CurrentDb.Name

  Do While Mid(strAktDBPfad, _
               Len(strAktDBPfad), 1) <> "\"
    strAktDBPfad = Left(strAktDBPfad, _
    Len(strAktDBPfad) - 1)
  Loop

  Set dbExtDB = DBEngine.OpenDatabase(strAktDBPfad & _
  "Sicher.mdb", False, False, ";pwd=schutz")

  For Each tblExtDB In dbExtDB.TableDefs
    strAusgabe = strAusgabe & tblExtDB.Name & vbCr
  Next tblExtDB

  MsgBox "Die Tabellen der geschützten Datenbank:" & _
  vbCr & strAusgabe

End Sub

Access 2000 mit ADO:

Sub PWD_Zugriff()

Dim cnnAktDB As ADODB.Connection
Dim catExtDB As New ADOX.Catalog
Dim tblExtDB As ADOX.Table
Dim strAktDBPfad As String
Dim strAusgabe As String

  Set cnnAktDB = CurrentProject.Connection
  strAktDBPfad = cnnAktDB.Properties("Data Source")

  Do While Mid(strAktDBPfad, Len(strAktDBPfad), 1) <> "\"
    strAktDBPfad = Left(strAktDBPfad, _
                   Len(strAktDBPfad) - 1)
  Loop

  catExtDB.ActiveConnection = _
  "Provider=Microsoft.Jet.OLEDB.4.0;" & _
  "Data Source=" & strAktDBPfad & "Sicher.mdb;" & _
  "Jet OLEDB:Database Password=schutz;"

  For Each tblExtDB In catExtDB.Tables
    strAusgabe = strAusgabe & tblExtDB.Name & vbCr
  Next tblExtDB

  MsgBox "Die Tabellen der geschützten Datenbank:" & _
  vbCr & strAusgabe

End Sub

Voraussetzung für eine fehlerfreie Funktionsweise ist, dass sich die geschützte Datenbank SICHER.MDB im selben Verzeichnis befindet wie die aktuelle Datenbank mit dem Makrocode.

Wichtig: In Access 2000 müssen Sie ausserdem einen Verweis auf die ADOX-Bibliothek herstellen. Dazu wählen Sie im Modul das Menü Extras-Verweise an und aktivieren dann den Eintrag "Microsoft ADO Ext. 2.5 for DDL and Security".

Nun zur Funktionsweise: In beiden Fällen wird zunächst der Name der aktuellen Datenbank ermittelt, was in DAO (Access 97) über das CurrentDB-Objekt geschieht und in ADO (Access 2000) über die "Data Source"-Eigenschaft der Verbindung zum aktuellen Projekt. In der Do-Loop-Schleife wird der Dateiname entfernt, so dass "strAktDBPfad" nur noch den Pfad enthält.

Für den Datenbankzugriff per Kennwort ist dann die folgende Codezeile massgebend. In DAO geben Sie das Kennwort im vierten Parameter der OpenDatabase-Methode als Textstring an:

";pwd=schutz"

In ADO nennen Sie das Kennwort im Rahmen des "ConnectionString" einer Verbindung, hier im Rahmen der ActiveConnection-Eigenschaft des Catalog-Objekts:

"Jet OLEDB:Database Password=schutz;"

Der Rest des VBA-Makros steht dann nur beispielhaft für Aktionen, die Sie an der geschützten Datenbank vornehmen. In diesem Fall ermittelt eine For Each-Next-Schleife die Namen der vorhandenen Tabellen, die am Ende in einem Meldungsfenster ausgegeben werden. Um den Programmcode auszuführen, setzen Sie den Cursor einfach in eine beliebige Zeile des Makros und drücken F5.

 

Tipps "n" Tricks
Anwender-Software - Access