Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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;
}