AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rechte von Dateien ermitteln

Ein Thema von MaBuSE · begonnen am 12. Nov 2010 · letzter Beitrag vom 15. Nov 2010
Antwort Antwort
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Rechte von Dateien ermitteln

  Alt 12. Nov 2010, 13:13
Hallo,
nach einigem Suchen und nichts passendem Finden frage ich Euch:

Folgendes Problem:
Ich habe in einem Verzeichnis x Dateien (oder Verzeichnisse)

Ich müsste nun ermitteln, ob ich auf diese Dateien Zugriff habe.
Code:
z.B.
Datei1 - kein Zugriff
Datei2 - nur Lesen
Datei3 - Lesen und Schreiben
Ich möchte es nicht "ausprobieren" in dem ich die Dateien öffnen, es gibt ja APIs um die Rechte auszulesen.

Der 2. Schritt wäre herauszufinden, warum man Zugriff hat.
Also die globale Gruppe zu ermitteln, der man angehört und die entsprechende Rechte auf die Datei
definiert.

Ziel ist es eine Funktion zu schreiben, die die Rechte zurückgibt:
Delphi-Quellcode:
type
  TRight = rNone, rRead, rReadWrite;

function GetFileRight(Filename: string): TRight;
function GetFileRightGroupName(Filename: string): string;
Kann jemand helfen?

Danke im Voraus
MaBuSE
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
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
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#3

AW: Rechte von Dateien ermitteln

  Alt 12. Nov 2010, 15:43
Um die echten Rechte im Stringformat zu ermitteln, gibt es aber tatsächlich seit Windows 2000 eine Methode.

Siehe: MSDN-Library durchsuchenConvertSecurityDescriptorToStringSecurityDescripto r und MSDN-Library durchsuchenConvertStringSecurityDescriptorToSecurityDescripto r (<-- noch'n Bug bei den MSDN-Tags und den ersten hat noch nichtmal jemand angenommen, da sollte kein Leerzeichen vor'm letzten "r" sein)

Daß das Ermitteln nicht trivial ist, da kann ich mich nur anschließen. Um ehrlich zu sein, besteht, selbst wenn du es jetzt richtig hinbekämst aus den DACLs das effektive Recht zu ermitteln, noch immer die Gefahr, daß sich eben diese Regeln ändern, solltest du es selber basteln (home-made).

Es gäbe da noch Bei Google suchenNtAccessCheck und Freunde, aber die sind native APIs und schlecht bis garnicht dokumentiert. Aber die kommen am nächsten an das was du vorzuhaben scheinst. Glücklicherweise gibt es dafür auch die Win32-Funktion MSDN-Library durchsuchenAccessCheck

Das könntest du zusammen mit der von Christian empfohlenen Bibliothek ziemlich einfach implementieren.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Rechte von Dateien ermitteln

  Alt 12. Nov 2010, 16:26
Erste Vorraussetzung für Dein Vorhaben, ist, daß Du überhaupt das Recht hast, die Rechte zu lesen.
Je nachdem, wer sich um die NTFS-Rechtevergabe kümmert, können so interessante Konstellationen auftreten wie: DateiX darf von Benutzer Y gelesen,geschrieben,gelöscht werden und von Benutzer Z nicht. Benutzer Y hat aber keine Rechte auf Verzeichnis U in dem sich Datei X ja befindet. Wenn jetzt nur der Benutzer A den Vollzugriff auf Verzeichnis U und die Datei X hatte, dieser aber das Unternehmen vor 2 Monaten verlassen hat, und die DataAdmin Gruppe dummer Weise nicht zugelassen wurde, dann hat man sich eine echte Leiche gebastelt.

Aber Spaß beiseite, wenn ich mich richtig erinnere könntest Du bei Lucky fündig werden, ich glaube das Stichwort hieß DumpACL.

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.
Das kommt sehr auf die Benutzer an. Solange die Datei neu erstellt wird oder kopiert wird, funktioniert das. Aber sobald ein "MOVE" genutzt wird, dann wandern die orignären Rechte auch mit, und wenn dann der "Besitzer" verschollen ist...
Ich habe übrigens schon Dateien gesehen, die ererbte Rechte besaßen, wo der Vererber diese Rechte nicht (mehr) hatte.
(irgendwo ergibt sich natürlich immer ein Adminhintertürchen)
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#5

AW: Rechte von Dateien ermitteln

  Alt 12. Nov 2010, 17:12
Erste Vorraussetzung für Dein Vorhaben, ist, daß Du überhaupt das Recht hast, die Rechte zu lesen.
Genau deswegen geht hier ja auch Probieren über Studieren. Also echt entweder das Objekt per MSDN-Library durchsuchenAccessCheck (oder im KM MSDN-Library durchsuchenSeAccessCheck) auf Zugriffsmöglichkeiten testen oder öffnen und ggf. einen Fehler melden.

Benutzer Y hat aber keine Rechte auf Verzeichnis U in dem sich Datei X ja befindet.
Das ist bei den Standardinstallationen Unsinn, siehe MSDN-Library durchsuchenSeChangeNotifyPrivilege.

NB: man unterscheide keine Rechte und Zugriff verweigern!

[...] dann hat man sich eine echte Leiche gebastelt.
Nicht wirklich. Es gibt ja noch Backup-Privilegien.

Aber ohnehin ist es am besten sowas nicht selber nachzuprogrammieren sondern sich auf das vom System vorgegebene zu verlassen. Da kann man zumindest erstmal annehmen, daß es konsistentes Verhalten produziert (auch wenn das in Wirklichkeit nicht immer der Fall sein mag).
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Rechte von Dateien ermitteln

  Alt 12. Nov 2010, 19:48
Vorsicht, beim Verschienben ist das so eine Sache mit dem Rechten: http://www.michael-puff.de/Artikel/Z...schieben.shtml

Und hier mein Artikel zum Thema mit dem genannten Demo: http://www.michael-puff.de/Artikel/DACL.shtml
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dezipaitor

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

AW: Rechte von Dateien ermitteln

  Alt 13. Nov 2010, 13:41
Ich habe übrigens schon Dateien gesehen, die ererbte Rechte besaßen, wo der Vererber diese Rechte nicht (mehr) hatte.
Du meinst, z.B. eine Datei besitzt einen DACL Eintrag, der im SecurityEditor als vererbt angezeigt wird, jedoch der garnicht im übergeordneten Ordner existiert?
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Rechte von Dateien ermitteln

  Alt 15. Nov 2010, 12:21
Ich danke allen für die Antworten.
Ich werde mich heute damit beschäftigen und mir eine entsprechende Funktion bauen.

Assarbad gab mir den richtigen Hinweis Hier im Forum suchenAccessCheck

Ich denke der von Dezipaitor überarbeitete Quelltext von Nico wird mir weiterhelfen.
-> http://www.delphipraxis.net/122461-z...zw-testen.html
( @ Luckie: Der Link in dem Beitrag (#2) zu Deiner Homepage ist "broken". Aus ...\Developer\... wurde ...\Programmierung\...)

Hier noch ein Hinweis in eigener Sache

Warum benötige ich sowas: http://www.delphipraxis.net/155968-r...chnisbaum.html

Vielleicht hat jemand von Euch eine Idee wie man es besser machen könnte.
Wäre schön, wenn Ihr den Betrag lesen würdet.

Vielen Dank.
MaBuSE
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Rechte von Dateien ermitteln

  Alt 15. Nov 2010, 12:42
Ich habe übrigens schon Dateien gesehen, die ererbte Rechte besaßen, wo der Vererber diese Rechte nicht (mehr) hatte.
Du meinst, z.B. eine Datei besitzt einen DACL Eintrag, der im SecurityEditor als vererbt angezeigt wird, jedoch der garnicht im übergeordneten Ordner existiert?
Genau so etwas!
und es funktioniert trotzdem

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Dezipaitor

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

AW: Rechte von Dateien ermitteln

  Alt 15. Nov 2010, 16:46
Ja, da ist das inherited Flag gesetzt. Das kann man machen, aber Windows ermittelt den falschen Vorgänger. Zudem kann es passieren, dass der Editor die ACEs auseinandernimmt und mehrfach darstellt.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz