system("shutdown ...") 啟動 cmd.exe 再呼叫 shutdown.exe,需要**管理員權限**。普通使用者執行會被 UAC 攔截 →「拒絕存取」。
app.manifest)。:
編譯後執行檔圖標會有盾牌,雙擊觸發 UAC 彈窗,確認後以管理員身分執行。
#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. 若取消失敗,電腦仍會關機