Я хочу знать, как и когда в конкретном случае служба пытается остановить, если она отмечена как Remove="uninstall" Stop="uninstall"
в файле проекта WiX.MSI: Как служба остановлена при удалении во время InstallValidate - может ли это работать?
Почему я спрашиваю: При удалении служба RESTART MANAGER не распознает или обрабатывает, что приводит к «диалогу перезапуска».
Я подключил отладчик к сервису и понял, что его никогда не пытались остановить - по крайней мере, не через зарегистрированный ControlHandler. Я предполагал, что он будет остановлен так же, как выполнение «sc stop servicename» или прекращение его через Service-Dialog. Сама служба написана на C++, а обработчик зарегистрирован RegisterServiceCtrlHandler
, который работает нормально с обоими общими случаями. При остановке службы вызывается обработчик. Не так, если он остановлен/удален через MSI.
Кстати, как указано в ответе jbudreau в Wix Installer Problem: Why does RestartManager mark Service as RMCritical and not RMService, служба может быть остановлена в разделе InstallValidate, если служба работает как LocalSystem? В InstallValidate процесс удаления еще не повышен.
Некоторое объяснение того, как процесс остановки службы LocalSystem работает над удалением, будет отличным!
Заранее благодарен!
EDIT: Вот мое определение сервиса с ServiceInstall и ServiceControl:
<DirectoryRef Id="BINDIR">
<!-- the service -->
<Component Id="myProgramsvc.exe" Guid="1f64c03f-26ea-47ba-985c-2a566afffffa">
<File Id="myProgramsvc.exe" KeyPath="yes" Vital="yes"
Source="SourceDir\bin\myProgramsvc.exe"/>
<ServiceInstall Id="MyProgramSvc" Type="ownProcess"
Vital="yes" Name="MyProgramSvc" DisplayName="Test MyProgram Service"
Description="Test MyProgram Service" Start="auto" Account=".\LocalSystem"
ErrorControl="normal" Interactive="no" Arguments="--run"/>
<ServiceControl Id="MyProgramSvc" Name="MyProgramSvc" Wait="yes" Remove="uninstall" Stop="uninstall" Start="install"/>
</Component>
</DirectoryRef>
и иерархии процессов, где RestartManager жалуется о ---- as.exe (PID: 4312) : EDIT 2: (идентификатор 9324 отличается от экрана, взял из файла журнала в виде differenty TRY)
MSI (s) (BC:38) [16:46:14:141]: RESTART MANAGER: Detected that application with id 9324, friendly name '---as.exe', of type RmCritical and status 1 holds file[s] in use.
MSI (s) (BC:38) [16:46:14:141]: RESTART MANAGER: Did detect that a critical application holds file[s] in use, so a reboot will be necessary.
EDIT 3: Файл журнала: uninstall.log - файл журнала слишком велик для размещения здесь (ограничение 30000 символов).
См. Редактирование. Элемент ServiceControl содержит правильное имя. – Karl
Возможно, стоит сделать удаление и создать подробный журнал, чтобы узнать, что он говорит о StopServices. msiexec/x {product guid}/l * vx <путь к файлу журнала> – PhilDW
Уже сделал это - см. edit. Я добавил лог-вывод к вопросу. Дело не в StopServices. Это останавливает приложение и завершает все процессы (в течение нескольких секунд). В любом случае, это запланировано ПОСЛЕ InstallValidate. InstallExecuteSequence содержит InstallValidate с 1400 и StopServices с 1900. RESTART MANAGER жалуется на --- as.exe. Нужно ли, чтобы все дочерние процессы службы включали какую-то особую вещь, чтобы диспетчер перезагрузки знал, что она была прекращена службой, если она остановлена? – Karl