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.