Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   CheckFileAccess für beliebiegen Benutzer (https://www.delphipraxis.net/72028-checkfileaccess-fuer-beliebiegen-benutzer.html)

Luckie 24. Jun 2006 03:46


CheckFileAccess für beliebiegen Benutzer
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

Luckie 25. Jun 2006 23:45

Re: CheckFileAccess für beliebiegen Benutzer
 
Ja, da muss ich dann doch mal dezent den Beitrag wieder nach oben holen.

NicoDE 26. Jun 2006 08:36

Re: CheckFileAccess für beliebiegen Benutzer
 
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:

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

Luckie 26. Jun 2006 10:13

Re: CheckFileAccess für beliebiegen Benutzer
 
Zitat:

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:

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.

NicoDE 26. Jun 2006 10:38

Re: CheckFileAccess für beliebiegen Benutzer
 
Zitat:

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:

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:

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.

Luckie 26. Jun 2006 11:05

Re: CheckFileAccess für beliebiegen Benutzer
 
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

NicoDE 26. Jun 2006 11:41

Re: CheckFileAccess für beliebiegen Benutzer
 
Ein paar Anregungen zum Thema 'effektive Berechtigungen' mittels SID:
ps: und siehe Kommentare unter:
http://www.microsoft.com/technet/pro....mspx?mfr=true

Luckie 26. Jun 2006 11:45

Re: CheckFileAccess für beliebiegen Benutzer
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz