實驗概覽
同 .NET 篇,針對原生 C++ (Win32) 應用程式展示安裝程式偵測誤判與修復。偵測邏輯相同:無資訊清單的 32 位元執行檔 + 檔名含 setup/install/update 關鍵字 → 自動加盾牌提權。本實驗示範透過外部資訊清單與專案內嵌資訊清單兩種方式修正。
系統需求
- Microsoft Visual Studio 2008 SP1
- Microsoft Windows 7
練習 #1:安裝程式偵測問題重現
任務 1:確保 UAC 啟用
同 .NET 篇:控制台 > 變更 UAC 設定,滑桿預設位置。
任務 2:識別問題
- 開啟
BrokenStockUpdater\Debug,中/大圖示檢視。
BrokenNativeStockUpdater.exe 顯示盾牌疊加圖示。

- 雙擊執行 → 彈出 UAC 提權提示。
- 原因:檔名含
update,無資訊清單 32 位元執行檔,觸發偵測。
練習 #2:解決問題
任務 1:新增外部資訊清單
- 在
Debug 資料夾新增文字文件 BrokenNativeStockUpdater.exe.manifest (空檔即可移除盾牌)。

- 編輯內容 (同 .NET 版):
level="asInvoker"。
- 雙擊 .exe 驗證:無 UAC 提示,正常執行。
任務 2:內嵌資訊清單 (專案屬性設定)
- VS 2008 開啟
BrokenStockUpdater.sln,檢查 BrokenNativeStockUpdater 專案屬性:
- 連結器 > 資訊清單檔 > 產生資訊清單 = 否 (預設為是)。

- 改為 產生資訊清單 = 是。
- UAC 執行層級 設為 asInvoker (或 requireAdministrator/highestAvailable)。

- 資訊清單工具 > 輸入和輸出 > 內嵌資訊清單 = 是 (嵌入為 Win32 資源,無需外部檔案)。

- 重建方案,刪除外部 .manifest。
- 確認盾牌消失,雙擊無 UAC 提示。
修復版方案位置
FixedStockUpdater\FixedStockUpdater.sln
總結
- 安裝程式偵測僅作用於無資訊清單的 32 位元映像。
- 檔名關鍵字 (
setup/install/update) 觸發誤判 → 加入資訊清單 asInvoker 關閉偵測。
- 真安裝程式未被偵測 → 加入資訊清單
requireAdministrator 強制提權。
- C++ 專案透過連結器 > 資訊清單檔 > UAC 執行層級 設定,並勾選內嵌資訊清單 達成單一檔案部署。
- 鐵律: 所有發布執行檔必須內嵌資訊清單,明確宣告執行層級,不可仰賴偵測推測。