Home » Tutorials » Object Pascal/RTL » Berücksichtigung von Benutzerrechten

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.