首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

C++ 實現 Windows 關機、重啟、登出:完整權限提升與 API 呼叫指南

     編輯:關於VC++

核心 API:ExitWindowsEx

僅兩個參數:

  • uFlags:動作旗標組合
    • EWX_SHUTDOWN 關機
    • EWX_REBOOT 重啟
    • EWX_LOGOFF 登出
    • EWX_FORCE 強制(不發送 WM_QUERYENDSESSION,直接終止程序,可能造成資料遺失)
  • dwReserved:保留,傳 0。

Windows 2000/XP 以上必須:關機特權啟用

呼叫 ExitWindowsEx 執行關機/重啟前,進程必須擁有 SE_SHUTDOWN_NAME 特權,否則失敗。完整啟用流程:

BOOL EnableShutdownPrivilege() {
    HANDLE hProcess = GetCurrentProcess(), hToken;
    LUID luid; TOKEN_PRIVILEGES tp = {0};

    if (!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken)) return FALSE;
    if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid)) return FALSE;

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL)) return FALSE;
    if (GetLastError() != ERROR_SUCCESS) return FALSE;

    CloseHandle(hToken);
    return TRUE;
}

封裝三大操作函式

BOOL Shutdown(BOOL bForce) {
    EnableShutdownPrivilege();
    return ExitWindowsEx(EWX_SHUTDOWN | (bForce ? EWX_FORCE : 0), 0);
}

BOOL Reboot(BOOL bForce) {
    EnableShutdownPrivilege();
    return ExitWindowsEx(EWX_REBOOT | (bForce ? EWX_FORCE : 0), 0);
}

BOOL Logoff(BOOL bForce) {
    // 登出不需關機特權
    return ExitWindowsEx(EWX_LOGOFF | (bForce ? EWX_FORCE : 0), 0);
}

測試主程式

int main() {
    Logoff(FALSE); Reboot(FALSE); Shutdown(FALSE);
    Logoff(TRUE);  Reboot(TRUE);  Shutdown(TRUE);
    return 0;
}

關鍵提醒

  • EWX_FORCE 會繞過程序詢問,直接強制終止,**謹慎使用**,可能導致未儲存資料遺失。
  • 登出操作不需要關機特權,但加上也無妨。
  • Vista/Win7+ 可能需 UAC 提權,建議 Manifest 設定 requireAdministrator。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved