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