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