Comprobación del acceso de cliente con ACL en C++
En el ejemplo siguiente se muestra cómo un servidor podría comprobar los derechos de acceso que un descriptor de seguridad permite para un cliente. En el ejemplo se usa la función ImpersonateNamedPipeClient ; sin embargo, funcionaría igual con cualquiera de las otras funciones de suplantación. Después de suplantar al cliente, el ejemplo llama a la función OpenThreadToken para obtener el token de suplantación. A continuación, llama a la función MapGenericMask para convertir los derechos de acceso genéricos a los derechos específicos y estándar correspondientes según la asignación especificada en la estructura de GENERIC_MAPPING .
La función AccessCheck comprueba los derechos de acceso solicitados con los derechos permitidos para el cliente en la DACL del descriptor de seguridad. Para comprobar el acceso y generar una entrada en el registro de eventos de seguridad, use la función 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;
}