Win32API プロセストークンに割り当てられている特権情報を取得する
プロセストークンに割り当てられている特権情報を取得するためには、手順で処理を実行する。
No | 項目 |
1 | OpenProcessToken関数でプロセストークンを取得する |
2 | GetTokenInformation関数で、「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; }
---------------------------------------------------------------------- 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
ユーザー権限よりも管理者権限の方が、あらかじめ割り当てられている特権がたくさんあることがわかる
---------------------------------------------------------------------- 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