У меня есть служба, которая выполняет некоторую конфигурацию системы при запуске и только что столкнулась с проблемой, когда обновления Windows запускались одновременно и инициировали перезагрузку, которая прервала работу моей службы, и у меня была сломанная конфигурация. Я хотел бы отложить запуск службы до тех пор, пока не будут завершены обновления Windows и все перезагрузки. Есть ли способ узнать, что в настоящее время выполняются обновления? Тогда я могу просто подождать и возобновить работу службы при следующем запуске или после завершения обновления. Поможет ли пометить мою службу как автоматический (отложенный запуск)?
РЕДАКТИРОВАТЬ: Я строго контролирую, включена / отключена служба Windows Update, и в рамках конфигурации я вручную включаю службу и устанавливаю определенные обновления. Обычно это приводит к ошибке с кодом 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.
Центр обновления Windows - сложный зверь.
Похоже на остановку и отключение Windows Update
сервис мог бы помочь, но это лишь верхушка айсберга; эта служба только проверяет наличие обновлений и запускает процесс обновления, который фактически обрабатывается Windows Modules Installer
сервис (он же TrustedInstaller
).
Хуже того, фактическая установка обновления представляет собой трехэтапный процесс: когда обновление загружается и устанавливается, оно фактически запланировано только для установки при следующей перезагрузке; часть установки обновления происходит во время выключения системы, а часть - во время последующей загрузки; если эта часть по какой-то причине выходит из строя, система перезагружается и установка обновления откатывается, после чего систему можно даже перезагрузить снова; и даже если это удастся, некоторые обновления (например, действительно большие) могут потребовать два перезагружается.
Но есть еще хуже: вы не можете просто применить обновление, а затем отключить Windows Modules Installer
service, потому что в этом случае вы ничего не устанавливаете: именно эта служба выполняет фактическую установку обновлений при перезагрузке. Если вы хотите применить обновление, вам нужно оставить службу активной при перезагрузке системы; а это значит, что сервис сможет снова перезагрузить систему, если захочет.
Если вы хотите полностью запретить Центру обновления Windows вмешиваться в ваши действия, вам необходимо остановить и отключить оба Windows Update
сервис и Windows Modules Installer
служба; но тогда вы не сможете устанавливать обновления вручную, потому что для их установки требуются эти службы.
О, и еще есть глазурь на торте: Windows Modules Installer
service также обрабатывает включение или отключение ролей и функций Windows, поэтому это будет невозможно сделать, если служба остановлена.
Благодаря другим ответам здесь я обнаружил, что это значение кажется довольно надежным индикатором того, что Trusted Installer все еще что-то делает:
[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Interface]
DWORD ServicingInProgress
Судя по моим экспериментам, если надежный установщик что-то делает, он будет отличным от нуля. Если он равен 0, то надежный установщик работает.
Установите службу Центра обновления Windows на запуск вручную. Затем пусть ваша служба запустит службу Центра обновления Windows, когда она завершит другую процедуру.