プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

指定した特権名の有効/無効

2007年11月27日 08時06分00秒 | システム関連

特定の特権を有効や無効にするには次の手順で行います。(戻る)

  1. アクセストークンを開く(OpenProcessToken)
  2. 指定した特権名の一意識別子(LUID)を得る(LookupPrivilegeValue)
  3. 指定した特権名の属性(有効/無効)をセット(TOKEN_PRIVILEGES構造体)
  4. 指定した特権名の属性(有効/無効)を変更(AdjustTokenPrivileges)
  5. アクセストークンを閉じる(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 特権を有効にする必要があります。
  • こんな場合に特権名の有効/無効を変更します。(本当は、このために用意した関数)

関連記事



コメント (2)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« CPU使用率の取得 | トップ | Windows の終了/再起動/ロ... »
最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
Unknown (S&R)
2008-07-03 19:36:54
有意義なサンプルをありがとうございます。
ProcessPrivilegeNameをHSPスクリプトに移植しました。
ありがとうございます。
返信する
Re:Unknown (ブログ管理人)
2008-07-04 01:08:15
どんどん活用してくださいな。
返信する

コメントを投稿

システム関連」カテゴリの最新記事