目標
在本實驗中,您將學習如何:
確定 Windows Vista 及更高版本上與 安裝程序檢測相關的問題
修復安裝程序檢測問題
系統要求
要完成本實驗,您必須擁有以下軟件:
Microsoft Visual Studio 2008 SP1
Microsoft Windows 7
練習 #1 :安裝程序檢測問題
在本練習中,您將看到一個被錯誤地 標識為安裝程序的“舊”可執行文件,而實際上它只是一個不需要管理權限的普 通應用程序。
任務 1 – 確保 UAC 處於活動狀態
在本任務中,必須確 認用戶賬戶控制 (User Account Control, UAC) 處於活動狀態。只有在這種情況下才能發生 問題。
1. 單擊“開始”:
a. 單擊“控制面板”。
b. 單擊 User Accounts and Family Safety 。
c. 單擊 User Accounts 。
d. 單擊 Change User Account Control Settings 。將出現一個如下的對話框。
幫助
還有一種方法可選,單擊“開始”,單擊“運行 ”,鍵入“ UAC ”。然後單擊 Change User Account Control Settings 。
2. 確保 滑塊位於如圖所示的默認級別(也可以將其設置為其他級別,但不能是 Never notify ,這 將禁用 UAC )。
3. 單擊 OK 。
任務 2 :確定問題
1. 使用 Windows 資源管理器導航到 BrokenStockUpdater\Debug 文件夾。
2. 切換到中或大圖標視圖,您會發現 BrokenNativeStockUpdater.Exe 文件上方多了一個盾牌圖標,如下圖所示:
3. 雙擊 該文件確認出現 UAC 提升權限提示。
這不是我們希望出現的行為,這一點從文件名 中包含的“ update ”就可以看出(它是一個不帶清單的 32 位應用程序)。帶 有“ setup ”、“ install ”和“ update ”的文件都 是同樣的道理。
練習 #2 :解決問題
上一個任務中確定的問題可以通過添加 一個外部或內部清單加以解決。
任務 1 :添加一個外部清單
1. 使用 Windows 資源管理器導航到 BrokenStockUpdater\Debug 文件夾。
a. 右鍵單擊空白 位置。
b. 指向“新建”。
c. 單擊“文本文檔”。
d. 將其命名為 BrokenNativeStockUpdate.Exe.manifest 。
注意,只要出現 帶有該名稱的文件,即使文件為空,盾牌圖標也會消失:
2. 使用記事本或者其他文本編輯器打開清單文件。
3. 輸入以下文本:
XML
<?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="http://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>
幫助
關鍵信息是 level 屬性。值 asInvoker 表明 .exe 文件使用與創建人(例如, Windows 資源管理器)相同的權限運行,這表示這個 .exe 文件不是安裝程序,而是一個常規程序。 另一個相關級別是 requireAdministrator ,表示該 .exe 文件需要管理權限才能正常運行 。例如,這是一個實際的安裝程序並需要訪問授權位置,如 \Windows\System32 文件夾或 HKEY_LOCAL_MACHINE\Software 鍵。
4. 保存文件。
5. 退出文本編輯器。
6. 雙擊 .exe 文件驗證更改有效。
這一次,您應該看不到 UAC 提升權限提示,應用程序可以正常運行。
任務 2 :添加嵌入清單
1. 使用 Visual Studio 2008 打開位於 BrokenStockUpdater 文件夾中的 BrokenStockUpdater.sln 解決方案文件。
2. 研究 BrokenNativeStockUpdater 項目。
該項目沒有清單,要驗證這一點:
3. 單擊 Project 菜單。
4. 單擊 Properties 。
5. 在左列中,找到名為 Linker 的節點。
6. 打開它並找到名為 Manifest File 的節點。
在右側窗格中,將 Generate Manifest 設置為 No ,如以下截屏所示:
幫助
Visual Studio 2008 的默認設置是生成清單文件。
7. 將 Generate Manifest 設置更改為 Yes 。
8. 使用 UAC Execution Level 設置來設置需要的級別( asInvoker 、 requireAdministrator 或 highestAvailable ):
9. 在左側窗格中,打開名為 Manifest Tool 的節點。
10. 單擊名為 Input and Output 的節點。
右側窗格中的 Embed Manifest 設置控制是將清單作為 Win32 資源嵌入還是保留為一個 松散的文件(與上一個任務一樣)。
11. 選擇 Yes 將清單作為資源嵌入,使該執行文件不需要攜帶其他清單文件,如下面的 截屏所示:
12. 重建解決方案並刪除上一個任務中的清單。
確保盾牌按鈕已經消失,並且在雙擊應用程序時不會出現任何 UAC 提升權限提示。
修復的解決方案位於 FixedStockUpdater 文件夾的 FixedStockUpdater.sln 中。
小結
在本實驗中,您學習了安裝程序檢測的工作原理。還了解了文件名中包含特定關鍵字的 32 位映像可能導致不必要的權限提升。也可能出現相反的問題,需要提升權限的安裝程序無 法自動提升。