Проблема с установщиком Wix: почему RestartManager помечает Service как RMCritical, а не RMService - PullRequest
4 голосов
/ 02 августа 2011

Я пытаюсь запретить нашим установщикам wix запрашивать перезагрузку при удалении. Наши услуги должны быть удалены и удалены при удалении. К сожалению, для нас RestartManager подсказывает пользователю, что во время действия InstallValidate потребуется перезагрузка. Это действие происходит задолго до действий StopServices и DeleteServices.

Проверяя журналы, кажется, что RestartManager считает, что наш сервис является критическим процессом:

"Обнаружено приложение с идентификатором 1234, понятным именем 'abc', коротким именем службы 'xyz', типом RmCritical и статусом 1 содержит файлы [s] в использовании."

Службы установлены и работают под локальной системной учетной записью. Я не уверен, но я думаю, что если RestartManager возвращал RmService вместо RmCritical, то это не было бы причиной перезагрузки.

Любая помощь высоко ценится.

EDIT: MSDN утверждает, что для RMCritical: Для завершения установки требуется перезагрузка системы, поскольку процесс не может быть остановлен. Процесс не может быть остановлен по следующим причинам. Процесс может быть критическим процессом. Текущий пользователь может не иметь разрешения на завершение процесса. Процесс может принадлежать основному установщику, который запустил менеджер перезапуска.

У пользователя есть разрешение на отключение служб, и эти службы не имеют ничего общего с msiexec, поэтому я могу только предположить, что наш сервис считается критическим процессом ... но почему?

Ответы [ 3 ]

4 голосов
/ 16 ноября 2011

Вы можете отключить RestartManager окна, установив свойство MSI MSIRESTARTMANAGERCONTROL = «Отключить» (см. Документацию здесь - http://msdn.microsoft.com/en-us/library/windows/desktop/aa370377(v=vs.85).aspx).. Единственная проблема с этим подходом сама по себе состоит в том, что вместо того, чтобы предлагать пользователям диалоговое окно с требованием перезагрузки, они увидят диалоговое окно с файлом при использовании (и их попросят закройте все приложения, которые могут использовать эти файлы / службы.) Это диалоговое окно отображается во время стандартного действия InstallValidate последовательности InstallExecute.

Если вы хотите скрытно обойти любое из этих диалогов, вы можете запланировать настраиваемое действие перед InstallValidate, которое вручную отключит все работающие службы, прежде чем RestartManager сможет осмотреть систему. Это не соответствует стандартным практикам MSI, потому что обычно вы отмечаете настраиваемое действие, которое изменяет систему как «отложенное» действие, но MSI не позволяет выполнять отложенные действия до InstallValidate. Таким образом, вам нужно будет пометить действие как «немедленное», но в коде вы продолжите и измените систему, закрыв службы. Недостатком здесь является то, что не существует такой вещи, как немедленное действие отката, поэтому, если при удалении / обновлении происходит сбой и происходит откат, службы, которые вы остановили, останутся в остановленном состоянии. Положительным моментом является то, что пользователям никогда не нужно видеть никаких дополнительных диалогов во время их удаления / обновления.

0 голосов
/ 13 января 2017

Диспетчер перезапуска обычно не запрашивает какие-либо ситуации использования файлов для служб, помеченных для остановки в текущей операции. Другими словами, он просматривает таблицу ServiceControl, чтобы увидеть, будет ли служба все равно остановлена, и не будет автоматически запрашивать файлы, которые используются.

К сожалению, однажды это поведение было скомпрометировано ошибкой - была проверена только первая запись в таблице ServiceControl. Я не знаю, была ли эта ошибка когда-либо задокументирована, поэтому я не могу ничего цитировать. Оригинальный вопрос был опубликован в 2011 году, поэтому я предполагаю, что этот конкретный вопрос был исправлен. Единственными проблемами такого рода, которые возникают в настоящее время, являются, как правило, ситуации, когда сервис в некотором смысле является многопроцессорным, или в оболочке (некоторые java-сервисы похожи на это), или когда сервис действительно перестает быть сервисом, но содержащийся процесс не завершить быстро, или ServiceControl не делает полного ожидания, и он все еще фактически работает.

0 голосов
/ 03 февраля 2015

Также столкнулся с этим.

Проблема в том, что менеджер перезапуска НЕ ​​считает, что у пользователя есть разрешение на остановку службы, даже если это происходит, потому что во время проверки (InstallValidate) установка имеетеще не повышен.

Мое решение - дать группе пользователей разрешение на запуск и остановку службы.Я использовал команду sc sdset для изменения разрешений службы.

Или вы можете использовать загрузчик для запуска MSI после повышения.

...