2016-04-27 5 views
2

Я хочу знать, как и когда в конкретном случае служба пытается остановить, если она отмечена как 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) : process hierarchy of the service 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 символов).

ответ

1

InstallValidate не останавливает службы - это делается действием StopServices. InstallValidate пытается выяснить, какие файлы используются (с Restart Manager) и показать диалоговое окно «Файлы в использовании». В тех случаях, когда это касается служб, он игнорирует любые файлы, используемые службами, находящимися в таблице ServiceControl, с настройкой «stop at uninstall». Если вы хотите убедиться, что служба полностью остановлена, используйте wait = «yes». Это стандартный вызов обработчика управления стоп-сервисом.

Если служба отключает кучу процессов, которые остаются запущенными, это просто обычная проблема с файлами, и службы не имеют отношения к делу. Эти процессы нуждаются в выключенном вызове (из службы?), Или они должны интегрироваться с Restart Manager, такого рода вещи: http://www.codeproject.com/Articles/772868/Restart-Manager-Support-For-Windows-Application

Если процесс отвечает на сообщения Windows, WiX использует CloseApplication, он должен закрыть его.

Я укажу, что у вас может быть ошибка в вашем WiX, где служба, названная в вашем ServiceControl, неверна. Поскольку вы можете управлять любой услугой (а не только той, которую вы устанавливаете/удаляете), нет никакой проверки, что имя соответствует вашей службе или любому другому.Если вы никогда не видите, что вызов службы управления называется вызываемым, это самое простое объяснение.

+0

См. Редактирование. Элемент ServiceControl содержит правильное имя. – Karl

+0

Возможно, стоит сделать удаление и создать подробный журнал, чтобы узнать, что он говорит о StopServices. msiexec/x {product guid}/l * vx <путь к файлу журнала> – PhilDW

+0

Уже сделал это - см. edit. Я добавил лог-вывод к вопросу. Дело не в StopServices. Это останавливает приложение и завершает все процессы (в течение нескольких секунд). В любом случае, это запланировано ПОСЛЕ InstallValidate. InstallExecuteSequence содержит InstallValidate с 1400 и StopServices с 1900. RESTART MANAGER жалуется на --- as.exe. Нужно ли, чтобы все дочерние процессы службы включали какую-то особую вещь, чтобы диспетчер перезагрузки знал, что она была прекращена службой, если она остановлена? – Karl

 Смежные вопросы

  • Нет связанных вопросов^_^