Christoph Jüngling, https://www.juengling-edv.de
Das in diesem Artikel beschriebene Konzept hat das Ziel, die Registrierung des Installationsverzeichnisses als vertrauenswürdigen Speicherort zu automatisieren. Dadurch entfällt die Notwendigkeit für den Anwender, dies in Access selbst einzutragen. Vor allem vermeiden wir durch die spezifische Festlegung nur eines Verzeichnisses als vertrauenswürdig das Risiko, dass der Anwender unnötig viele Unterverzeichnisse quasi nebenher als vertrauenswürdig einstuft (was sie vielleicht nicht sein sollten).
Automatisierung des Eintrags für die vertrauenswürdigen Speicherorte
Das Konzept der „vertrauenswürdigen Speicherorte“ ist seit längerem für (meines Wissens) alle Office-Programme von Microsoft gängig. Wie schon im vorherigen Artikel erläutert, möchte Microsoft damit verhindern, dass irgendeine Datei mit VBA-Code auf unsere Festplatte gelangt und ohne weitere Kontrolle ausgeführt wird.
Ich habe von Leuten gehört, die der Einfachheit halber C:\ und alle Unterverzeichnisse als vertrauenswürdig einstufen, aber das scheint mir ein scheunentorgroßes Loch in die Sicherheit unseres Rechners zu schlagen. Jedes Verzeichnis, auch das Standardverzeichnis für temporäre Dateien, würde es dann erlauben, dass VBA-Makros ausgeführt werden! Das kann nicht in unserem Sinne sein.
Bei Word und Excel zum Beispiel gibt es einen Trick: die digitale Signatur von VBA-Makros. Diese sichert die VBA-Makros der betreffenden Datei einerseits gegen Veränderungen ab, andererseits macht sie den Autor des Makros überprüfbar.
In Verbindung mit der Einstellung Alle Makros außer digital signierten deaktivieren (siehe Bild 1) erhält man so die Möglichkeit, die Makros aus dem eigenen Haus aktiv zu lassen, alle anderen jedoch zu blockieren.
Bild 1: Trustcenter-Einstellung für VBA-Makros
Leider funktioniert die Verwendung einer digitalen Signatur für die VBA-Makros in Access nicht. Deshalb sind wir auf die korrekte Konfiguration der vertrauenswürdigen Speicherorte angewiesen.
Einen vertrauenswürdigen Speicherort eintragen
Schauen wir uns das zunächst bei den Einstellungen von Access an. Das ist ein wichtiger Aspekt, denn diese Einstellung kann und muss für jedes Programm und jeden Windows-Useraccount individuell vorgenommen werden.
Öffnen Sie in Access Optionen|Trust Center|Einstellungen für das Trustcenter. Dort finden Sie den Eintrag Vertrauenswürdige Speicherorte. Falls dort bei Ihnen noch nichts steht, tragen Sie ruhig mal ein Verzeichnis ein, wie in Bild 2 gezeigt. Der Haken für die Unterordner muss nicht gesetzt werden, da diese Einstellung nur unsere .accdb-Datei betrifft.
Bild 2: Eingabeformular für einen vertrauenswürdigen Speicherort
Unsere Eingabe wird in der Registry gespeichert, sobald wir die Dialoge mit OK bestätigt haben. Dies erfolgt unter dem Pfad HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Access\Security\Trusted Locations (siehe Bild 3).
Bild 3: Registry-Eintrag eines vertrauenswürdigen Speicherorts
Die einzelnen Einträge erhalten dabei automatisch Namen wie hier im Beispiel Location1. Sobald ein solcher Eintrag von uns gelöscht wird, wird er auch aus der Registry entfernt.
Damit haben wir eine Möglichkeit gefunden, den vertrauenswürdigen Speicherort für unsere eigene Applikation automatisiert einzutragen. Jetzt geht es nur noch darum, das richtige Format zu finden.
Wie man oben sieht, enthält der Registry-Pfad unter anderem die interne Access-Versionsnummer. Da ich diesen Artikel mit Access 2019 vorbereitet habe, steht dort 16.0.
Diese Versionsnummer müssen wir während unserer Setupausführung ermitteln und korrekt verwenden.
Die zweite Aufgabe betrifft die erkennbare Durchnummerierung der Location-Einträge. Doch hier gibt es eine ganz einfache Lösung: Das muss gar nicht sein. Wenn ich probeweise mal einen Eintrag umbenenne, funktioniert alles weiterhin wie gewohnt. Das heißt, dass wir zum Beispiel unsere Konstante {#MyAppName} dafür hernehmen können.
Pascal-Scripting in InnoSetup
Es geht bei InnoSetup schon vieles über die einfachen Einstellungen, aber irgendwann ist halt eine Grenze erreicht. In den Fällen hat InnoSetup ein sehr mächtiges Werkzeug an Bord, auf das wir nun zurückgreifen müssen: Pascal-Scripting.
Was bei Microsoft Office das VBA ist, das ist im Prinzip das Pascal-Scripting für InnoSetup. Es handelt sich im Grunde um ein Konzept, das wir von Access her auch schon kennen.
Denn hier geht es ebenfalls nicht um ein großes Programm, dass das ganze Setup steuert, sondern rein darum, auf bestimmte Ereignisse zu reagieren. Das kann zum Beispiel der Start des Setups sein, oder auch der Zugriff auf bestimmte Werte für den Eintrag in die Registry.
Eingeleitet wird das Scripting durch eine Rubrikenüberschrift [Code], danach wird alles anders. Ab hier gelten die Regeln einer Programmiersprache, die rein zeilenorientierte Schreibweise des bisherigen Scripts gilt nicht mehr. Aus diesem Grunde muss die Code-Rubrik auch immer die letzte im gesamten Script sein!
Welche Funktionen benötigen wir Da ist zunächst, wie gesagt, die aktuelle Access-Version. Diese Funktion nenne ich CurAccVer. Des weiteren finden wir in den Daten in der Registry noch das aktuelle Datum in amerikanischer Schreibweise.
Das wäre zwar ebenfalls nicht besonders notwendig, aber es ist erstens durchaus sinnvoll, und zweitens auch nicht schwer zu ermitteln.
Diese Funktion nenne ich einfach Now. Schauen wir uns zunächst dieses Script an – später erkläre ich dann, wo und wie man diese Funktionen einbindet (siehe Listing 1).
Function CurAccVer(dummy: String): String;
Var
ok: Boolean;
version: String;
position: Integer;
Begin
ok := RegQueryStringValue(HKCR, ''Access.Application\CurVer'', '''', version);
repeat
position := Pos(''.'', version);
if position > 0 then version := Copy(version, position+1, 999);
until position = 0;
Result := version;
End;
Listing 1: Die Funktion CurAccVer
Pascal und seine Besonderheiten gegenüber VB/VBA
Pascal hat bezüglich seiner Programmiersprache andere Formalien als wir es von VB/VBA her gewohnt sind, ist in mancher Hinsicht aber auch wesentlich toleranter. So kann zum Beispiel ein Zeilenvorschub fast überall eingefügt werden. Einrückungen sind ebenfalls nicht zwingend, aber willkommen, weil sie die Lesbarkeit des Programms für uns Menschen erleichtern.
Eine Besonderheit ist das Semikolon am Ende jeder Anweisung, das einige von Ihnen vielleicht auch von C/C++ her kennen.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo