修正 Windows Update 無法安裝更新而 sfc 和 dism 無法使用的問題

修正 Windows Update 無法安裝更新而 sfc 和 dism 無法使用的問題

在我的 PC 桌上型系統的生命週期中的某個時刻,我在玩電玩時連續出現兩次藍色畫面。之後,我設法透過重新連接所有硬體來阻止系統崩潰,但由於某種原因,任何影響系統的 Windows 更新(例如從 1803 到 1903 的年度升級以及 1803 版本 Windows 的 .NET Framework 到 4.8 的隨機更新)一直安裝失敗。因為它們不是強制性的,但我並沒有理會它們,因為 Windows Defender 的定期安全性更新仍然有效。在某個時候,我運行了 Windows 更新疑難排解,它說他們發現了一些錯誤,但重新啟動將運行修復例程。

在某個時候,我決定讓更新再次發揮作用。 .NET 更新的更新失敗為 0x8000ffff,Windows 升級的更新失敗為 0x800700C12。

在網路上搜尋它們,您會發現大量垃圾,因為我們都知道任何和所有 Windows 錯誤都是讓易受攻擊的人安裝惡意軟體的完美場所。

下載 MediaCreationTool 並告訴它手動升級到 1903 也失敗,並出現“嚴重錯誤”,儘管它似乎對系統沒有任何影響,而且它根本沒有應用任何更改。但沒有日誌(感謝微軟提供這些有用的錯誤訊息)

透過 powershell 命令 GetWindowsUpdateLog 轉儲 Windows 更新日誌導致我發現......不多。閱讀這些錯誤日誌是乏味而複雜的,錯誤和故障之間的區別以及簡單的事實是,其中涉及到在正常操作期間您永遠不會聽說過的系統(至少在Linux 中,您知道在設定時使用和安裝的系統)啟動系統)沒有幫助。

然後我嘗試手動安裝 .NET 4.8 Framework。正常安裝程式也失敗了,但至少它在我的驅動器的某個隨機位置轉儲了可搜索的.xml(由於某種原因,它將安裝文件轉儲到我的慢速2TB 存儲HDD 中,而不是系統安裝的SSD 上的某個位置)範例。因此,經過調查,我注意到在安裝的最後步驟中執行的某些命令列程式失敗並返回相同的 0x8000ffff 錯誤代碼:wusa.exe

比較錯誤訊息至少這是安裝過程中常見的錯誤:最終化部分失敗。

在研究修復 Windows 更新的方法時,我發現了嘗試使用的建議:

sfc /scannow

dism.exe /online /cleanup-image /restorehealth 

sfc 失敗,並顯示系統仍有待更改的訊息,我應該重新啟動電腦。在過去的 6 個月裡,我每天都這樣做,所以這不是解決方案。

dism.exe 大約 82.6% 時失敗,至少給了我一個提示,有日誌可供尋找。儘管它們在格式上也沒有太大幫助,但在某些最終確定步驟中也失敗了。

在研究如何讓 sfc 再次工作時,我發現了一個隨機論壇帖子,告訴用戶刪除 WinSxS 目錄中的pending.xml。查看該目錄(無論它使用什麼),我發現了待處理的.xml - 幾乎有 300MB 大。似乎有些不對勁。

以管理員身分刪除該檔案不起作用。我不斷收到訪問被拒絕的錯誤。即使下載 PSTools 並以 SYSTEM 使用者身分開啟電源 shell,也拒絕我刪除它的權利。沒有進程持有該檔案的句柄。

我該如何解決這個混亂問題以及所有這些錯誤是如何關聯的?

答案1

事實證明,整件事似乎是一團錯綜複雜的錯誤。

我在玩電玩時遇到的藍色畫面(大約 10 年來的第一次)似乎是在 Windows 更新在後台安裝某些內容時發生的。我不知道是否是更新本身造成的,但我必須克服一些困難才能讓我的系統再次運行,因為它報告啟動腳本已損壞。當時我想從進階啟動選單故障排除中執行一些基本的命令列工具來修復啟動問題。然後我重新連接了所有內容,因為錯誤日誌告訴我在將內容寫入磁碟時發生了一些奇怪的事情,所以我認為由於某種原因,系統運行時與系統 SSD 的線路連接被切斷。修復後系統再次順利運行,但更新不再起作用。

事實證明「文件損壞」更深了。似乎在pending.xml 中存在一個在PC 重新啟動時應套用的更新清單。該.xml 檔案在某種程度上被破壞了,不允許Windows 成功讀取其內容,但仍然允許它將它認為應該應用的所有更新添加到損壞的檔案中,從而從檔案中讀取任意數量的數據,然後附加所有內容每次重新啟動時,數據都會被添加到其後面,使其不斷膨脹,並且有關待更新的元數據幾乎達到 GB 比例。

由於 Windows 升級和 .NET 安裝程式還想在最終確定步驟中告訴系統“設備下次重新啟動時需要執行某些操作”,即使是獨立安裝程式和使用媒體創建工具進行的手動升級也是如此,他們也無法正確解析並新增至pending.xml。由於這一切都被破壞了,ComponentBasedServicing 似乎對某些程式負責,因此錯誤日誌檔案中到處都出現了 CBS。

現在來說說解決方案:

首先,我必須從使用媒體建立工具設定的 USB 記憶棒啟動進入故障排除模式。

我啟動了命令列並手動刪除了 WinSxS 目錄中的pending.xml。

之後,我能夠運行sfc /scannow最終得到一份報告,其中一些文件已損壞,一些內容已修復,但不是全部。

之後,我能夠運行一個dism /online /cleanup-image /restorehealth失敗的程序,無法找到要清理的來源。

之後我就可以執行dism /online /cleanup-image /startcomponentcleanup清理組件服務

之後我又/restorehalth成功地運行了另一個。

之後,我能夠重置 Windows 更新快取並讓它重新下載所有待處理的更新和升級。

之後我就能夠安裝 1903 升級以及 .NET Framework 更新。

現在一切看起來都很好。

我希望 Windows 能夠為用戶(不僅僅是超級用戶)提供更清晰的訊息,說明當系統出現任何問題時,哪些內容已損壞或未損壞。

這次搜索真是地獄。我擺脫了它。

相關內容