從 Windows 服務的上下文中,我如何確定 Windows 更新目前是否正在執行?
我有一項服務在啟動時進行了一些系統配置,但遇到了一個問題,即 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 角色和功能,因此如果服務停止,這將是不可能的。