UAC (User Account Control) 在 Windows Vista 引入後,應用程式預設以標準使用者權限執行。早期應用程式 (尤其安裝程式) 假設擁有管理員權限,需寫入 Program Files、HKLM\Software 等受保護位置,若不提權將失敗並回傳「拒絕存取」。
為相容舊版安裝程式,Windows 內建安裝程式偵測:自動識別「疑似安裝程式」並提權執行。但此機制不完美,會產生誤判與遺漏。
setup、install、update (不分大小寫)。
例:StockUpdater.exe (股票更新程式) 含 update,觸發偵測,加盾牌、要求提權。但該程式實際不需管理員權限,誤判造成:
自訂安裝程式 (非 MSI) 檔名不含關鍵字 (如 MyAppDeploy.exe),偵測失效,無盾牌、不提權 → 安裝過程中寫入受保護位置失敗。
最直接、可靠的做法是加入應用程式資訊清單,明確宣告所需執行層級,完全繞過偵測邏輯。
YourApp.exe.manifest (檔名必須完全一致)。<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0"
xmlns="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="StockUpdater"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
requestedExecutionLevel:| 層級值 | 含義 | 適用情境 |
|---|---|---|
asInvoker | 以呼叫者相同權限執行 (標準使用者) | 一般應用程式、非安裝程式 |
requireAdministrator | 必須以管理員權限執行 | 安裝程式、系統工具、需寫入受保護區域 |
highestAvailable | 以目前使用者可取得的最高權限執行 | 既可標準執行、亦可管理員執行的混合工具 |
requestedExecutionLevel。.manifest 外部檔案即可生效。