Иногда, когда я удаляю установку (сделанную с помощью WIX), служба остается помеченной для удаления, и пользователь должен перезагрузить компьютер для установки снова. Как я могу проверить, что служба помечена для удаления, и сообщить пользователю перезагрузить компьютер перед другой установкой?Проверьте, отмечена ли служба для удаления
ответ
Вообще говоря, этот сценарий происходит, когда что-то остается запертым на эту услугу, предотвращая Окна из удаление его конфигурации в реестре. (В большинстве случаев это просто апплет Services - services.msc - случайно оставлен случайно в фоновом режиме.)
Для обнаружения я предлагаю вам ознакомиться с CreateService и другими Service API. Например, вы получите ERROR_SERVICE_MARKED_FOR_DELETE при вызове CreateService, если служба помечена для удаления.
Что касается предлагаемого решения по перезагрузке ... Windows продвинулась достаточно далеко, чтобы не требовать перезагрузки практически по любой причине. Если вы не устанавливаете специализированные драйверы ядра, вам не нужно перезагружаться. Не ленитесь! Помните об этом! Я рекомендую изменить логику установщика, чтобы обнаружить потенциально конфликтующие запущенные программы, такие как апплет Services, и предложить закрыть.
Как вы можете определить, загружен ли сервисный апплет в mmc? – vkrzv
Вот сообщение, которое может вам помочь. Хотя исходный вопрос касается установки сервиса, ответ также касается удалений и статусов.
How to install a windows service programmatically in C#?
Вот статья, которая объясняет, почему вы можете получить «помеченные для удаления» сообщение в первую очередь и как получить вокруг него.
EDIT
комментария Пер Кристофер Художника, я обновляю этот ответ на намерение распространения передового опыта. Хотя получение сообщения «помечено для удаления» чаще всего было (по моему опыту) результатом того, что консоль services.msc, а не нереализованные ресурсы, запись пользовательского действия для перезагрузки - это не самый лучший способ.
Чтобы запланировать перезагрузку после обработки WiX, использовать WiX XML (объясняется, как с Wix # here) следующим образом:
<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
...
<InstallExecuteSequence>
<ScheduleReboot After="InstallFinalize"/>
<InstallExecuteSequence>
</Wix>
Было бы хорошо, если бы был объяснен -1. – bitxwise
WiX использует установщик Windows, который поддерживает установку/удаление служб. Любая попытка написать пользовательские действия в установщике считается плохой практикой. См.: Http://robmensching.com/blog/posts/2007/8/17/Zataoca-Custom-actions-are-generally-an-admission-of-failure –
Спасибо за объяснение. Я согласен со многими моментами, сделанными в сообщении в блоге, которое вы связали, однако я не совсем согласен с вашей интерпретацией сообщения. Не пытайтесь начать войну, но автор сообщения подчеркнул, что пользовательские действия GENERALLY обескуражены из-за перечисленных причин того, почему разработчики будут писать пользовательские действия. При этом OP, вероятно, должен использовать
Вы используете элемент/таблицу ServiceControl для остановки службы во время удаления? Если да, прекращается ли ваше обслуживание? Если нет, ознакомьтесь с тем, что происходит внутри вашего сервиса, чтобы убедиться, что он освобождает все его ресурсы и изящно отключается по запросу.
Вам не нужно писать какие-либо пользовательские действия для программного вызова API SCM. Установщик Windows должен иметь возможность справиться с этим для вас.
Это не отвечает на вопрос. Некоторые службы просто не могут быть остановлены, например. когда служба принадлежит драйверу устройства, который нельзя безопасно выгружать. – Ilya
Точка зрения, которую вы пропустили, заключается в том, что это не проблема с установщиком и просмотр кода службы. Если служба не может быть остановлена, не просите установщика ее остановить. –
Целью вашего деинсталлятора является удаление службы. Деинсталлятор должен сначала остановить его, но если он не остановить, то он все равно должен удалить его (что будет означать его удаление при остановке системы). Если пользователь решил не перезапускаться в конце вашего деинсталлятора, а затем переустанавливается, он может столкнуться с проблемой, когда установщик попытается снова создать службу. – Ilya
Я не могу найти API способ сделать это (который не предполагает вызова либо CreateService
или DeleteService
, оба имеют нежелательные побочные эффекты), но HKLM\SYSTEM\CurrentControlSet\Services\ServiceName
содержащий значение DeleteFlag=1
(REG_DWORD), кажется, довольно свидетельствует о это несчастливое состояние.
В моем случае служба была отмечена для удаления после ее удаления, потому что я не располагал объект должным образом (соединение rabbitmq в моем случае).
Это не прямой ответ на вопрос, но может помочь решить корень проблемы.
- 1. Решите «Указанная служба была отмечена для удаления» с помощью bat
- 2. Проверьте, отмечена ли определенная группа флажков
- 3. Проверьте, отмечена ли отмеченная ячейка флажком
- 4. Проверьте, была ли ранее отмечена радиокнопка
- 5. Проверьте, работает ли служба?
- 6. Проверьте, существует ли служба
- 7. Проверьте, существует ли веб-служба
- 8. Проверьте, работает ли служба Windows?
- 9. Проверьте, существует ли служба WCF
- 10. установка службы windows из командной строки «Указанная служба была отмечена для удаления»
- 11. Установка/Удаление служб в Windows 7: «Ошибка 1001. Указанная служба была отмечена для удаления»
- 12. Проверьте, работает ли служба в WiX
- 13. Проверьте, отмечена ли одна из переключателей в div.
- 14. MSBuild. Проверьте, установлена ли служба Windows.
- 15. Проверьте, есть ли у вас служба wcf.
- 16. Android: проверьте, работает ли служба. bindService
- 17. Служба Windows: проверьте, запущена ли базовая услуга
- 18. Проверьте, работает ли определенная служба на Ubuntu
- 19. Проверьте, существует ли служба Windows с Python
- 20. Проверьте, работает ли служба из радиовещательного приемника
- 21. Проверьте, существует ли служба с Ansible
- 22. Проверьте, работает ли служба SQL Server
- 23. Проверьте, не работает ли внешняя служба
- 24. Проверьте, запущена ли служба Windows при загрузке
- 25. android: проверьте, работает ли служба, не работает
- 26. Проверьте, работает ли служба на Android?
- 27. Проверьте, включена ли служба DTC в C#
- 28. Состояние запуска - проверьте, работает ли служба
- 29. Угловая служба удаления?
- 30. Командная строка: проверьте, запущена ли служба Windows или нет
Не уверен, что вы можете найти его из 'ServiceController':' ServiceController.GetServices() ', но стоит попробовать. –