Berücksichtigung von Benutzerrechten
Verzeichnisrechte
Was darf ein normaler Benutzer von Windows 7 und was nicht? Z.B. darf er nicht auf C:\Programme schreibend zugreifen, wo Anwendungen standardmäßig installiert werden. Daraus folgen zwei Dinge:
- Für Installationen werden Admin-Rechte benötigt – dazu später mehr.
- Es ist nicht mehr möglich, Einstellungsdateien direkt neben der Anwendung zu speichern, wenn sie zur Laufzeit veränderbar sein sollen.
Aber was ist die Alternative? Dazu müssen wir uns erst einmal die möglichen Anwendungsfälle anschauen. Welche Daten könnte eine Anwendung zur Laufzeit schreiben wollen?
- Einstellungen, die nur den Benutzer betreffen, der die Anwendung gerade gestartet hat. Jeder Windows-Benutzer soll also seine eigenen Einstellungen für diese Anwendung haben.
- Einstellungen, die von allen Benutzern des PCs gemeinsam verwendet werden können sollen (z.B. ein gespeicherter Registrierschlüssel, der von jedem Benutzer eingegeben und von allen verwendet werden kann, damit ihn nicht jeder einzelne Anwender erneut eingeben muss).
- Dateien, die der Benutzer mit der Anwendung erzeugt, die er aber nicht mit den anderen Benutzern teilen will.
- Dateien, die alle Benutzer des PCs mit der Anwendung öffnen und speichern wollen.
Es gibt also zwei Aspekte, die hier unterschieden werden: Handelt es sich um Dateien, die der Benutzer bewusst öffnet und speichert oder handelt es sich lediglich um Einstellungsdateien, von deren Existenz der Benutzer normalerweise nichts mitbekommt? Und zum Zweiten: Bezieht sich eine Datei nur auf den aktuell angemeldeten Benutzer oder auf alle Benutzer des PCs?
Für jeden dieser vier Fälle hat Microsoft ein eigenes Verzeichnis vorgesehen.
Das sind die folgenden:
Bezeichnung | Beispiel | Zugriff | Sichtbarkeit |
Eigene Dokumente | C:\Users\<user>\Documents | Nur Benutzer <user> | Sichtbar |
Öffentliche Dokumente | C:\Users\Public\Documents | Alle Benutzer | Sichtbar |
Eigene Einstellungen | C:\Users\<user>\AppData\Roaming | Nur Benutzer <user> | Versteckt, geeignet für Konfiguration |
Öffentliche Einstellungen | C:\ProgramData | Alle Benutzer | Versteckt, geeignet für Konfiguration |
Pfade ermitteln
Natürlich ist es eine schlechte Idee, o.g. Verzeichnisnamen direkt im Quellcode zu verwenden. Denn jeder Benutzer ist frei, sein Windows auch auf Festplatte D zu installieren.
Windows bietet eine Möglichkeit, die Pfade zu ermitteln. Dabei wird automatisch berücksichtigt, welcher Benutzer momentan eingeloggt ist. Die Funktion dafür heißt „ShGetSpecialFolderLocation“. Aus einer Delphi-Anwendung ruft man sie so auf:
uses ShlObj, ActiveX, ShellApi; procedure ShowSpecialFolder(const AFolder: Integer); var ItemIDList: PItemIDList; hPath: PChar; ShellH: IMalloc; begin if Succeeded(SHGetSpecialFolderLocation(Application.Handle, AFolder, ItemIDList)) then begin try hPath:= StrAlloc(max_path); try if SHGetPathFromIDList(ItemIDList, hPath) then Result:=hPath; finally StrDispose(hPath); end; finally if SHGetMalloc(ShellH) = NOERROR then ShellH.Free(ItemIDList); end; end else RaiseLastOSError; end;
Beim Aufruf obiger Funktion muss die Identifikation des Ordner (sog. CSIDL = Constant Special Item ID List) mitgegeben werden. Für jedes Verzeichnis aus obiger Tabelle gibt es eine solche ID:
Verzeichnis | CSIDL |
Eigene Einstellungen | CSIDL_APPDATA |
Öffentliche Einstellungen | CSIDL_COMMON_APPDATA |
Öffentliche Dokumente | CSIDL_COMMON_DOCUMENTS |
Eigene Dokumente | CSIDL_PERSONAL |
Diese CSIDLs sind in der Unit ShlObj als Konstanten deklariert, können also ohne Probleme verwendet werden.
Somit haben wir schon einmal sichergestellt, dass Dateien nur in Verzeichnissen gespeichert werden, in denen der Anwender auch Schreibrechte hat.