特定の特権を有効や無効にするには次の手順で行います。(戻る)
- アクセストークンを開く(OpenProcessToken)
- 指定した特権名の一意識別子(LUID)を得る(LookupPrivilegeValue)
- 指定した特権名の属性(有効/無効)をセット(TOKEN_PRIVILEGES構造体)
- 指定した特権名の属性(有効/無効)を変更(AdjustTokenPrivileges)
- アクセストークンを閉じる(CloseHandle)
プロトタイプ宣言
BOOL OpenProcessToken( HANDLE hProcess, // プロセスのハンドル DWORD dwAccess, // 希望するアクセス権 PHANDLE lpToken // アクセストークン・ハンドルへのポインタ ); BOOL LookupPrivilegeValue( LPCTSTR lpSystem, // 検索するシステム名(NULL=ローカル・システム) LPCTSTR lpName, // 特権名の文字列(SE_XXXXで始まる定数) PLUID lpLuid // ローカル一意識別子(LUID)へのポインタ ); BOOL AdjustTokenPrivileges( HANDLE hToken, // トークン・ハンドル BOOL DisableAllPrivileges, // すべての特権を無効にするフラグ PTOKEN_PRIVILEGES pNewState, // 新しい特権情報へのポインタ DWORD dwBufferLength, // 変更前の特権情報のサイズ(バイト単位) PTOKEN_PRIVILEGES pOldState, // 変更前の特権情報のポインタ(受け取り用) PDWORD lpdwReturnLength // 変更前の特権情報の受け取ったサイズ );
サンプル
// アクセス権の定数 #define OPEN_PROCESS_TOKEN (TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY) // プロセスハンドルから特権名を有効/無効 BOOL ProcessPrivilegeName( HANDLE hProcess, LPCTSTR lpPrivilegeName, BOOL bEnable ) { BOOL bSuccess = FALSE; // 戻り値(成功/失敗) HANDLE hToken; // アクセストークンのハンドル LUID Luid; // LUID(ローカル・ユニークID) DWORD dwSize; // 特権トークン容量(変更前の特権) TOKEN_PRIVILEGES OldPriv; // 特権トークン情報(変更前の特権) TOKEN_PRIVILEGES NewPriv; // 特権トークン情報(新しい特権) // アクセストークンのハンドルを取得 if ( OpenProcessToken(hProcess,OPEN_PROCESS_TOKEN,&hToken) ){ if ( LookupPrivilegeValue(NULL,lpPrivilegeName,&Luid) ){ // 特権名のLUIDを取得 NewPriv.PrivilegeCount = 1; // 特権数 NewPriv.Privileges[0].Luid = Luid; // 識別子 NewPriv.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0; // 特権トークン状態の有効/無効 if ( AdjustTokenPrivileges(hToken,FALSE,&NewPriv,sizeof(TOKEN_PRIVILEGES),&OldPriv,&dwSize) ){ if ( GetLastError() == ERROR_SUCCESS ){ bSuccess = TRUE; } } } CloseHandle( hToken ); } return bSuccess; }
使い方
// SE_SHUTDOWN_NAME権限の有効 ProcessPrivilegeName( GetCurrentProcess(), SE_SHUTDOWN_NAME, TRUE ); // シャットダウンの実行 ExitWindowsEx( EWX_SHUTDOWN, 0 );
- 使用例では Windows NT/2000/XP/Vista によるシャットダウン(パソコンの終了)を行います。
- Windows NT 系では、パソコンを終了する時などに SE_SHUTDOWN_NAME 特権を有効にする必要があります。
- こんな場合に特権名の有効/無効を変更します。(本当は、このために用意した関数)
関連記事
- 指定した特権名の有効/無効
- Windows の終了/再起動/ログオフ
- Windows の休止状態/スタンバイ
- コンピュータのロック
- [HSP]シャットダウンの命令群
ProcessPrivilegeNameをHSPスクリプトに移植しました。
ありがとうございます。