![]() |
Re: Zurgiffsrechte bestimmen bzw. testen
Naja, der Code ist für normale Zwecke gut geeignet.
Der Vorteil eines Threadtokens besteht darin, dass man unabhängig von den Privilegien des Prozesstokens arbeiten kann. So kann kein anderer Thread Privilegien ändern, so dass im aktuellen Thread eine Ausführung deshalb scheitert. Das Problem, dass ich jedoch hier sehe, ist dass jemand "Unerfahrener", diesen Code in einem Service einsetzt, der vorher einen Benutzer personifiziert. D.h. also, dass der Code im Service mit ImpersonateSelf das gesetze Threadtoken durch das SYSTEM Token ersetzt und so andere Zugänge schafft. Ich weiß, dass es sich um ein Beispiel handelt. Aber ich weiß auch, dass (auf den ersten Blick) funktionierende Beispiele immer gern 1:1 übernommen werden ohne weiter darüber nachzudenken. |
Re: Zurgiffsrechte bestimmen bzw. testen
Zitat:
Zudem gibt es genug Beispiele dafür, wie man auf Serverseite als Client "handelt". ![]() |
Re: Zurgiffsrechte bestimmen bzw. testen
Mir ist grad eingefallen, dass das ClientToken vom Typ "impersonate/thread token" sein muss. Sonst schlägt AccessCheck fehl (1309). D.h. man müsste das Prozesstoken erstmal duplizieren (impersonate) und dann an AccessCheck übergeben. ImpersonateSelf macht aber genau das und zudem verändert es das ThreadToken. D.h. nach dem AccessCheck müsste man es wieder zurücksetzen, sonst fährt man z.B. mit SYSTEM. D.h. ein Zurücksetzen sollte nur gemacht werden, wenn vorher kein Threadtoken existierte.
|
Re: Zurgiffsrechte bestimmen bzw. testen
Ich habe das mal angepasst, so dass man durch setzen des Threadtokens ein AccessCheck machen kann.
Delphi-Quellcode:
uses
JwaWindows; var GenericFileMapping : TGenericMapping = ( GenericRead: FILE_GENERIC_READ; GenericWrite: FILE_GENERIC_WRITE; GenericExecute: FILE_GENERIC_EXECUTE; GenericAll: FILE_ALL_ACCESS ); function CheckAccessToFile(DesiredAccess: DWORD; const FileName: WideString; const OpenAsSelf : Boolean = true): Boolean; var LengthNeeded : DWORD; SecurityDescriptor : PSecurityDescriptor; ClientToken2, ClientToken : THandle; AccessMask : DWORD; PrivilegeSet : TPrivilegeSet; PrivilegeSetLength : DWORD; GrantedAccess : DWORD; AccessStatus : BOOL; begin Result := False; SetLastError(0); 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; GetMem(SecurityDescriptor, LengthNeeded); try if not GetFileSecurityW(PWideChar(FileName), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, SecurityDescriptor, LengthNeeded, LengthNeeded) then Exit; //first try token assigned to the current thread if not OpenThreadToken(GetCurrentThread, TOKEN_QUERY or TOKEN_IMPERSONATE or TOKEN_DUPLICATE, OpenAsSelf, ClientToken) then begin //otherwise use process token if (GetLastError() = ERROR_NO_TOKEN) and (not OpenProcessToken(GetCurrentProcess, TOKEN_QUERY or TOKEN_IMPERSONATE or TOKEN_DUPLICATE, ClientToken)) then Exit; //convert to thread token. if not DuplicateToken(ClientToken, SecurityImpersonation, @ClientToken2) then exit; //close process token and switch them for further processing CloseHandle(ClientToken); ClientToken := ClientToken2; end; AccessMask := DesiredAccess; MapGenericMask(AccessMask, GenericFileMapping); PrivilegeSetLength := SizeOf(TPrivilegeSet); if AccessCheck(SecurityDescriptor, ClientToken, AccessMask, GenericFileMapping, PrivilegeSet, PrivilegeSetLength, GrantedAccess, AccessStatus) then Result := AccessStatus; CloseHandle(ClientToken); finally FreeMem(SecurityDescriptor); end; end; |
AW: Re: Zurgiffsrechte bestimmen bzw. testen
Zitat:
Welche Funktion genau hat OpenAsSelf. Aus der Beschreibung im MSDN werde ich nicht ganz schlau: True - Rechte vom Prozess werden ausgelesen False - Rechte vom Thread werden ausgelesen Aber mit der Beschreibung darunter kann ich nichts anfangen. Ohne diesen Parameter (also Parameter = False -> Rechte vom Thread) kann er nicht auf das access Token des Theads zugreifen ??? Bahnhof :stupid: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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-2025 by Thomas Breitkreuz