C++에서 권한 사용 및 사용 안 함
액세스 토큰에서 권한을 사용하도록 설정하면 프로세스에서 이전에는 수행할 수 없었던 시스템 수준 작업을 수행할 수 있습니다. 애플리케이션은 특히 다음과 같은 강력한 권한에 대해 권한이 계정 유형에 적합한지 철저히 확인해야 합니다.
권한 상수 | 문자열 값 | 표시 이름 |
---|---|---|
SE_ASSIGNPRIMARYTOKEN_NAME | SeAssignPrimaryTokenPrivilege | 프로세스 수준의 토큰 대체 |
SE_BACKUP_NAME | SeBackupPrivilege | 파일 및 디렉터리 백업 |
SE_DEBUG_NAME | SeDebugPrivilege | 프로그램 디버그 |
SE_INCREASE_QUOTA_NAME | SeIncreaseQuotaPrivilege | 프로세스에 대한 메모리 할당량 조정 |
SE_TCB_NAME | SeTcbPrivilege | 운영 체제의 일부로 작동 |
잠재적으로 위험한 권한을 사용하도록 설정하기 전에 코드의 함수 또는 작업에 실제로 권한이 필요한지 확인합니다. 예를 들어 운영 체제에서 실제로 SeTcbPrivilege가 필요한 함수는 거의 없습니다. 사용 가능한 모든 권한 목록은 권한 상수를 참조하세요.
다음 예제에서는 액세스 토큰에서 권한을 사용하거나 사용하지 않도록 설정하는 방법을 보여 줍니다. 이 예제에서는 LookupPrivilegeValue 함수를 호출하여 로컬 시스템에서 권한을 식별하는 데 사용하는 LUID( 로컬 고유 식별자 )를 가져옵니다. 그런 다음, 이 예제에서는 bEnablePrivilege 매개 변수의 값에 따라 권한을 사용하거나 사용하지 않도록 설정하는 AdjustTokenPrivileges 함수를 호출합니다.
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "advapi32.lib")
BOOL SetPrivilege(
HANDLE hToken, // access token handle
LPCTSTR lpszPrivilege, // name of privilege to enable/disable
BOOL bEnablePrivilege // to enable or disable privilege
)
{
TOKEN_PRIVILEGES tp;
LUID luid;
if ( !LookupPrivilegeValue(
NULL, // lookup privilege on local system
lpszPrivilege, // privilege to lookup
&luid ) ) // receives LUID of privilege
{
printf("LookupPrivilegeValue error: %u\n", GetLastError() );
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
// Enable the privilege or disable all privileges.
if ( !AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL) )
{
printf("AdjustTokenPrivileges error: %u\n", GetLastError() );
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("The token does not have the specified privilege. \n");
return FALSE;
}
return TRUE;
}