AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) CheckFileAccess für beliebiegen Benutzer
Thema durchsuchen
Ansicht
Themen-Optionen

CheckFileAccess für beliebiegen Benutzer

Ein Thema von Luckie · begonnen am 24. Jun 2006 · letzter Beitrag vom 26. Jun 2006
Antwort Antwort
Benutzerbild von Luckie
Luckie

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

CheckFileAccess für beliebiegen Benutzer

  Alt 24. Jun 2006, 02:46
Hier habe ich das Thema schon mal angesprochen http://www.delphipraxis.net/internal...=568183#568183, bin aber dort einen anderen Weg gegangen bzw, dort will ich eigentlich die ACEs aus der ACL auslesen.

Trotzdem interessiert es mich, wie man auch die Zugriffsrechte für andere Benutzer ermitteln kann. Mit diesen Code von Nico:
Delphi-Quellcode:
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;
Geht es nur für den angemeldeten Benutzer, weil das ProzessToken gebraucht wird. Und das Problem ist jetzt, dass man für einen anderen Benutzer kein ProzessToken heranziehen kann, um dieses mit der DACL abzugleichen mittels AccessCheck. Gibt es jetzt irgendetwas vergleichbares, was man statt dessen nehmen könnte? Und wenn ja was und wie geht das? Windows schafft es ja auch in dem Seitenreiter "Sicherheit" vom Eigenschaftendialog.

Im Anhang mal meine aktuelle Demo.
Angehängte Dateien
Dateityp: zip fileaccess_192.zip (12,2 KB, 17x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: CheckFileAccess für beliebiegen Benutzer

  Alt 25. Jun 2006, 22:45
Ja, da muss ich dann doch mal dezent den Beitrag wieder nach oben holen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: CheckFileAccess für beliebiegen Benutzer

  Alt 26. Jun 2006, 07:36
Die SID alleine dürfte nicht reichen, da die Sicherheitsbeschreibung auch Gruppen enthalten kann. Man müsste man also auch noch die Gruppenzugehörigkeit der SID auflösen.

edit:
Zitat von Luckie:
Windows schafft es ja auch in dem Seitenreiter "Sicherheit" vom Eigenschaftendialog.
Dort werden 'nur' die Daten der Sicherheitsbeschreibung angezeigt. Die Schnittstelle für diesen Dialog ist von Microsoft veröffentlicht worden:
http://windowssdk.msdn.microsoft.com.../ms717879.aspx
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: CheckFileAccess für beliebiegen Benutzer

  Alt 26. Jun 2006, 09:13
Zitat von NicoDE:
Man müsste man also auch noch die Gruppenzugehörigkeit der SID auflösen.
Wäre denn das so kompliziert?

Zitat:
edit:
Zitat von Luckie:
Windows schafft es ja auch in dem Seitenreiter "Sicherheit" vom Eigenschaftendialog.
Dort werden 'nur' die Daten der Sicherheitsbeschreibung angezeigt. Die Schnittstelle für diesen Dialog ist von Microsoft veröffentlicht worden:
http://windowssdk.msdn.microsoft.com.../ms717879.aspx
Hm und wie bekomme ich eine Propertypage auf ein normales Fenster? Wobei das größere Problem wohl eher dieses ISecurityInformation Interface ist.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#5

Re: CheckFileAccess für beliebiegen Benutzer

  Alt 26. Jun 2006, 09:38
Zitat von Luckie:
Wäre denn das so kompliziert?
Nun, was willst Du eigentlich machen. Wir reden über zwei Ansätze. a) Anzeige der Informationen einer Sicherheitsbeschreibung (wirst du wohl selbst implementieren müssen). b) ein Token gegen eine Sicherheitsbeschreibung testen (woher du das Token bekommst, ist die nächste Frage - LogonUser?).

Zitat von Luckie:
Hm und wie bekomme ich eine Propertypage auf ein normales Fenster?
Die Frage stellt sich mir nicht. EditSecurity ist dafür da, den Standard-Dialog anzuzeigen.

Zitat von Luckie:
Wobei das größere Problem wohl eher dieses ISecurityInformation Interface ist.
Ein Problem ist es eigentlich nicht - 'nur' Arbeit die nicht in 5 min erledigt ist.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: CheckFileAccess für beliebiegen Benutzer

  Alt 26. Jun 2006, 10:05
Ich denke, ich will ein Token gegen eine Sicherheitsbeschreibung testen. Weil ich testen will, ob ein beliebiger Benutzer entsprechende Rechte hat.

Aber lassen wir das mal, ich denke, das wird zu aufwendig und ich verweise an der Stelle, wo ich das brauche auf die Seite im MSDN, die du verlinkt hast.

Das Auslesen der ACEs aus der ACL wäre mir wichtiger, weil ich dies unbedingt bräuchte: http://www.delphipraxis.net/internal...=568554#568554 zum
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#7

Re: CheckFileAccess für beliebiegen Benutzer

  Alt 26. Jun 2006, 10:41
Ein paar Anregungen zum Thema 'effektive Berechtigungen' mittels SID:
ps: und siehe Kommentare unter:
http://www.microsoft.com/technet/pro....mspx?mfr=true
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: CheckFileAccess für beliebiegen Benutzer

  Alt 26. Jun 2006, 10:45
Danke noch mal für die Links. Aber wie gesagt, das ist jetzt erstmal nebensächlich geowrden. Priorität hat im Moment das andere Problem mit der DACL.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 10:04 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