目標
本動手實驗中,您將會學習如何:
• 故障排除一個文件重定向 問題
• 使用Process Monitor查找引起問題的根本原因
系統要求
您必須符合下面的條件以完成這次實驗:
• Microsoft Visual Studio 2008
• Microsoft Windows 7
• Windows 7 SDK
• Microsoft TechNet上的Process Monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx )
練習: 體驗用戶帳戶控制虛擬化
在這個練習中,您將會診斷一 個損壞的本機的 (Win32) C++ 應用程序顯示了文件重定向到VirtualStore文件夾。
隨後您將會添加一個UAC清單文件並編譯應用程序,從而使它支持UAC。您將會注意到它並沒 有被重定向,而是當對Program Files文件進行寫入操作時將會被阻止並引起“拒絕訪 問”錯誤。
最後,您將對應用程序進行修改,即將文件存儲到應用程序數據 (ProgramData)文件夾,來解決這一問題。
任務1 – 無清單文件情況下,運 行應用程序
在這個任務中,您將會在沒有清單文件的情況下運行應用程序,以模仿一 個舊應用程序並觸發UAC虛擬化引擎。在Visual Studio 2008中創建一個新應用程序的時候, 還會默認自動嵌入一個包括UAC節點的清單文件。
1.確保您的動手實驗運行在一個支 持UAC的系統上:
a.在開始菜單中
i.打開搜索
ii.輸入 UAC
iii.在搜索列表中點擊“改變用戶帳戶控制設置”
b.用戶帳戶控制設 置對話框出現了。確定UAC沒有被禁用。
i.設置UAC滑塊處於默認位置(見下圖)
ii.點擊 OK
2.轉到 包含DataRedirection解決方案的文件夾
3.在Visual Studio中打開該解決方案
a.確定您沒有使用管理員權限運行Visual Studio
b.如果Visual Studio是以 管理員權限運行的,那麼標題欄上會顯示“Visual Studio (Administrator) ”
4.將BrokenAppNative項目設置為開始項目:
a.右鍵點擊解決方案窗 口中的項目並選擇設為啟動項目
5.設置生成目標為x86 (Debug or Release; Debug recommended):
幫助
這樣做的原因是對x64應用程序而言,不論有沒有清單文件虛擬化都是關閉的。
6.右鍵點擊解決方案窗口中的BrokenAppNative項目並選擇屬性:
a.默認的, Visual Studio 2008會在UAC的一個節點中對項目進行配置;我們將會關閉這一設置以表明一 個滯後的應用程序是如何運行的。
7.在屬性中:
a.展開配置屬性
b.展開Linker
c.選擇清單文件
d.改變啟用用戶帳戶控制(UAC)選擇為No
e.點擊 OK
8.轉到BrokenAppNative.cpp文件並查看SaveFile和LoadFile 方法
9.請注意在 MakeDataFilePath 中路徑是如何生成的:
a.數據文件路徑保存在Program Files文件 夾下
b.SHGetKnownFolderPath的FOLDERID_ProgramFiles參數獲得 Program Files 文 件夾的路徑
c.如果沒有子文件夾的話,首先會在Program Files 下創建一個子文件夾
d.然後會在該子文件夾下創建一個文件(SomeFile.txt)
10.生成項目並運行 。請再一次確定您沒有以管理員的身份運行。
11.打開任務管理器並點擊進程選項卡 。
a.在View的菜單中,選擇Select Columns
b.彈出Select Process Page Columns對話框
c.選中復選框中的User Account Control (UAC) Virtualization,如 下圖中紅框所示(確定您選中了那個選項)
d.點擊 OK
12.注意 UAC虛擬化列,確定您的進程為啟用狀態:
13.在編 輯框中輸入些內容然後保存。這個操作應該成功;也就是說不會得到一個錯誤。
14.試著 轉到路徑所指向的地方(例如,64位Windows 7中的 C:\Program Files (x86)\BrokenApp 或 者86位Windows上的 C:\Program Files\BrokenApp)
注意
您在Program Files 中肯定找不到BrokenApp,因為寫入文件的操作會被重定向到 VirtualStore 文件夾。
任務2 – 找出問題
在這個任務中,您將會通過不同的步驟來確定您的 應用程序正在應用UAC虛擬化。
1.從Microsoft TechNet 網站下載並解壓進程管理器 (Process Monitor) (http://technet.microsoft.com/en- us/sysinternals/bb896645.aspx ).
2.啟動進程管理器
3.啟動 BrokenAppNative應用程序
4.點擊第三個工具欄按鈕確定進程管理器正在進行捕獲。 您也可以通過按CTRL-E 來開啟/關閉捕獲。
5.在 BrokenAppNative應用程序中,在文本框中輸入一些文本。
6.���BrokenAppNative應用程序中點擊保存。
7.您可 以通過點擊進程管理器的工具欄中的第三個按鈕停止捕獲(或按CTRL-E)。
8.在進程 管理器中,在工具菜單中,點擊進程樹。進程樹對話框將會彈出,如下所示:
9.在樹中 找到BrokenAppNative.exe並雙擊。
10.點擊關閉以關閉進程樹對話框。
11.在 進程管理器中右鍵點擊BrokenAppNative進程名
12.點擊包含BrokenAppNative。這將 會篩選出其他所有事件:
幫助
您能看見BrokenAppNative試圖創建C:\ProgramFiles (x86) \BrokenApp\SomeFile.txt文件。這個文件被重定向到了VirtualStore文件夾,這也是數據文 件最終的存放的地方。
注意結果列。 “REPARSE”行就是最原始的操作。 “SUCCESS”行就是重定向操作。
任務3 – 添加一個UAC 清單文件
在這個任務中,您將會添加一個清單文件來使應用程序支持UAC。標記您的應用程序 為支持UAC的應用程序,您要聲明應用程序無需寫入訪問受保護的位置。UAC虛擬化將不會應 用到您的應用程序。
1.在項目窗口中右鍵點擊BrokenAppNative項目並選擇屬性。
2.展開配置屬性(Configuration Properties)。
3.展開Linker。
4. 選擇清單文件。
5.改變啟用用戶帳戶控制(UAC)為Yes
6.點擊 OK.
7.重新生成應用程序。
8.運行應用程序
9.查看任務管理器,您將會注意到 虛擬化現在被禁用了:
幫助
這是由於當前清單文件中的UAC節點將應用程序標記為了支持UAC。
10.在編輯框中輸入一些文本並點擊保存。您應該得到下面的錯誤:
幫助
由於UAC虛擬化被關閉了,所以寫入受保護的位置時會收到錯誤。
任務 4 – 修改拒絕訪問錯誤
通過在清單文件中包含UAC節點,您聲明了在Windows 7中 您的應用程序支持UAC,因此可以阻止在受保護的地方進行寫入操作。在這個任務中您將改變 文本文件的存儲地點並修復拒絕訪問錯誤。
1.回到Visual Studio
2.在 BrokenAppNative.cpp中找到MakeDataFilePath方法
3.注釋掉方法頂部包含 FOLDERID_ProgramFiles的那行代碼。
4.對包含FOLDERID_ProgramData的代碼行取消 注釋。
5.重新生成並運行應用程序。
您現在修復了重定向的問題並保存了您 的數據文件到正確的地方。
幫助
為了在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文件夾會引起拒絕訪問錯 誤。
總結
在這個實驗中您使用了進程管理工具來分析了一個UAC重定向的問題 ,並通過修改代碼並保存文件到正確的位置(ProgramData)解決解決了它。