WiX: удаление не останавливает и не удаляет мою службу Windows

Я новичок в WiX, но в прошлом я кое-что делал с Installshield и установщиком Windows.

У меня есть, как мне кажется, довольно простой установщик, который настраивает службу Windows. Он устанавливает его в разделе «NT AUTHORITY \ NETWORK SERVICE», если это имеет значение.

Установка работает нормально, но во время удаления я получаю сообщение: «Программа установки должна обновить файлы или службы, которые не могут быть обновлены во время работы системы. Если вы решите продолжить, для завершения установки потребуется перезагрузка». Если я нажму «ОК», все будет удалено, кроме службы (даже после перезагрузки). Он все еще запущен, и exe, связанный со службой, тоже остается.

Я могу вручную остановить и удалить службу без проблем с помощью команды sc.exe.

Кроме того, если бы я остановил службу вручную перед запуском удаления, я не получил бы вышеупомянутого запроса, но результат все тот же. Сервис остается, и файл остается.

Вот часть моего Wix:

<Component Id='cmpService' Guid='{542f970e-ca39-4501-aae4-9e03eaac9a25}' >
    <File Id='ServiceExeFile' Name='nls.service.agent.exe'
            ReadOnly='no' Compressed='yes' KeyPath='yes' Vital='yes' Hidden='no' System='no'
            Checksum='no'  />
    <ServiceInstall Id='MyServiceInstall' DisplayName='RaMP Data Collector' Name='rampDataCollector'
            ErrorControl='normal' Start='auto' Type='ownProcess' Vital='yes'
            Account='NT AUTHORITY\NETWORK SERVICE' />
    <ServiceControl Id='MyServiceControl' Name='rampDataCollector'  
            Start='install' Stop='uninstall' Remove='uninstall' Wait='yes' />
</Component>

я пытался

  • Снятие Аккаунта = 'NT AUTHORITY \ NETWORK SERVICE' и получил тот же результат
  • Поменяв все мои гиды, будьте уверены и получите тот же результат.
  • Посмотрите подробный журнал для обоих сценариев (служба запущена перед удалением и остановлена ​​перед удалением), но я не нашел ничего интересного, что можно было бы расшифровать.

Вот фрагменты из журнала msi, когда я запускаю удаление, и служба сначала останавливается вручную. Я наклеил части на служебный компонент и действия MSI.

MSI (s) (A4:58) [10:44:11:080]: Component: cmpService; Installed: Local;   Request: Absent;   Action: Null
MSI (s) (A4:58) [10:44:11:080]: Component: cmpFolderPermissions; Installed: Local;   Request: Absent;   Action: Absent
MSI (s) (A4:58) [10:44:11:080]: Component: cmpApplicationShortcut; Installed: Local;   Request: Absent;   Action: Absent

А ТАКЖЕ

MSI (s) (A4:58) [10:44:11:876]: Doing action: StopServices
Action ended 10:44:11: SchedSecureObjectsRollback. Return value 1.
Action start 10:44:11: StopServices.
MSI (s) (A4:58) [10:44:11:878]: Doing action: DeleteServices
Action ended 10:44:11: StopServices. Return value 1.
Action start 10:44:11: DeleteServices.
MSI (s) (A4:58) [10:44:11:879]: Doing action: RemoveRegistryValues
Action ended 10:44:11: DeleteServices. Return value 1.

Любая помощь будет оценена.

Я предполагаю, что в крайнем случае я мог бы выполнить настраиваемое действие и остановить / удалить службу при удалении с помощью команды sc.


person Ambro    schedule 27.01.2012    source источник
comment
После некоторого дальнейшего тестирования. Думаю, с exe что-то странно. Если у меня такая же установка, настройте службу с помощью простого тестового exe, она устанавливает и удаляет нормально. Я не совсем уверен, что может быть странного в exe. Мне придется поговорить с разработчиками, которые создали id.   -  person Ambro    schedule 28.01.2012


Ответы (1)


Вы должны понимать, что служебные команды появляются не при удалении установщика, а при удалении компонента. Как написано в журнале, никаких действий не предпринимается.

Это может произойти, если вы нарушите правила для компонентов или обслуживаете приложение вне установщика и испортили счетчик ссылок на компоненты / файлы.

Например, если foo.exe существовал, а затем MSI установил foo.exe, он останется после удаления. Следовательно, служба, связанная с этим, также будет.

person Christopher Painter    schedule 28.01.2012
comment
Хм. Я думаю, вы правы. Я пытаюсь понять, как они могут помочь мне найти, что, должно быть, пошло не так. Я решил попробовать отключить службу и убедиться, что exe не было после некоторого ранее неочищенного удаления. Результат был немного другим. EXE был удален, но служба все еще не использовалась. В журнале все еще говорилось: Component: cmpService; Установлено: Местное; Запрос: отсутствует; Действие: Null - person Ambro; 28.01.2012
comment
Я не уверен, как я мог бы возиться со службой, чтобы она не была удалена, но я должен быть. Есть ли другие мысли или примеры того, как я нарушаю правила компонентов? Должен ли я иметь необходимые DLL для exe в том же компоненте? - person Ambro; 28.01.2012
comment
Мне нужно посмотреть журнал, чтобы узнать больше. Один вопрос: как вы это тестируете? На чистой виртуальной машине со снимками для отката к известному состоянию или на физической машине, которая, возможно, загрязнена в результате предыдущей разработки? - person Christopher Painter; 28.01.2012
comment
Правила для компонентов диктуют, что каждая DLL / EXE должна быть ключевым файлом своего собственного компонента. Существует исключение крайнего случая в отношении определенных публикаций в ситуациях GAC, но здесь это не так. - person Christopher Painter; 28.01.2012
comment
Я сделал ошибку раньше, когда сказал, что exe удаляется. Я забыл, что добавил в свой wix тег removeFile для удаления всех файлов (.) при удалении. - person Ambro; 28.01.2012
comment
Я тестирую его на своей машине разработчика. Согласен, лучше бы на чистом виртуале это сделать. То, что вы сказали о dll / exe и компонентах, - это то, о чем я думал и что у меня есть (в основном один файл на компонент). - person Ambro; 28.01.2012
comment
Вам нужно повторить тест на чистой машине, и я подозреваю, что вы обнаружите, что она действительно работает. Единственный способ заставить его работать на вашей грязной машине разработчика - это пройти через реестр и очистить все компоненты и количество ссылок на файлы, чтобы вернуться в это чистое состояние. Тогда он будет работать на вашем компьютере разработчика. Но помните, вы никогда не должны тестировать установщики на своей машине Dev, пока они не станут зрелыми и не пройдут всестороннее тестирование QA. - person Christopher Painter; 28.01.2012
comment
Ты делаешь доброе дело. Сделаю чистый тест в офисе в понедельник. Если вы хотите взглянуть на мой файл журнала, я помещаю его сюда ссылка I не совсем понимал, как лучше всего поделиться здесь файлом. - person Ambro; 28.01.2012
comment
Мне нужно больше подробностей в этом журнале. msiexec / x foo.msi / l v uninstall.log (l v является подробным) - person Christopher Painter; 28.01.2012
comment
Извините за многословие журнала. Я, должно быть, пренебрегал * v. Ну как обычно оказывается наиболее очевидное решение. Сегодня я тестировал чистую виртуальную машину, и каждый раз она работала нормально. Я чувствую себя глупо из-за того, что не сделал этого раньше. Спасибо, Кристофер! - person Ambro; 31.01.2012