Отключить windows перезапуск / выключение во время установки программного обеспечения - PullRequest
0 голосов
/ 08 мая 2020

Я разрабатываю инструмент автоматического обновления. Архитектура следующая: у меня есть приложение GUI и служба, которые обмениваются данными между ними; приложение gui устанавливается для запуска при каждом запуске операционной системы, и то же самое делается для службы.

Когда приложение GUI обнаруживает, что доступно новое обновление, оно загружает обновление и запрашивает service, чтобы запустить его в автоматическом режиме (я использовал службу для этой задачи, потому что установщик должен запускаться с правами администратора без вмешательства пользователя). На этом этапе установщик запускается (имейте в виду, что это дочерний элемент службы, поэтому он наследует контекст запуска службы) в автоматическом режиме (в качестве системы установки я использую nsis) и выполняет удаление текущего приложения (он удаляет приложение GUI и его двоичные файлы, останавливает службу / убивает службу и поэтому в основном оно убивает своего отца, удаляет службу из системы и удаляет ее двоичные файлы) и устанавливает новый пакет программного обеспечения, который включает новое приложение gui и новый сервис. Мне интересно, можно ли во время этого процесса удаления / установки избежать выключения системы (поскольку выключение во время этого процесса может привести к повреждению файлов приложения и состояния приложения).

Я читал о WM_QUERYENDSESSION и ShutdownBlockReasonCreate, но поскольку мой установщик работает как дочерний по отношению к службе, он запускается в сеансе 0, поэтому, как указано здесь https://devblogs.microsoft.com/oldnewthing/20151002-00/?p=91461, я не могу их использовать. Я также не могу использовать флаг SERVICE_ACCEPT_PRESHUTDOWN, потому что установщик обновляет службу (поэтому флаг не будет иметь никакого эффекта после удаления службы).

Не могли бы вы предложить решение проблемы, указанной выше? Я также готов пересмотреть свою программную архитектуру, если в текущей архитектуре нет других вариантов.

Спасибо

1 Ответ

0 голосов
/ 08 мая 2020

Я могу придумать 3 различных возможных решения:

  • Используйте подписанный установщик MSI и UA C исправление . Первоначальная установка должна быть повышена, но подписанные исправления могут быть установлены не администраторами.

  • Использовать версионные службы; установите его в подпапку, названную в зависимости от версии. Старая служба должна будет запускать новую службу как обычный процесс, а обычный процесс останавливает старую службу, обновляет двоичный путь службы, а затем запускает службу в качестве первых шагов процесса обновления. Это должно позволить вам использовать SERVICE_ACCEPT_PRE­SHUTDOWN.

  • Используйте службу, чтобы запустить вспомогательный процесс в сеансе интерактивного рабочего стола с помощью WTSQueryUserToken + CreateProcessAsUser. Этот процесс должен иметь возможность блокировать завершение работы.

...