家中台式電腦上的 Windows 7 是在前年剛買的時候裝的,一直沒有重裝。在這期間沒有使用任何第三方優化軟體,但運作起來一切正常。這說明隻要使用得當,Windows 完全可以很穩定的長期運作,不需要定期重裝,也不需要使用優化軟體。
不過,這個系統最近出了一點問題,每天都會有 mcupdate.exe 這個程序産生異常,無法正常執行。
由于目前系統中安裝有 Visual Studio,是以在産生異常時會彈出是否使用 Visual Studio 進行調試的對話框。
mcupdate.exe 是 Windows Media Center 元件(包含在Win7家庭進階版以上版本中)的更新程式,用于檢測更新微軟為媒體中心提供的線上服務和電視節目指南等内容。例如“網際網路視訊”功能本身不包含在 Windows 中,是通過 mcupdate.exe 網絡更新的方式安裝到系統中的。
如果使用者沒有運作過 Windows Media Center,該更新程式并不會運作;如果使用者曾經運作過 Windows Media Center,那麼他會被 Windows “任務計劃”周期性的調用執行。這也就是為什麼每天都會發生一次異常。
所幸 Windows Media Center 是基于 Microsoft .NET Framework 開發的,由于運作的是 MSIL 代碼而不是直接以二進制代碼運作,是以在沒有對代碼進行混淆和加密的情況下,可以很友善的進行調試。開始調試後可以直接看到錯誤的原因:
Failed to recover store: C:\ProgramData\Microsoft\eHome\mcepg2-1.db
意思是無法還原 Windows Media Center 的電視節目指南資料庫 mcepg2-1.db 檔案。先打開檔案所在位置看一下有何異常,檔案好好的在那裡,看起來一切正常啊。沒關系,繼續在Visual Studio中檢視異常資訊,點選“檢視詳細資訊…”,可以看到如下内容:
原來,出發這個異常的原因是另外一個異常:Could not open file stream: [c:\programdata\microsoft\ehome\Counter.mem]. Error code: 5. 無法打開檔案 Counter.mem,而實際上這個檔案我可以正常打開。
不過,想到 mcupdate.exe 是由任務計劃程式啟動而不是由使用者啟動的,是以其使用的使用者帳戶應該是系統服務帳戶,而不是管理者使用者帳戶,可能是由于NTFS權限的原因,導緻系統服務帳戶不能打開這個檔案。對比檢視這兩個檔案的屬性和 mcupdate.exe 的帳戶權限資訊,内容如下:
果然,該程式以 NETWORK SERVICE 帳戶身份運作(隸屬于Users組),而發生通路錯誤的檔案隻允許Users組賬戶具有讀取權限。為Users使用者組手動配置設定讀寫權限之後,在系統的任務計劃程式庫中找到 mcupdate 任務,手動運作它,果然工作正常,再也沒有出現異常提示:
但我認為,這兩個檔案的權限一定是被修改了,才會導緻這樣的問題。那他們的預設權限究竟是怎樣的呢?一種方法是從其他正常的系統中檢視一下這裡的檔案權限,另外還可以嘗試一下把他們删除掉,看程式能否自動建立他們,如果可以,那一定可以為他們配置設定一個正确的NTFS通路權限清單。
為了保險起見,把 C:\programdata\microsoft\eHome 檔案夾備份了一下,然後整個删除掉,再手動運作 mcupdate 任務,果不其然,程式自動建立了一個 ehome 檔案夾,看看其檔案夾權限,原來是這樣的:
并且,ehome 檔案夾下的檔案全都繼承了它的權限清單,是以現在應該不會有問題了。
為何該檔案夾的權限被修改,我沒有去深究,但是這個問題啟發我在以後的排錯過程中應當包含對通路權限的測試和檢查,有時候即使檔案的其他方面沒有任何問題,錯誤的通路權限也會帶來一些麻煩,是以奉勸大家以後也不要随便修改系統檔案和檔案夾的NTFS權限,說不定下次出問題就沒這麼容易排查了。
本文轉自wbpluto 51CTO部落格,原文連結:http://blog.51cto.com/wbpluto/514649,如需轉載請自行聯系原作者