2017年7月20日 星期四

2017-07-20 23:00 Windows Update安裝KB3172729/KB4535680發生0x800F0922錯誤解決方式

 KB3172729/KB4535680是Windows 8.0以上針對Secure Boot的安全修正,若安裝失敗、將無法安裝其他積存更新。因此若更新發生0x800F0922錯誤,請進入UEFI關閉Secure Boot後、再進行更新,完成更新再重新啟用UEFI中的Secure Boot。參考資訊來源

KB3172729/KB4535680、還包含另外數個安全更新甚至Windows與.Net Framework積存更新都安裝失敗。但關閉Secure Boot後、成功安裝KB3172729/KB4535680完畢、也一併成功安裝因KB3172729/KB4535680更新失敗而無法安裝的其他更新。

後記:多年後又再度碰到800F0922,發生於2021年1月的例行更新,其中的KB4535680又是針對Secure Boot安全修正。早已忘記800F0922、沒料想搜尋到自己多年前的處理紀錄。一再更新失敗始終以為是連線問題、果然搞個blog當筆記本還是必要的~

2017年7月12日 星期三

2018-07-12 22:00 透過DISM提升Windows 7以上Windows Update安裝速度

若不是經常裝機、例常性逐次安裝Windows Update(WU)通常不會過於惱人。但若是系統重建後一次性大批量幾十個更新也得耗上大半天!針對這樣的狀況、網路上竟有阿Q式回應「就當那10幾小時甚至隔夜的跑更新是燒機測試」。吃苦當吃補?乾脆別用電腦回頭用算盤去。

Windows Update線上更新延遲一部分在於檢查更新與下載、但其實更新安裝更耗時。

嘗試透過WSUS獲取的MSU配合WU線上檢查結果、W7SP1旗艦版截至2018/07也有60多個累計更新得裝,就算以WUSA/MSU離線安裝一樣也得耗時10小時左右!

看不出這樣浪費時間的低運算工作能測出多少系統穩定性。Windows 10往後也勢必面臨此種情況。

接著找到了這篇,原來這惱人的情況已是舉世聞名,不過搜尋中文相關資源卻毫無所獲。

1.首先獲得需要更新的MSU檔(可以年度為限取得、剩餘當年度的修補以線上更新完成),

   接著以指令 expand *.MSU -f:* /path/ 將所有MSU檔全解出至另一自訂的 /path/ 路徑

2.各MSU檔解出的內容一般為四個檔案、兩個CAB檔與XML及TXT各一。需要的為帶有KB與修正編號命名的CAB檔。

3.進入 /path/ 路徑。以記事本建立更新指令檔(.CMD)如以下內容

dism.exe /online /add-package /packagepath:"./quiet /norestart /logpath:"/path/Logs.txt"

(/logpath:為選用參數、可輸出安裝紀錄作為之後若安裝失敗偵錯之用)

至於步驟2.為何不直接指定-f:*.CAB僅解出CAB檔即可,

因部分更新MSU包含額外修正檔案、例如CleanupWindowsDefenderTasks.exe,這些額外的執行檔需掛在指令檔最前面先執行。

不過需注意某些更新存在前後相依性,如安裝KB3125574前必須先安裝KB3020369

(也可藉由先安裝KB3177467取代KB2533552KB3020369,可藉由修改檔名調整更新次序)。

建立完畢後儲存、以系統管理員身份執行該指令檔即可自動安裝 /path/ 內所有的KB*.CAB更新。

解檔連同製作批次安裝流程、最後完成安裝只用了原本所需1/5的時間。別再傻傻吃苦當吃補以跑更新當燒機這種無謂的蠢事!

另外的加速更新方式則是直接更新安裝來源的install.wim影像檔,一樣是透過DISM以類似上述方式更新(詳細介紹請搜尋DISMhotfix integration)。

差別在於某些更新檔無法於離線image進行更新、必須於系統運作中(online)更新,如KB2533552、整合時會產生0x800f082f錯誤,

雖可藉由KB3177467同時取代KB2533552KB3020369,但以KB3177467取代未經處理、後續的整合也會產生0x800f082f錯誤。

可在整合這類更新後、透過附加步驟(原文見此)解決更新鎖定的情況(KB2533552不適用),針對Windows 7的image方法為

1.先取得SetACL(Administrator EXE)

2.逐項整合KB3177467這類會鎖定更新、而導致後續以DISM整合更新產生錯誤的項目

3.接著執行以下指令(可自行編寫指令檔/批次檔一次執行)

reg load HKLM\TempSoftware %MountDir%\windows\system32\config\Software
setacl -on "HKLM\TempSoftware\Microsoft\Windows\CurrentVersion\Component Based Servicing\SessionsPending" -ot reg -actn setowner -ownr n:Administrators
setacl -on "HKLM\TempSoftware\Microsoft\Windows\CurrentVersion\Component Based Servicing\SessionsPending" -ot reg -actn ace -ace n:Administrators;p:full
reg add "HKLM\TempSoftware\Microsoft\Windows\CurrentVersion\Component Based Servicing\SessionsPending" /v Exclusive /t REG_DWORD /d 0 /f
reg unload HKLM\TempSoftware

%MountDir%置換為掛載 install.wim 的路徑

4.每整合會鎖定更新的單項、就先更新image (DISM /Commit-Image /MountDir:%image%)。完成整合這類線上更新後、再整合剩餘更新(目前W7僅有KB3177467需以此方式整合、不會太繁瑣)。

 

不過即便以KB3177467取代KB2533552、連線後WU仍會提示欠缺KB976932約9.1MB的更新(即KB2533552),

而以上述方式也無法先行整合KB2533552至安裝image(0x800f082f錯誤),稍後WU仍會判定KB2533552的修正未透過KB3177467完成。

因此上線後仍須接受WU的KB976932更新、再重補一次KB2533552。這問題隨著W7的壽命終結、M$應當不會處理了。

其實KB976932(KB2533552)的修正主要針對W7以更新方式安裝SP1(KB976932)的系統,若安裝SP1後未重開機而直接安裝其他更新、在系統重啟後會因重複執行POQ導致0xc0000034錯誤。所以對於直接安裝W7 SP1整合的系統應當無修正必要。

但WU無法判定SP1是以哪種方式安裝以及安裝後的系統狀態,所以判定W7 SP1通通有獎、一律推送KB976932(KB2533552)。

若操作的image為Windows 8以上版本,可透過/PreventPending參數迴避更新鎖定問題。


此外更新涉及多語系使用介面/語言包(MUI/LP),若更新後再安裝MUI將會導致WU提示再更新、以修正安裝MUI後未更新的部分,

因此強烈建議整合或安裝MUI後再套用全部更新、以避免安裝MUI後又收到WU更新通知。

 

順道一提在完全離線安裝環境下,系統無法立即取得根憑證(Root CA)更新,這可能導致某些軟體安裝上的麻煩,

例如VC++ 2013 redistributable 12.0.40660、將會因憑證問題0x800b010a導致無法安裝。

可預先準備MS root CA 2011(由MS網站下載),以手動方式匯入根憑證解除安裝問題。

憑證安裝精靈提示憑證存放區時、務必手動選擇存放於「受信任的根憑證授權單位」。

也可以指令方式 Certutil.exe -addstore "Root" MicRooCerAut2011_2011_03_22.crt 省去安裝對話。

完成匯入後免重開機即可嘗試再次安裝因欠缺憑證而無法安裝的軟體。