Windowsをシャットダウンする


Windowsをシャットダウンするには ExitWindowsEx APIを使用します。

BOOL ExitWindowsEx(UINT uFlags, DWORD dwReserved);

パラメータ

uFlags シャットダウンの種類。
以下の値を組み合わせて指定します。
意味
EWX_FORCE プロセスを強制的に終了させます。
EWX_LOGOFF 現在のユーザーをログオフさせます。
EWX_POWEROFF システムをシャットダウンした後、電源を切ります。
システムは、パワーオフ機能をサポートしていなければなりません。
EWX_REBOOT システムを再起動します。
EWX_SHUTDOWN システムをシャットダウンして、電源を切っても大丈夫な状態にします
dwReserved 予約済み。
このパラメータは無視されます。

EWX_POWEROFF,EWX_REBOOT,EWX_SHUTDOWNを指定する場合
Windows NTの場合呼び出し側のプロセスが、SE_SHUTDOWN_NAME 特権を持っていなければなりません。

戻り値
   成功したとき0以外の値が返ります。
   そうでないとき0が返ります。


Sample code
#include <windows.h>
#include <tchar.h>

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    OSVERSIONINFO osinfo = {0};
    osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osinfo);
    if(osinfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { //WinNT
        HANDLE hToken;
        //アクセストークンをオープンする
        if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
            LUID luid;
            if(LookupPrivilegeValue(TEXT(""), SE_SHUTDOWN_NAME, &luid)) {
                //SE_SHUTDOWN_NAME 特権を有効にする
                TOKEN_PRIVILEGES tokenPrivileges = {0};
                tokenPrivileges.PrivilegeCount = 1;
                tokenPrivileges.Privileges[0].Luid = luid;
                tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
                if(AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, NULL, NULL, NULL)) {
                    if(GetLastError() == ERROR_SUCCESS) {
                        ExitWindowsEx(EWX_SHUTDOWN, 0);
                    }
                }
            }
            CloseHandle(hToken);
        }
    }
    else { //Windows
        ExitWindowsEx(EWX_SHUTDOWN, 0);
    }
    
    return 0; 
}

一覧メニューへ