2022年1月12日微軟如期發布了安全補丁和月度匯總補丁,其中需要我們操作的有兩部分,一部分是windows server的安全補丁,一部分是exchange 安全補丁。
IT同學像以往一樣,立即開始準備修復。windows 補丁我們會通過saltstalk去安裝,效率比較高。 Exchange補丁只能逐臺操作,通常需要2-3天的時間(10臺以上)。
1月14日,微軟發布公告,本次補丁會引發其他的故障,比如hyper-v虛擬機不能啟動,域控制器頻繁重啟故障,原因還在進一步定位中,因此建議用戶先卸載掉本次補丁。
雖然我們尚未遇到補丁引發的問題,但是考慮到穩定性,還是計劃先卸載掉。
SaltStack版本:
[root@BJ-SaltStack-Node1 ~]# salt-master --version
salt-master 2018.3.5
SaltStack提供了 wusa模塊, 該模塊提供了wusa.install、wusa.is_installed、wusa.uninstall 三個方法,分別用于安裝、檢查、卸載。
因為不同的操作系統補丁KB號不同,所以我們可以根據操作系統類型來分批次卸載對應的KB補丁。
一直以來主要用saltstack批量安裝補丁,批量卸載還是第一次。
所以先看一下uninstall用法:
[root@BJ-SaltStack-Node1 ~]# salt SC-CD-AVS-01.123.com sys.doc wusa.uninstall
wusa.uninstall:
Uninstall a specific KB.
Args:
path (str):
The full path to the msu file to uninstall. This can also be just
the name of the KB to uninstall
restart (bool):
``True`` to force a restart if required by the installation. Adds
the ``/forcerestart`` switch to the ``wusa.exe`` command. ``False``
will add the ``/norestart`` switch instead. Default is ``False``
Returns:
bool: ``True`` if successful, otherwise ``False``
Raises:
CommandExecutionError: If an error is encountered
CLI Example:
salt '*' wusa.uninstall KB123456
# or
salt '*' wusa.uninstall C:/temp/KB123456.msu
通過相關語法來看,卸載還是比較容易的,wusa.uninstall 后面可以直接跟KB號 也可以跟補丁絕對路徑。
- 卸載2012ServerR2:
salt -G 'osrelease:2012ServerR2' wusa.uninstall KB5009595
WJ-NPS.123.com:
ERROR: Unknown error: 3010
3010: 指的安裝或卸載成功,但是等待重啟。 詳見:
https://docs.microsoft.com/en-us/windows/win32/msi/error-codes
- 但是當我們執行卸載2016Server和2019Server時,卻遇到錯誤。如圖示:
而指定補丁絕對路徑的話,需要將補丁拷貝至目標機器。
[root@BJ-SaltStack-Node1 ~]# salt BJ-WJ-AVS-01.123.com cp.get_file salt://fix_win/WS2019.msu c:\\
BJ-WJ-AVS-01.123.com:
c:\WS2019.msu
[root@BJ-SaltStack-Node1 ~]# salt BJ-WJ-AVS-01.123.com wusa.uninstall c:/WS2019.msu
BJ-WJ-AVS-01.123.com:
ERROR: Unknown error: -2147418113
從結果來看,能夠支持2016Server和2019Server的補丁安裝,卻不支持這兩個版本操作系統的補丁卸載。 大概是版升級的原因。
公司內部2019和2016的服務器近百臺,逐一登錄卸載效率太低了,至少一個禮拜。 況且以后說不定也會有類似問題。 總得靠技術解決。
微軟官方是明確的不支持使用wusa命令遠程安裝補丁(所以通過saltstack運行wusa.exe相關的命令或腳本是不可行的),解決方案是dism或Add-WindowsPackage。 如圖示:
dism 卸載補丁 可以參考鏈接 https://www.windowslatest.com/2021/04/23/how-to-uninstall-windows-10-updates-manually/
- 通過 dism /online /get-packages 獲取對應補丁包的id. - 通過 dism /Online /NoRestart /Remove-Package /PackageName:id 卸載補丁包。
經過測試,在計算機本地確實可行。
如圖示:
既然dism可行,那我們就可以通過saltstack cmd.run 或cmd.script 進行批量卸載了。
salt -G 'osrelease:2019Server' cmd.run 'dism /online /norestart /remove-package /packagename:Package_for_RollupFix~31bf3856ad364e35~amd64~~17763.2452.1.5' shell='powershell'
順利完成批量卸載。
“無BUG,不Win10”幾乎成了一句“家喻戶曉”的口頭禪,當然,換個角度,對于代碼量超過4000萬行、用戶數億的Windows操作系統來說,也很難做到十全十美,況且,從Win10開始,微軟的宗旨變成了“系統即服務”,補丁和更新更是層出不窮。
可能是自己覺得不好意思了,微軟今天宣布,今后,Windows 10將自動卸載那些無法成功安裝的更新內容并回滾到更新前的狀態,以避免因為補丁本身質量問題、與硬件不兼容等造成藍屏、反復重啟、卡LOGO等嚴重影響正常使用的問題。
微軟并未詳細解釋其“自動檢查問題”的機制是如何工作的,但看起來想法不錯,至少不用用戶選擇重裝、安全模式或者WinPE等手段來排查了。
另外,一旦被視為問題補丁后,Win10還將在未來30天內阻止該補丁二次安裝,不過,用戶如果執意手動安裝的話,也會許可。30天后,Win10會再次嘗試從服務器下載修復后的補丁或者替代性的新補丁。