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

C語言 Win32 控制台關機程式「拒絕存取」解決方案:UAC 提權與 API 替代方案

     編輯:C 語言問答

錯誤原因

system("shutdown ...") 啟動 cmd.exe 再呼叫 shutdown.exe,需要**管理員權限**。普通使用者執行會被 UAC 攔截 →「拒絕存取」。

方案一:Manifest 嵌入需求管理員權限 (推薦)

  1. 專案右鍵 → Add → New Item → **Application Manifest File** (app.manifest)。
  2. 修改 :


編譯後執行檔圖標會有盾牌,雙擊觸發 UAC 彈窗,確認後以管理員身分執行。

方案二:直接呼叫 Windows API (無需 cmd 中介)


#include 
#include 

int main() {
    // 取得關機權限
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp;
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
        printf("OpenProcessToken 失敗: %lu\n", GetLastError());
        return 1;
    }
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL);

    // 執行關機
    if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, SHTDN_REASON_MAJOR_APPLICATION)) {
        printf("ExitWindowsEx 失敗: %lu\n", GetLastError());
        return 1;
    }
    return 0;
}

優點:無視窗閃爍、可精確控制強制/重啟/登出、回傳錯誤碼便於診斷。

方案三:任務排程器 / 快捷方式「以管理員身分執行」

  • 建立排程工作:觸發條件「一次」、動作「執行程式」、勾選「以最高權限執行」。
  • 或建立捷徑 → 內容 → 進階 → 勾選「以管理員身分執行」。

原始碼改進建議


// 原碼問題
system("shutdown -f -s -t 100");
Sleep(5000);
system("shutdown -a"); // 取消關機
// 1. 兩次 system 啟動 cmd,效率低、閃窗
// 2. 無錯誤檢查
// 3. 若取消失敗,電腦仍會關機
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved