C++에서 ACL을 사용하여 클라이언트 액세스 확인
다음 예제에서는 보안 설명자가 클라이언트에 대해 허용하는 액세스 권한을 서버에서 검사 방법을 보여 줍니다. 이 예제에서는 ImpersonateNamedPipeClient 함수를 사용합니다. 그러나 다른 가장 함수를 사용하여 동일하게 작동합니다. 클라이언트를 가장한 후 예제에서는 OpenThreadToken 함수를 호출하여 가장 토큰을 가져옵니다. 그런 다음 MapGenericMask 함수를 호출하여 제네릭 액세스 권한을 GENERIC_MAPPING 구조에 지정된 매핑에 따라 해당 특정 및 표준 권한으로 변환합니다.
AccessCheck 함수는 보안 설명자의 DACL에서 클라이언트에 허용되는 권한에 대해 요청된 액세스 권한을 확인합니다. 액세스 검사 보안 이벤트 로그에 항목을 생성하려면 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;
}