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