概述
本動手實驗,您將會體驗 UAC 虛擬化的效果以及一步一步來解決問題。
目標
本動手實驗中,您將會學習如何:
故障排除一個文件重定向問題
使用 Process Monitor 查找引起問題的根本原因
系統要求
您必須符 合下面的條件以完成這次實驗:
Microsoft Visual Studio 2008
Microsoft Windows 7
Microsoft TechNet 上的 Process Monitor (http://technet.microsoft.com/en- us/sysinternals/bb896645.aspx )
練習 : 體驗用戶帳戶控制虛擬化
在這個練習中,您將會診斷一個托管的應用程序,它不支持 Windows 7 和 UAC 虛擬 化,特別是,文件重定向,到 VirtualStore 文件夾。
您將首先通過一系列的測試來 確定問題。然後,您將添加 UAC 清單文件並編譯應用程序,以使之支持 UAC 。當您運行應 用程序的時候,請您注意當對受保護的文件夾進行寫入的時候 UAC 並沒有對您的文件進行虛 擬化,例如 Program Files ;而是對您的操作進行了組織並引起了“拒絕訪問” 錯誤。最後,您將對應用程序進行修改,即將文件存儲到應用程序數據( ProgramData )文 件夾,來解決這一問題。
任務 1 – 無清單文件情況下,運行應用程序
在這個任務中,您將會在沒有清單文件的情況下運行應用程序,以模仿一個舊應用程序並觸 發 UAC 虛擬化引擎。在 Visual Studio 2008 中創建一個新應用程序的時候,還會默認自動 嵌入一個包括 UAC 節點 的清單文件。
確保支持 UAC 。
在開始菜單中
打開搜索
輸入 UAC
在搜索列表中點擊“改變用戶帳戶控制設置 ”
用戶帳戶控制設置對話框出現了。確定 UAC 沒有被禁用。
設置 UAC 滑塊處於默認位置(見下圖)
點擊 OK
轉到包含 DataRedirection 解決方案 的文件夾
在 Visual Studio 中雙擊打開該解決方案
確定您沒有使用管理員權 限運行
如果 Visual Studio 是以管理員權限運行的,那麼標題欄上會顯示 “ Visual Studio (Administrator) ”
將 BrokenAppManaged 項目設置為開始項 目:
右鍵點擊解決方案窗口中的項目並選擇 Set as StartUp Project
設置目 標架構為 x86 :
右鍵點擊 BrokenAppManaged 項目並選擇 Properties.
配置 項目使應用程序在沒有清單文件的情況下運行(默認的清單文件是包含 UAC 節點的)
在 Application 選項卡中, Manifest 下,選擇 Create application without a manifest 。
轉到 FileIO 類 (在 FileIO.cs 文件中)
查看 Save 和 Load 方法和靜態構造函數,並觀察數據文件路徑是如何生成為 Program Files\BrokenApp 下的文 件的。
生成項目並運行。請再一次確定您沒有以管理員的身份運行。
打開任 務管理器並點擊 Processes 選項卡。
在 View 的菜單中,選擇 Select Columns
彈出 Select Process Page Columns 對話框
選中復選框中的 User Account Control (UAC) Virtualization ,如下圖中紅框所示(確定您選中了那個選項)
點擊 OK
請注意 UAC Virtualization 列,確定您的進程為啟用狀態
在編輯框中輸入些內容然後保存。這個操作應該成功;也就是說不會得到一個錯誤。
試著轉到路徑所指向的地方(例如, 64 位 Windows 7 中的 C:\Program Files (x86) \BrokenApp 或者 86 位 Windows 上的 C:\Program Files\BrokenApp )
注意
您在 Program Files 中肯定找不到 BrokenApp ,因為寫入文件的操作會被重定向到 VirtualStore 文件夾。
任務 2 –找出問題
在這個任務中,您將會通過 不同的步驟來確定您的應用程序正在應用 UAC 虛擬化。
從 Microsoft TechNet 網站 下載並解壓 進程管理器 ( Process Monitor ) (http://technet.microsoft.com/en- us/sysinternals/bb896645.aspx ).
啟動進程管理器
啟動 BrokenAppManaged 應用程序
點擊第三個工具欄按鈕確定進程管理器正在進行捕獲。您也可以通過按 CTRL-E 來開啟 / 關閉捕獲。
在 BrokenAppManaged 應用程序中,在文本框中輸入一 些文本。
在 BrokenAppNative 應用程序中點擊 Save 。
您可以通過點擊進程 管理器的工具欄中的第三個按鈕停止捕獲(或按 CTRL-E )。
在進程管理器中,在工 具菜單中,點擊進程樹。進程樹對話框將會彈出,如下所示:
在樹中找到 BrokenAppManaged.exe 並雙擊。
點擊關閉以關閉進程樹對話框。
在進程管理 器中右鍵點擊 BrokenAppManaged 進程名
點擊包含 BrokenAppManaged 。這將會篩選 出其他所有事件:
幫助
您能看見 BrokenAppNative 試圖創建 C:\ProgramFiles (x86)\BrokenApp\SomeFile.txt 文件。這個文件被重定向到了 VirtualStore 文件夾,這也是數據文件最終的存放的地方。
注意結果列。 “ REPARSE ”行就是最原始的操作。“ SUCCESS ”行就是重定向操作。
任務 3 – 添加一個 UAC 清單文件
在這個任務中,您將會添加一個清單文 件來使應用程序支持 UAC 。標記您的應用程序為支持 UAC 的應用程序,您要聲明應用程序 無需寫入訪問受保護的位置。 UAC 虛擬化將不會應用到您的應用程序。
在項目窗口 中右鍵點擊 BrokenAppNative 項目並選擇屬性。
右鍵點擊 BrokenAppManaged 項目 並選擇屬性
將該項目配置為應用程序在有清單文件的情況下生成。
在 Mandifest 下,選擇 Embed manifest with default settings
默認的清單文件包含 一個 UAC 節點
重新生成應用程序。
運行應用程序。
查看任務管理器 ,您將會注意到虛擬化現在被禁用了:
在編輯框中輸入一些文本並在 BrokenAppManaged 應用程序中點擊保存。您應該得到下面的錯誤:
幫助 :
由 於 UAC 虛擬化被關閉了,所以寫入受保護的位置時會收到錯誤。
任務 4 – 修 改拒絕訪問錯誤
通過在清單文件中包含 UAC 節點,您聲明了在 Windows 7 中您的應 用程序支持 UAC ;因此應用程序將不能在受保護的地方進行寫入操作。在這個任務中您將改 變文本文件的存儲地點並修復拒絕訪問錯誤。
回到 Visual Studio
在 FileIO.cs 文件中的 FileIO 類的靜態構造函數中:
注釋掉保存到 Environment.SpecialFolders.ProgramFiles 的代碼
對保存到 Environment.SpecialFolders.CommonProgramData 的代碼取消注釋
這將使得文件被 保存到通用項目數據文件夾(默認為 C:\ProgramData ),該文件夾是所有用戶都能訪問的 。
重新生成並運行應用程序。
確定數據文件現在被保存到了正確的文件夾: C:\ProgramData\BrokenApp.
您現在修復了重定向的問題並保存了您的數據文件到正 確的地方。
注意
注意對文本文件的操作沒有重定向並且成功了。
幫助 :
為了在 Visual Studio 2008 中實現重定向,您必須在清單文件中關閉 UAC 。要這 麼做:
Visual Studio 中的 C# 項目 :
1. 點擊項目菜單
2. 點擊項目 屬性
3. 在應用程序選項卡中,在資源選項卡中,選擇圖片和清單文件。
4. 選擇不包含清單文件創建應用程序。
5. 點擊 OK.
Visual Studio 中的 C++ 項目 :
1. 點擊項目菜單
2. 點擊項目屬性
3. 展開配置屬性( Configuration Properties )
4. 展開 Linker.
5. 選擇清單文件。
5. 改變啟用用戶帳戶控制( UAC )為 No
6. 點擊 OK.
這裡關閉 UAC 目的只是為了說明。所有可執行的都應該包含在清單文件中的 UAC 節點中。如果清單文件包 含了 UAC 節點, Windows 將不會把應用程序看作滯後的應用程序並且不會啟用重定向。寫 入 Program Files 文件夾會引起拒絕訪問錯誤。
總結
在這個實驗中您使用了 進程管理工具來分析了 Windows 7 UAC 虛擬化,它支持對所有受保護區域的文件的重定向和 注冊更新。您成功的通過修改代碼並保存文件到正確的位置解決解決了它。