2013-11-11 2 views
2

У меня возникла сложная проблема, пытающаяся выполнить следующее: мое приложение устанавливает службу (watchdog.exe) и exe-файл (app.exe).Убейте мое приложение во время удаления

После завершения установки начинается сервис и создается процесс «app.exe».

во время удаления Я хочу убить процесс «app.exe» (который работает под локальной системной учетной записью, поэтому я должен работать как admin).

проблема 1: Установки говорят о необходимости перезагрузки, так как он видит, что файл «app.exe» удерживается (работает) во время фазы CostFinalize (пожалуйста, исправьте меня, если я ошибаюсь в фазе, которая проверяет если потребуется перезагрузка). Было бы намного лучше убить процесс, когда начнется деинсталляция. Я проверил, что если процесс не выполняется во время удаления, тогда установка не жалуется на необходимость перезагрузки.

проблема 2: использование пользовательского действия для уничтожения процесса является проблематичным. действие должно выполняться с повышением, но, с другой стороны, оно должно выполняться до параметра costFinalize (в противном случае оно возвращается к проблеме 1).

Буду признателен за любые предложения. Кроме того, любые альтернативные решения (есть ли другой способ закрыть процесс, возможно, во время установки, которая не потребует перезагрузки?)

Код пользовательского действия, который у меня есть (не очень хорошо, поскольку он и без необходимости запрашивает перезагрузку, убить процесс из-за отсутствия разрешений):

<InstallExecuteSequence> 
    <!--<ScheduleReboot After="InstallFinalize" />--> 
    <Custom Action="MyProcess.TaskKill" Before="InstallValidate"></Custom> 
</InstallExecuteSequence> 

<!--<Property Id="Net">Net.exe</Property>--> 
<Property Id="QtExecCmdLine" Value='"[%SYSTEMROOT]\System32\taskkill.exe" /F /IM App.exe' /> 
<CustomAction Id="MyProcess.TaskKill" 
       BinaryKey="WixCA" 
       DllEntry="CAQuietExec" 
       Execute="immediate" 
       Return="ignore" /> 

Вот журнал для отказа:

CAQuietExec: Ошибка 0x80070001: Командная строка возвращается сообщение об ошибке. CAQuietExec: Ошибка 0x80070001: Ошибка CAQuietExec CustomAction MyProcess.TaskKill возвратил действительный код ошибки 1603 (обратите внимание, что это не может быть на 100% точным, если перевод произошел внутри песочницы) Действие завершено 18:15:54: MyProcess.TaskKill. Возвращаемое значение 1603.

ответ

1

Есть несколько идей, которые у меня есть, а именно:

  • Используйте EventWaitHandles, которые позволяют процессам взаимодействовать друг с другом, и передать ваше желание App.exe. При необходимости ваш app.exe может завершиться. Это чистое решение и должно быть предпочтительным.

Если по каким-либо причинам вы решили убить приложение, как вы не заботятся ни о чем вообще в мире, то вы можете:

  • Я видел сегодня проект, который может запустить MSI полностью на всех этапах. Это был шаблон Visual Stdio, но я не могу найти его прямо сейчас, но знаю, что он существует. Вы также можете использовать это, может быть, это работает: How do I get WiX installer to request administrative privileges?

В принципе есть очень много повозка, запряженная волами трюков вы можете сделать, чтобы убить приложение. Например, используя WiX Burn и требуя прав администратора, а затем делайте свое дело.Я бы пошел с решением № 1 (создайте свои собственные механизмы)

Кстати, если вы используете элемент ServiceControl в WiX, он остановит службу до REINSTALLING/UNISTALLING. Вы можете подключиться к методу OnStop() в службе и убить там App.exe. Если вы установили Service as App.exe родительский, тогда должен быть флаг, что любые дочерние процессы умирают с родителем.

+0

Из-за соображений безопасности я предпочитаю убивать приложение «как будто мне все равно». Запуск установщика в качестве администратора с самого начала разрешил бы мою проблему, но до сих пор 2-е решение не сработало для меня - wix начался нормально и запросил возвышение только во время установки (после того, как он не смог убить процесс и дал мне знать об этом требуется перезагрузка). Я попробую поиграть с решением № 2 еще раз, чтобы посмотреть, смогу ли я заставить его работать. – OSH

+0

Ну, это уже небезопасно, чтобы другие приложения могли убить ваше приложение. Представьте, что ваше программное обеспечение что-то делает, и его убивают по уважительной причине. Это требует неприятностей. –

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