从 Windows 服务的上下文中,我如何确定 Windows 更新当前是否正在运行?

从 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 更新已完成并需要重新启动以及它本质上将重新启动并重试这两种情况。我正在寻找某种状态或状态来指示 Windows 更新正在做什么。

答案1

Windows 更新是一个复杂的系统。

看起来停止和禁用Windows Update服务可以解决问题,但这只是冰山一角;该服务仅检查更新可用性并启动更新过程,这实际上是由服务Windows Modules Installer(又名TrustedInstaller)处理的。

更糟糕的是,实际的更新安装是一个三步过程:下载并安装更新后,实际上只会安排在下次重启时安装;更新安装的一部分发生在系统关闭期间,另一部分发生在后续启动期间;如果这部分由于某种原因失败,系统将重新启动并回滚更新安装,之后系统甚至可以再次重新启动;即使成功,某些更新(例如非常大的更新)也可能需要重新启动。

但还有更糟糕的情况:您不能简单地应用更新然后禁用服务Windows Modules Installer,因为这样您就什么都安装不了了:该服务才是在重启时执行实际更新安装的服务。如果您想应用更新,则需要在重启系统时保持服务处于活动状态;这意味着如果愿意的话,该服务可以自由地再次重启系统。

如果你想彻底阻止 Windows Update 干扰你的操作,你需要停止并禁用该Windows Update服务以及该Windows Modules Installer服务;但这样一来,你将无法手动安装更新,因为它们需要那些服务才能安装。

哦,还有锦上添花的是:该Windows Modules Installer服务还负责启用或禁用 Windows 角色和功能,因此如果服务停止,这将无法执行。

答案2

感谢这里的其他答案,我发现这个值似乎是一个非常可靠的指标,表明受信任的安装程序仍在执行操作:

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

根据我的实验,如果 Trusted Installer 正在执行某项操作,则该值将不为零。如果该值为 0,则表示 Trusted Installer 已完成工作。

答案3

将 Windows 更新服务设置为手动启动。然后让您的服务在完成其他例程时触发 Windows 更新服务的启动。

相关内容