ssCAROのブログ

色んなとこで見つけたプログラムのメモ置き場っぽい

パソコンの電源を切る

パソコンの電源を切る。(Windows NT以上) OpenProcessTokenで取得したハンドルはCloseHandleで解放する。
日本語版MSDNには、そのこと書いて無いから注意!
英語版MSDN OpenProcessToken

HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
BOOL bResult;

//アクセストークンを開く
bResult = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
if(! bResult) {
    return;
}

//シャットダウン特権を取得
bResult = LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid)
if(! bResult) {
    CloseHandle(hToken);
    return;
}

//アクセストークンの変更を実行
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

bResult = AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)
if(! bResult) {
    CloseHandle(hToken);
    return;
}

//アクセストークンを閉じる
CloseHandle(hToken);

//パソコンの電源を切る
ExitWindowsEx(EWX_POWEROFF, 0);