Bagikan melalui


Memverifikasi Akses Klien dengan ACL di C++

Contoh berikut menunjukkan bagaimana server dapat memeriksa hak akses yang diizinkan deskriptor keamanan untuk klien. Contohnya menggunakan fungsi ImpersonateNamedPipeClient ; namun, itu akan bekerja sama menggunakan salah satu fungsi peniruan lainnya. Setelah meniru klien, contoh memanggil fungsi OpenThreadToken untuk mendapatkan token peniruan. Kemudian, ia memanggil fungsi MapGenericMask untuk mengonversi hak akses generik apa pun ke hak khusus dan standar yang sesuai sesuai dengan pemetaan yang ditentukan dalam struktur GENERIC_MAPPING .

Fungsi AccessCheck memeriksa hak akses yang diminta terhadap hak yang diizinkan untuk klien di DACL pendeskripsi keamanan. Untuk memeriksa akses dan menghasilkan entri di log peristiwa keamanan, gunakan fungsi 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;
}