Windows Vista 引入 UAC (User Account Control),標準權限進程無法寫入 Program Files、HKEY_LOCAL_MACHINE、系統目錄等受保護位置。VC++ 編譯的應用程式若需管理員權限,必須內嵌 Manifest 聲明 requireAdministrator,系統啟動時自動彈出 UAC 同意提示並提權。
操作步驟 (Visual Studio 6.0 / 2005+ 通用)
1. 專案資源新增 Custom Resource
- 資源視圖右鍵 Add Resource → 選 Custom → New。
- Resource Type 輸入 24 (即
RT_MANIFEST)。
- 資源 ID 設為 1 (系統預設查找 ID 1)。
2. 貼上 Manifest XML 內容
3. 重新編譯
編譯後 EXE 圖標右下角會出現 盾牌圖標,雙擊執行自動彈出 UAC 對話框 (「允許此應用對你的裝置進行變更嗎?」),點「是」以管理員權限運行。
level 參數可選值
| 值 | 行為 |
asInvoker | 以調用者權限運行 (標準用戶),不提權 (預設無 Manifest 時行為)。 |
highestAvailable | 取得調用者能獲得的最高權限 (管理員組用戶提權,標準用戶不提權)。 |
requireAdministrator | 強制要求管理員權限,標準用戶需輸入管理員帳密。 |
進階:UI Access (uiAccess="true")
- 允許程式繞過 UIPI (User Interface Privilege Isolation) 與更高完整性視窗互動 (如模擬輸入、讀取高權限視窗內容)。
- 嚴格要求: 1) 必須簽名 (代碼簽章證書) 2) 安裝於系統目錄 (
Program Files, Windows\System32) 3) Manifest uiAccess="true"。一般應用 不建議開啟。
VS2005+ 圖形化配置 (無需手動 XML)
專案右鍵 Properties → Linker → Manifest File → UAC Execution Level 選 requireAdministrator,IDE 自動生成/內嵌 Manifest。
常見問題
- Vista/Win7 上測試正常,XP 報錯: XP 無 UAC,Manifest 被忽略,不影響運行。
- 子進程繼承權限:
CreateProcess 啟動的子進程預設繼承父進程完整性等級 (同為管理員)。
- ClickOnce/安裝程式: 安裝程式本身需提權,安裝後的應用若需提權仍需自身 Manifest。
- 調試: VS 調試器需以管理員身份啟動,否則附加到提權進程會失敗。
內嵌 Manifest 是現代 Windows 應用程式獲取管理員權限的標準、唯一正規途徑。
- 上一篇文章: VC++ 使用 ADO 訪問 Access 資料庫:_Connection/_Recordset/_Command 封裝類完整實現
- 下一篇文章: Visual C++ 記憶體洩漏偵測與定位完整指南:CRT Debug Heap、_CrtDumpMemoryLeaks、斷點追蹤
Copyright ©
程式碼之家 All Rights Reserved