Einzelnen Beitrag anzeigen

Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#2

AW: Rechte von Dateien ermitteln

  Alt 12. Nov 2010, 13:55
In 90% der Fälle besitzen Dateien keine eigenen Rechte, sondern bekommen sie vom übergeordneten Ordner vererbt, der sie meistens auch wieder vererbt bekommt.
D.h. meistens reicht es aus, einfach die Rechte des Ordners zu ermitteln.

Wenn du die Rechte ermitteln willst, z.B. mit Getnamedsecurityinfo, dann bekommst du eine Liste, die Discretionary Access Control List (DACL).
Das ist eine Liste mit Benutzer- und Gruppenaccounts, z.B. SYSTEM, Benuter, Administratoren usw. Da gibt es mehrere Typen, jedoch sind Allow und Deny die wichtigsten. Also ob der Zugriff für den Account erlaubt oder verweigert wird.
Jeder Access Control Eintrag (ACE) enthält zudem ein Access Right, das aussagt, welcher Zugriff gestattet ist. Die sind besonders aufgebaut. So können sie generische Rechte enthalten oder spezifische, z.B. GENERIC_ALL oder FILE_READ. Generische Rechte werden auf spezifische gemappt, z.B. GENERIC_WRITE wird zu FILE_GENERIC_WRITE, was wiederum nur ein Platzhalter für (STANDARD_RIGHTS_WRITE or FILE_WRITE_DATA or FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA or FILE_APPEND_DATA or SYNCHRONIZE) ist (aber kein generischer, nur einfacher zu merken).

STANDARD_RIGHTS_WRITE ist eigentlich das Recht READ_CONTROL, welches das Auslesen der Rechte dem Account ermöglicht. WRITE_DAC wäre für das Schreiben der Rechte.

Weiterhin erhält der Besitzer noch zusätzliche Rechte, die ihm immer WRITE_DAC ermöglichen, auch wenn er nach der DACL kein Zugriff hätte.

Delphi-Quellcode:
type
  TRight = rNone, rRead, rReadWrite;

function GetFileRight(Filename: string): TRight;
function GetFileRightGroupName(Filename: string): string;
Um nun die Rechte des aktuellen Prozesses an einer Datei zu erfahren (GetFileRight), muss man eine spezielle Zugriffsprüfung mit dem Pseudorecht MAXIMUM_ALLOWED durchführen. D.h. man muss die Funktion AccessCheck aufrufen, die dann zurückliefert, welche Rechte man besitzt. Es gibt auch noch GetEffectiveAccessRights, welche jedoch nicht für alle Fälle das korrekte Resultat liefert. Dies geht für jeden Benutzer, dessen Token man besitzt. Will man dies für eine beliebigen Account durchführen, muss man diesen anmelden, denn manche Accounts, besonders in Domains, können zusätzliche Gruppen zugewiesen bekommen. Mit der AuthZ API (ab XP) kann man dies jedoch auch für beliebige Accounts machen, jedoch ist dann das Ergebnis nicht immer 100% deckend mit einem eingeloggten Account.

Das Ermitteln der Gruppe mit GetFileRightGroupName ist, nach meiner Ansicht, nicht einfach zu machen. Dazu muss man die Schnittmenge der eigenen Gruppen (eigener Account eingeschlossen) mit denen der DACL ermitteln. Da Gruppen jedoch auch verschachtelt sein können, kann das kompliziert werden.


Mit JWSCL kommt man übrigens für das erste Problem schneller voran:
http://blog.delphi-jedi.net/2010/03/...lder-security/
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat