Windows

從 Windows 服務的上下文中,我如何確定 Windows 更新目前是否正在執行?

  • March 27, 2020

我有一項服務在啟動時進行了一些系統配置,但遇到了一個問題,即 Windows 更新同時執行並啟動了重新啟動,這中斷了我的服務正在執行的操作,並且我的配置被破壞了。我想將服務啟動延遲到 Windows 更新完成並完成任何重新啟動之後。有沒有辦法告訴更新目前正在執行?然後我可以讓我的服務等待並在下次啟動或更新完成時恢復。將我的服務標記為自動(延遲啟動)是否有幫助?

編輯:我嚴格控制是否啟用/禁用 Windows 更新服務,作為配置的一部分,我手動啟用服務並安裝特定更新。通常這會導致錯誤程式碼 3010,這意味著需要重新啟動機器並完成更新。因此,在重新啟動後,我會從我的服務中繼續進行進一步的配置更新。

經過進一步調查,這是由於 Windows 更新啟動失敗而發生的。我在 CBS 日誌中看到了這一點:

2020-03-26 21:05:54, Info                  CBS    Startup: Failed, restart required to try again.
2020-03-26 21:05:54, Info                  CBS    Startup: Processing complete. [HRESULT = 0x80070bc2 - ERROR_SUCCESS_REBOOT_REQUIRED]
2020-03-26 21:05:54, Info                  CBS    Keeping Trusted Installer as auto-start
2020-03-26 21:05:54, Info                  CBS    Winlogon: Checking to see if CreateSessionNotify has been called at least once.
2020-03-26 21:05:54, Info                  CBS    Winlogon: CreateSessionNotify has been called
2020-03-26 21:05:54, Info                  CBS    Winlogon: Simplifying Winlogon CreateSession notifications
2020-03-26 21:05:54, Info                  CBS    Startup: received notification that startup processing completed and a restart has been initiated.
2020-03-26 21:05:54, Info                  CBS    A restart has been initiated

之後我的服務重新啟動了機器並恢復了其配置,但 Windows 更新隨後同時執行並重新啟動了我。在另一台機器上這沒有發生,我在 CBS 日誌中有這些消息:

2020-03-26 21:01:50, Info                  CBS    Startup: Retrying failed packages.
2020-03-26 21:01:50, Info                  CBS    Startup: Processing complete. [HRESULT = 0x00000000 - S_OK]
2020-03-26 21:01:50, Info                  CBS    Enabling LKG boot option
2020-03-26 21:01:50, Info                  CBS    Setting ServicingInProgress flag to 0
2020-03-26 21:01:50, Info                  CBS    Startup processing completed. [HRESULT = 0x00000000]
2020-03-26 21:01:50, Info                  CBS    Winlogon: Simplifying Winlogon CreateSession notifications
2020-03-26 21:01:50, Info                  CBS    Winlogon: Deregistering for CreateSession notifications
2020-03-26 21:01:50, Info                  CBS    Startup: received notification that startup processing completed, allowing user to logon
2020-03-26 21:01:50, Info                  CBS    Startup processing complete, Trusted Installer will now wait around for a little while to see if any clients show up.

我不確定如何區分這兩種情況,Windows Update 已完成並需要重新啟動,以及它本質上將重新啟動並重試,而不是解析此日誌。我正在尋找某種狀態或狀態來指示 Windows 更新正在做什麼。

感謝這裡的其他答案,我發現這個值似乎是一個非常可靠的指標,表明受信任的安裝程序仍在做事:

[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Interface]
 DWORD ServicingInProgress

根據我的實驗,如果受信任的安裝程序正在做某事,它將是非零的。如果為 0,則受信任的安裝程序已完成工作。

Windows 更新是一個複雜的野獸。

看起來停止和禁用Windows Update服務可以解決問題,但這只是冰山一角;該服務僅檢查更新可用性並啟動更新過程,該過程實際上由Windows Modules Installer服務(又名TrustedInstaller)處理。

更糟糕的是,實際的更新安裝是一個三步過程:下載並安裝更新時,實際上只安排在下次重啟時安裝;部分更新安裝發生在系統關閉期間,部分發生在後續引導期間;如果這部分由於某種原因失敗,系統會重新啟動並回滾更新安裝,之後甚至可以再次重新啟動系統;即使成功,某些更新(例如真正的大更新)也可能需要重新啟動兩次

但更糟糕的是:您不能簡單地應用更新然後禁用該Windows Modules Installer服務,因為那樣您就不會安裝任何東西:該服務是在重新啟動時執行實際更新安裝的。如果要應用更新,則需要在重新啟動系統時保持服務處於活動狀態;這意味著如果感覺如此,該服務將可以免費再次重新啟動系統。

如果您想完全阻止 Windows Update 干擾您的操作,則需要停止並禁用該Windows Update服務和該Windows Modules Installer服務;但是您將無法手動安裝更新,因為它們需要安裝這些服務。

哦,還有錦上添花:該Windows Modules Installer服務還處理啟用或禁用 Windows 角色和功能,因此如果服務停止,這將是不可能的。

引用自:https://serverfault.com/questions/1008609