AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Schreibberechtigungen für Verzeichnis und Datei ermitteln

Schreibberechtigungen für Verzeichnis und Datei ermitteln

Ein Thema von Oreaden · begonnen am 12. Nov 2008 · letzter Beitrag vom 14. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2   
Oreaden

Registriert seit: 10. Nov 2008
60 Beiträge
 
#1

Schreibberechtigungen für Verzeichnis und Datei ermitteln

  Alt 12. Nov 2008, 19:49
Hallo Wissende,

ich habe das Problem, dass ich (VOR) dem schreiben in ein Verzeichnis gerne Wissen würde ob dies möglich ist. Gibt es hierfür Möglichkeiten dies herauszufinden, bevor man unsanft darauf hingewiesen wird?

Danke für die Inspiration.
Oreaden
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Schreibberechtigungen für Verzeichnis und Datei ermittel

  Alt 12. Nov 2008, 19:59
Jupp, gibt es: http://www.michael-puff.de/Developer...ileAccess.html
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Schreibberechtigungen für Verzeichnis und Datei ermittel

  Alt 12. Nov 2008, 20:01
Oder etwas pragmatischer:

Delphi-Quellcode:
function IsFileWriteable(FileName : WideString) : Boolean;
var
  FileHandle : THandle;
begin
  FileHandle := CreateFileW(PWideChar(FileName), GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_ALWAYS, 0, 0);
  Result := FileHandle <> INVALID_HANDLE_VALUE;
  if Result then
    CloseHandle(FileHandle);
end;
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#4

Re: Schreibberechtigungen für Verzeichnis und Datei ermittel

  Alt 12. Nov 2008, 20:06
Hier im Forum suchenZugriffsrechte
> Zurgiffsrechte bestimmen bzw. testen

Aber ganz sicher ist keine der zu findenden Funktionen, da es schwer möglich ist jede möglich Sperre abzufragen,
also um eine Fehlererkennung wirdst du nicht herrum kommen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Schreibberechtigungen für Verzeichnis und Datei ermittel

  Alt 12. Nov 2008, 20:15
Ich hab die Funktion nur kurz überflogen, aber sicher das AccessCheck ebenfalls die Integrity Level überprüft? Eigentlich checkt es ja nur die ACL. Wenn nicht sollte man in Hinsicht auf Vista die Funktion entsprechend erweitern.
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Schreibberechtigungen für Verzeichnis und Datei ermittel

  Alt 12. Nov 2008, 21:01
Zitat von 0xF30FC7:
Ich hab die Funktion nur kurz überflogen, aber sicher das AccessCheck ebenfalls die Integrity Level überprüft? Eigentlich checkt es ja nur die ACL. Wenn nicht sollte man in Hinsicht auf Vista die Funktion entsprechend erweitern.
Da gibt es nichts zu erweitern. Entweder der ausführende Thread/Prozess hat mit seinem/n aktuellen Token die entsprechende Rechte, oder nicht. Man kann einen Prozess nicht nachträglich im Level anheben (deswegen braucht man dafür Out-of-Process-Server).

Ansonsten: Siehe Diskussion und Funktion von Dezipaitor http://www.delphipraxis.net/internal...=954524#954524
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Schreibberechtigungen für Verzeichnis und Datei ermittel

  Alt 12. Nov 2008, 22:09
Zitat von nicodex:
Zitat von 0xF30FC7:
Ich hab die Funktion nur kurz überflogen, aber sicher das AccessCheck ebenfalls die Integrity Level überprüft? Eigentlich checkt es ja nur die ACL. Wenn nicht sollte man in Hinsicht auf Vista die Funktion entsprechend erweitern.
Da gibt es nichts zu erweitern. Entweder der ausführende Thread/Prozess hat mit seinem/n aktuellen Token die entsprechende Rechte, oder nicht. Man kann einen Prozess nicht nachträglich im Level anheben (deswegen braucht man dafür Out-of-Process-Server).
Mir ist das schon klar. Ich sagte ja auch man soll den Test erweitern um eine explizite Überprüfung der Integrity Level, weil diese meiner Ansicht nach von AccessCheck nicht berücksichtigt werden. Ich hab das Ganze auch mal getestet.

C:\TEST.TXT hat den Integrity Level High. Meine Applikation hat den Integrity Level Medium. Das Testprogramm:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  windows;

// stuff Delphi might not know...
const
  FILE_READ_DATA = $0001; // file & pipe
  FILE_LIST_DIRECTORY = $0001; // directory
  FILE_WRITE_DATA = $0002; // file & pipe
  FILE_ADD_FILE = $0002; // directory
  FILE_APPEND_DATA = $0004; // file
  FILE_ADD_SUBDIRECTORY = $0004; // directory
  FILE_CREATE_PIPE_INSTANCE = $0004; // named pipe
  FILE_READ_EA = $0008; // file & directory
  FILE_WRITE_EA = $0010; // file & directory
  FILE_EXECUTE = $0020; // file
  FILE_TRAVERSE = $0020; // directory
  FILE_DELETE_CHILD = $0040; // directory
  FILE_READ_ATTRIBUTES = $0080; // all
  FILE_WRITE_ATTRIBUTES = $0100; // all
  FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $1FF;
  FILE_GENERIC_READ = STANDARD_RIGHTS_READ or FILE_READ_DATA or FILE_READ_ATTRIBUTES or FILE_READ_EA or SYNCHRONIZE;
  FILE_GENERIC_WRITE = STANDARD_RIGHTS_WRITE or FILE_WRITE_DATA or FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA or
    FILE_APPEND_DATA or SYNCHRONIZE;
  FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE or FILE_READ_ATTRIBUTES or FILE_EXECUTE or SYNCHRONIZE;
  (**)

function CheckAccessToFile(DesiredAccess: DWORD; const FileName: WideString): Boolean;
const
  GenericFileMapping : TGenericMapping = (
    GenericRead: FILE_GENERIC_READ;
    GenericWrite: FILE_GENERIC_WRITE;
    GenericExecute: FILE_GENERIC_EXECUTE;
    GenericAll: FILE_ALL_ACCESS
    );
var
  LastError : DWORD;
  LengthNeeded : DWORD;
  SecurityDescriptor : PSecurityDescriptor;
  ClientToken : THandle;
  AccessMask : DWORD;
  PrivilegeSet : TPrivilegeSet;
  PrivilegeSetLength : DWORD;
  GrantedAccess : DWORD;
  AccessStatus : BOOL;
begin
  Result := False;
  LastError := GetLastError;
  if not GetFileSecurityW(PWideChar(FileName), OWNER_SECURITY_INFORMATION or
    GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, nil, 0,
    LengthNeeded) and (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
    Exit;
  SetLastError(LastError);
  Inc(LengthNeeded, $1000);
  SecurityDescriptor := PSecurityDescriptor(LocalAlloc(LPTR, LengthNeeded));
  if not Assigned(SecurityDescriptor) then
    Exit;
  try
    if not GetFileSecurityW(PWideChar(FileName), OWNER_SECURITY_INFORMATION or
      GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION,
      SecurityDescriptor, LengthNeeded, LengthNeeded) then
      Exit;
    if not ImpersonateSelf(SecurityImpersonation) then
      Exit;
    try
      if not OpenThreadToken(GetCurrentThread, TOKEN_QUERY or
        TOKEN_IMPERSONATE or TOKEN_DUPLICATE, False, ClientToken) then
        Exit;
      try
        AccessMask := DesiredAccess;
        MapGenericMask(AccessMask, GenericFileMapping);
        PrivilegeSetLength := SizeOf(TPrivilegeSet);
        if AccessCheck(SecurityDescriptor, ClientToken, AccessMask,
          GenericFileMapping, PrivilegeSet, PrivilegeSetLength, GrantedAccess,
          AccessStatus) then
          Result := AccessStatus;
      finally
        CloseHandle(ClientToken);
      end;
    finally
      RevertToSelf;
    end;
  finally
    LocalFree(HLOCAL(SecurityDescriptor));
  end;
end;

function IsFileWritable(FileName : WideString) : Boolean;
var
  FileHandle : THandle;
begin
  FileHandle := CreateFileW(PWideChar(FileName), GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_ALWAYS, 0, 0);
  Result := FileHandle <> INVALID_HANDLE_VALUE;
  if Result then
    CloseHandle(FileHandle);
end;

const
  Filename : widestring = 'c:\test.txt';

begin
  writeln('CheckAccessToFile: ', CheckAccessToFile(GENERIC_WRITE, Filename));
  writeln('IsFileWritable: ', IsFileWritable(Filename));
  readln;
end.
Das Ergebnis:
http://img520.imageshack.us/img520/3...eaccessxa7.png

Das bestärkt um ehrlich zu sein meinen Verdacht, daß AccessCheck Integrity Level nicht berücksichtigt und die von Luckie gepostete Funktion um einen Integrity Level Check erweitert werden sollte. Falls Integrity Level Checks doch durchgeführt werden sollten bei AccessCheck wie Du sagst, frag ich mich, wie es zu dem Ergebnis kommt.

EDIT: Sobald der Integrity Level von C:\TEST.TXT wieder auf Medium gesetzt ist, geben beide Funktionen übrigens wieder identische Ergebnisse aus.
Fridolin Walther
  Mit Zitat antworten Zitat
Dezipaitor

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

Re: Schreibberechtigungen für Verzeichnis und Datei ermittel

  Alt 12. Nov 2008, 23:39
Du musst bei GetFileSecuriy noch LABEL_SECURITY_INFORMATION anngeben.
Ich weiß grad nicht, was dann aber in XP passiert. Könnte ein Fehler geben.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Volle

Registriert seit: 25. Nov 2003
Ort: Stuttgart
100 Beiträge
 
Delphi 7 Personal
 
#9

Re: Schreibberechtigungen für Verzeichnis und Datei ermittel

  Alt 13. Nov 2008, 06:32
wenn man es zuvor definiert dann gibts keinen fehler unter XP.
Leider is es eigentlich nur in der vista sdk drin wenn ich mich nicht irre.

Kann aber hier nich testen obs den gewuenschten erfolg bringt.
cYa n' sTay [ S ! C ]
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Schreibberechtigungen für Verzeichnis und Datei ermittel

  Alt 13. Nov 2008, 08:47
Zitat von 0xF30FC7:
Das bestärkt um ehrlich zu sein meinen Verdacht, daß AccessCheck Integrity Level nicht berücksichtigt und die von Luckie gepostete Funktion um einen Integrity Level Check erweitert werden sollte.
Ich hatte dich falsch verstanden. Deine Einwände sind korrekt und CheckAccessToFile() sollte für Vista um LABEL_SECURITY_INFORMATION erweitert werden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:09 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