Überprüfen des Clientzugriffs mit ACLs in C++

Das folgende Beispiel zeigt, wie ein Server die Zugriffsrechte überprüfen kann, die ein Sicherheitsdeskriptor für einen Client zulässt. Im Beispiel wird die Funktion ImpersonateNamedPipeClient verwendet. Es würde jedoch mit einer der anderen Identitätswechselfunktionen genauso funktionieren. Nach dem Identitätswechsel des Clients ruft das Beispiel die OpenThreadToken-Funktion auf, um das Identitätswechseltoken abzurufen. Anschließend wird die MapGenericMask-Funktion aufgerufen, um alle generischen Zugriffsrechte gemäß der in der GENERIC_MAPPING-Struktur angegebenen Zuordnung in die entsprechenden spezifischen und Standardrechte zu konvertieren.

Die AccessCheck-Funktion überprüft die angeforderten Zugriffsrechte anhand der für den Client zulässigen Rechte in der DACL des Sicherheitsdeskriptors. Verwenden Sie die AccessCheckAndAuditAlarm-Funktion , um den Zugriff zu überprüfen und einen Eintrag im Sicherheitsereignisprotokoll zu generieren.

#include <windows.h>
#pragma comment(lib, "advapi32.lib")

BOOL ImpersonateAndCheckAccess(
  HANDLE hNamedPipe,               // handle of pipe to impersonate
  PSECURITY_DESCRIPTOR pSD,        // security descriptor to check
  DWORD dwAccessDesired,           // access rights to check
  PGENERIC_MAPPING pGeneric,       // generic mapping for object
  PDWORD pdwAccessAllowed          // returns allowed access rights
) 
{
   HANDLE hToken;
   PRIVILEGE_SET PrivilegeSet;
   DWORD dwPrivSetSize = sizeof( PRIVILEGE_SET );
   BOOL fAccessGranted=FALSE;

// Impersonate the client.

   if (! ImpersonateNamedPipeClient(hNamedPipe) ) 
      return FALSE;

// Get an impersonation token with the client's security context.

   if (! OpenThreadToken( GetCurrentThread(), TOKEN_ALL_ACCESS,
         TRUE, &hToken ))
   {
      goto Cleanup;
   }

// Use the GENERIC_MAPPING structure to convert any 
// generic access rights to object-specific access rights.

   MapGenericMask( &dwAccessDesired, pGeneric );

// Check the client's access rights.

   if( !AccessCheck( 
      pSD,                 // security descriptor to check
      hToken,              // impersonation token
      dwAccessDesired,     // requested access rights
      pGeneric,            // pointer to GENERIC_MAPPING
      &PrivilegeSet,       // receives privileges used in check
      &dwPrivSetSize,      // size of PrivilegeSet buffer
      pdwAccessAllowed,    // receives mask of allowed access rights
      &fAccessGranted ))   // receives results of access check
   {
      goto Cleanup;
   }

Cleanup:

   RevertToSelf();

   if (hToken != INVALID_HANDLE_VALUE)
      CloseHandle(hToken);  

   return fAccessGranted;
}