Partager via


Vérification de l’accès client avec des listes de contrôle d’accès en C++

L’exemple suivant montre comment un serveur peut vérifier les droits d’accès qu’un descripteur de sécurité autorise pour un client. L’exemple utilise la fonction ImpersonateNamedPipeClient ; toutefois, elle fonctionnerait de la même façon à l’aide de l’une des autres fonctions d’emprunt d’identité. Après l’emprunt d’identité du client, l’exemple appelle la fonction OpenThreadToken pour obtenir le jeton d’emprunt d’identité. Ensuite, il appelle la fonction MapGenericMask pour convertir les droits d’accès génériques en droits spécifiques et standard correspondants en fonction du mappage spécifié dans la structure GENERIC_MAPPING .

La fonction AccessCheck vérifie les droits d’accès demandés par rapport aux droits autorisés pour le client dans la liste de contrôle d’accès du descripteur de sécurité. Pour vérifier l’accès et générer une entrée dans le journal des événements de sécurité, utilisez la fonction AccessCheckAndAuditAlarm .

#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;
}