Last Updated 2004/03/10
WindowsNT
電源遮断
2004/03/10

シャットダウンさせる場合には,実行するユーザがシャットダウン権限を持っている必要がある.(ユーザマネージャでシャットダウン権限を与えておく)
AdjustTokenPrivileges()は持っていない権限を取得出来るのではなく,持っている権限のうちOFFになっている権限をONにする.

//シャットダウン特権を有効にする
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp;
    if(::OpenProcessToken(::GetCurrentProcess(),
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) != TRUE) {
        // エラー
        return FALSE;
    }
    if(::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,
                        &tkp.Privileges[0].Luid) != TRUE) {
        // エラー
        return FALSE;
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if(::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
                                (PTOKEN_PRIVILEGES)NULL, 0) != TRUE) {
        // エラー
        return FALSE;
    }

    //シャットダウン
    if(::ExitWindowsEx(EWX_POWEROFF, 0) != TRUE) {
        // エラー
        return FALSE;
    }

特権を持たないで ExitWindowsEx() を呼び出すと FALSE を返すはずである.


注目API
OpenProcessToken()
GetCurrentProcess()
LookupPrivilegeValue()
AdjustTokenPrivileges()


参照
ExtiWindowsEx
前後のTips
電源遮断

DSS ProgrammingTipsCGI Ver1.02