<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Zugriffsberechtigungen eines Benutzers für eine Datei]]></title><description><![CDATA[<p>Mit Hilfe von AccessCheck kann man überprüfen mittls der DACL, ob bestimmte Zugriffsrechte besitzt oder nicht.</p>
<p>Folgender Code (Delphi) macht dies mit Hilfe des ProzessTokens für den aktuellen Thread:</p>
<pre><code>function CheckAccessToFile(DesiredAccess: DWORD; const FileName: WideString): DWORD;
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 := 0;
  LastError := GetLastError;
  if not GetFileSecurityW(PWideChar(FileName), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or
    DACL_SECURITY_INFORMATION, nil, 0, LengthNeeded) and (GetLastError &lt;&gt; 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 := GrantedAccess;
      finally
        CloseHandle(ClientToken);
      end;
    finally
      RevertToSelf;
    end;
  finally
    LocalFree(HLOCAL(SecurityDescriptor));
  end;
end;
</code></pre>
<p>Aber wie kann ich das für jeden beliebigen Benutzer machen, so wie es auch Windows kann? Ich habe schon das MSDN durchwühlt und auch schon Google bemüht, aber leider nichts gefunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/151219/zugriffsberechtigungen-eines-benutzers-für-eine-datei</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Jul 2026 20:23:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/151219.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Jun 2006 23:57:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zugriffsberechtigungen eines Benutzers für eine Datei on Fri, 23 Jun 2006 23:57:22 GMT]]></title><description><![CDATA[<p>Mit Hilfe von AccessCheck kann man überprüfen mittls der DACL, ob bestimmte Zugriffsrechte besitzt oder nicht.</p>
<p>Folgender Code (Delphi) macht dies mit Hilfe des ProzessTokens für den aktuellen Thread:</p>
<pre><code>function CheckAccessToFile(DesiredAccess: DWORD; const FileName: WideString): DWORD;
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 := 0;
  LastError := GetLastError;
  if not GetFileSecurityW(PWideChar(FileName), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or
    DACL_SECURITY_INFORMATION, nil, 0, LengthNeeded) and (GetLastError &lt;&gt; 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 := GrantedAccess;
      finally
        CloseHandle(ClientToken);
      end;
    finally
      RevertToSelf;
    end;
  finally
    LocalFree(HLOCAL(SecurityDescriptor));
  end;
end;
</code></pre>
<p>Aber wie kann ich das für jeden beliebigen Benutzer machen, so wie es auch Windows kann? Ich habe schon das MSDN durchwühlt und auch schon Google bemüht, aber leider nichts gefunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1084298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1084298</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 23 Jun 2006 23:57:22 GMT</pubDate></item></channel></rss>