Win32API プロセストークンに割り当てられている特権情報を取得する

プロセストークンに割り当てられている特権情報を取得するためには、手順で処理を実行する。

No項目
1OpenProcessToken関数でプロセストークンを取得する
2GetTokenInformation関数で、「1」で取得したプロセストークンの特権情報を取得する
3「2」で取得した特権情報を用いて、LookupPrivilegeNameA関数で、特権の名前を取得する
4「2」で取得した特権情報を用いて、LookupPrivilegeDisplayName関数で、特権の表示名を取得する



特権を表す定数は、winnt.hで以下のように定義されている

////////////////////////////////////////////////////////////////////////
//                                                                    //
//               NT Defined Privileges                                //
//                                                                    //
////////////////////////////////////////////////////////////////////////

#define SE_CREATE_TOKEN_NAME              TEXT("SeCreateTokenPrivilege")
#define SE_ASSIGNPRIMARYTOKEN_NAME        TEXT("SeAssignPrimaryTokenPrivilege")
#define SE_LOCK_MEMORY_NAME               TEXT("SeLockMemoryPrivilege")
#define SE_INCREASE_QUOTA_NAME            TEXT("SeIncreaseQuotaPrivilege")
#define SE_UNSOLICITED_INPUT_NAME         TEXT("SeUnsolicitedInputPrivilege")
#define SE_MACHINE_ACCOUNT_NAME           TEXT("SeMachineAccountPrivilege")
#define SE_TCB_NAME                       TEXT("SeTcbPrivilege")
#define SE_SECURITY_NAME                  TEXT("SeSecurityPrivilege")
#define SE_TAKE_OWNERSHIP_NAME            TEXT("SeTakeOwnershipPrivilege")
#define SE_LOAD_DRIVER_NAME               TEXT("SeLoadDriverPrivilege")
#define SE_SYSTEM_PROFILE_NAME            TEXT("SeSystemProfilePrivilege")
#define SE_SYSTEMTIME_NAME                TEXT("SeSystemtimePrivilege")
#define SE_PROF_SINGLE_PROCESS_NAME       TEXT("SeProfileSingleProcessPrivilege")
#define SE_INC_BASE_PRIORITY_NAME         TEXT("SeIncreaseBasePriorityPrivilege")
#define SE_CREATE_PAGEFILE_NAME           TEXT("SeCreatePagefilePrivilege")
#define SE_CREATE_PERMANENT_NAME          TEXT("SeCreatePermanentPrivilege")
#define SE_BACKUP_NAME                    TEXT("SeBackupPrivilege")
#define SE_RESTORE_NAME                   TEXT("SeRestorePrivilege")
#define SE_SHUTDOWN_NAME                  TEXT("SeShutdownPrivilege")
#define SE_DEBUG_NAME                     TEXT("SeDebugPrivilege")
#define SE_AUDIT_NAME                     TEXT("SeAuditPrivilege")
#define SE_SYSTEM_ENVIRONMENT_NAME        TEXT("SeSystemEnvironmentPrivilege")
#define SE_CHANGE_NOTIFY_NAME             TEXT("SeChangeNotifyPrivilege")
#define SE_REMOTE_SHUTDOWN_NAME           TEXT("SeRemoteShutdownPrivilege")
#define SE_UNDOCK_NAME                    TEXT("SeUndockPrivilege")
#define SE_SYNC_AGENT_NAME                TEXT("SeSyncAgentPrivilege")
#define SE_ENABLE_DELEGATION_NAME         TEXT("SeEnableDelegationPrivilege")
#define SE_MANAGE_VOLUME_NAME             TEXT("SeManageVolumePrivilege")
#define SE_IMPERSONATE_NAME               TEXT("SeImpersonatePrivilege")
#define SE_CREATE_GLOBAL_NAME             TEXT("SeCreateGlobalPrivilege")



  • プロセストークンに割り当てられている特権情報を取得する例

  • 自分自身のプロセストークンの情報(特権名と表示名)を取得し、表示する

    #include <windows.h>
    #include <stdio.h>
    
    int main()
    {
        HANDLE hToken;
        PTOKEN_PRIVILEGES pTokenPrivileges;
        char szPrivilegeName[256];
        char szDisplayName[256];
        DWORD dwLength;
        DWORD dwLanguageId;
        DWORD i;
    
        //1.OpenProcessToken関数でプロセストークンを取得する
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
            return 1;
        }
    
        GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &dwLength);
    
        pTokenPrivileges = (PTOKEN_PRIVILEGES)LocalAlloc(LPTR, dwLength);
        if (pTokenPrivileges == NULL) {
            CloseHandle(hToken);
            return 1;
        }
    
        //2.GetTokenInformation関数の第2引数にTOKEN_INFORMATION_CLASS列挙体のTokenPrivilegesを指定し、
        //プロセストークンに割り当てられている特権情報(PTOKEN_PRIVILEGES型オブジェクト)を取得する
        GetTokenInformation(hToken, TokenPrivileges, pTokenPrivileges, dwLength, &dwLength);
    
    
        for (DWORD i = 0; i < pTokenPrivileges->PrivilegeCount; i++) {
            
            dwLength = sizeof(szPrivilegeName)/sizeof(szPrivilegeName[0]);
    
            //3.LookupPrivilegeNameA関数で、特権の名前を取得する
            LookupPrivilegeNameA(NULL,
                &pTokenPrivileges->Privileges[i].Luid,
                szPrivilegeName,
                &dwLength);
    
            dwLength = sizeof(szDisplayName)/sizeof(szPrivilegeName[0]);
    
            //4.LookupPrivilegeDisplayName関数で、特権の表示名を取得する
            LookupPrivilegeDisplayNameA(NULL,
                szPrivilegeName,
                szDisplayName,
                &dwLength,
                &dwLanguageId);
    
            puts("----------------------------------------------------------------------");
            printf("PrivilegeName: %s\n", szPrivilegeName);
            printf("DisplayName: %s\n", szDisplayName);
            printf("Enable: %s\n\n", pTokenPrivileges->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED ? "True" : "False");
        }
    
        CloseHandle(hToken);
        LocalFree(pTokenPrivileges);
    
        return 0;
    }



  • Windows Vista上で、管理者権限で実行した際の実行結果
  • ----------------------------------------------------------------------
    PrivilegeName: SeShutdownPrivilege
    DisplayName: システムのシャットダウン
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeChangeNotifyPrivilege
    DisplayName: 走査チェックのバイパス
    Enable: True
    
    ----------------------------------------------------------------------
    PrivilegeName: SeUndockPrivilege
    DisplayName: ドッキング ステーションからコンピュータを削除
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeIncreaseWorkingSetPrivilege
    DisplayName: プロセス ワーキング セットの増加
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeTimeZonePrivilege
    DisplayName: タイム ゾーンの変更
    Enable: False
    



  • Windows Vista上で、ユーザー権限で実行した際の実行結果

  • ユーザー権限よりも管理者権限の方が、あらかじめ割り当てられている特権がたくさんあることがわかる

    ----------------------------------------------------------------------
    PrivilegeName: SeIncreaseQuotaPrivilege
    DisplayName: プロセスのメモリ クォータの増加
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeSecurityPrivilege
    DisplayName: 監査とセキュリティ ログの管理
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeTakeOwnershipPrivilege
    DisplayName: ファイルとその他のオブジェクトの所有権の取得
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeLoadDriverPrivilege
    DisplayName: デバイス ドライバのロードとアンロード
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeSystemProfilePrivilege
    DisplayName: システム パフォーマンスのプロファイル
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeSystemtimePrivilege
    DisplayName: システム時刻の変更
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeProfileSingleProcessPrivilege
    DisplayName: 単一プロセスのプロファイル
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeIncreaseBasePriorityPrivilege
    DisplayName: スケジューリング優先順位の繰り上げ
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeCreatePagefilePrivilege
    DisplayName: ページ ファイルの作成
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeBackupPrivilege
    DisplayName: ファイルとディレクトリのバックアップ
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeRestorePrivilege
    DisplayName: ファイルとディレクトリの復元
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeShutdownPrivilege
    DisplayName: システムのシャットダウン
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeDebugPrivilege
    DisplayName: プログラムのデバッグ
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeSystemEnvironmentPrivilege
    DisplayName: ファームウェア環境値の修正
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeChangeNotifyPrivilege
    DisplayName: 走査チェックのバイパス
    Enable: True
    
    ----------------------------------------------------------------------
    PrivilegeName: SeRemoteShutdownPrivilege
    DisplayName: リモート コンピュータからの強制シャットダウン
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeUndockPrivilege
    DisplayName: ドッキング ステーションからコンピュータを削除
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeManageVolumePrivilege
    DisplayName: ボリュームの保守タスクを実行
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeImpersonatePrivilege
    DisplayName: 認証後にクライアントを偽装
    Enable: True
    
    ----------------------------------------------------------------------
    PrivilegeName: SeCreateGlobalPrivilege
    DisplayName: グローバル オブジェクトの作成
    Enable: True
    
    ----------------------------------------------------------------------
    PrivilegeName: SeIncreaseWorkingSetPrivilege
    DisplayName: プロセス ワーキング セットの増加
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeTimeZonePrivilege
    DisplayName: タイム ゾーンの変更
    Enable: False
    
    ----------------------------------------------------------------------
    PrivilegeName: SeCreateSymbolicLinkPrivilege
    DisplayName: シンボリック リンクの作成
    Enable: False