Ответ 1
sc delete "service name"
удалит службу. Я нахожу, что утилиту sc гораздо проще найти, чем копать для installutil. Не забудьте остановить службу, если вы еще этого не сделали.
Мой текущий проект предполагает развертывание обновленного файла .exe, который работает как служба Windows. Чтобы перезаписать существующий .exe с новой версией, мне в настоящее время необходимо:
Я бы хотел избежать перезагрузки, так что это может быть полностью перезаписанное/автоматическое обновление.
Есть ли способ избежать перезагрузки? Может быть, инструмент командной строки, который заставит Windows отказаться от смертельной схватки на старом .exe?
sc delete "service name"
удалит службу. Я нахожу, что утилиту sc гораздо проще найти, чем копать для installutil. Не забудьте остановить службу, если вы еще этого не сделали.
Не удается ли остановить службу до обновления (и перезапустить после обновления), используя приведенные ниже команды?
net stop <service name>
net start <service name>
Всякий раз, когда я тестирую/развертываю службу, я могу загружать файлы без переустановки, пока служба остановлена. Я не уверен, что проблема у вас другая.
У меня была такая же проблема, как и вы. У меня есть системная служба, которую я хочу удалить, а затем переустановить как часть обновления. В некоторых системах это не будет работать без перезагрузки. Проблема заключалась в том, что вызов DeleteService() вернется в норму, но следующий вызов CreateService() скажет мне, что служба все еще существует, но помечена для удаления (код ошибки 1072). Реестр будет отражать это, поскольку подраздел был все еще там (под HKLM\System\CurrentControlSet\Services), но для параметра "DeleteFlag" было установлено значение 1. С этого момента только перезагрузка может исправить ситуацию.
Некоторые вещи, которые не работают:
Но вот что сработало:
В некоторых статьях в stackoverflow я заметил, что net.exe имеет функции запуска/остановки (я знал только о утилите sc.exe). И как ни странно, работала "net stop svcname" плюс "sc delete svcname"! Поэтому net.exe должен делать то, что я не делаю.
Но net.exe не содержит импорт для ControlService(), поэтому как остановить службу? Я узнал, что net.exe запускает net1.exe, но net1.exe не импортирует ControlService(). Я использовал большую утилиту API Monitor (http://www.rohitab.com/apimonitor), чтобы узнать, что делает net1.exe, но он никогда не называл ничего перспективного.
Но потом я увидел, что он импортирует NetServiceControl() из NETAPI32.DLL(у которого было хотя бы "Сервис" в его имени!). MSDN говорит, что эта функция устарела. Тем не менее, я нашел прототип в LMSvc.h и некоторые описания параметров здесь: http://cyberkinetica.homeunix.net/os2tk45/srvfpgr/369_L2_NetServiceControlorN.html. Когда вы загружаете NETAPI32.DLL и используете NetServiceControl(NULL, service_name, 3, 0, 0)
(3 для SERVICE_CTRL_UNINSTALL, который используется для остановки), служба останавливается впоследствии. И он может быть удален и переустановлен впоследствии без DeleteFlag или перезагрузиться!
Таким образом, это никогда не было проблемой удаления, но чтобы остановить обслуживание должным образом. И NetServiceControl() делает трюк. Извините за длинный пост, но я подумал, что это может помочь кому-то с похожими проблемами. (Только для справки, я использую Win7 SP1 x64.)
Если в .net(я не уверен, что он работает для всех служб Windows)
Если я не изменяю общедоступный интерфейс службы, я часто развертываю обновленные версии своих сервисов, даже не заучивая/переустанавливая... ALl Я делаю это, останавливает службу, заменяет файлы и снова перезапускает службу...
Как отмечено StingyJack и mcbala, а также в отношении комментариев, сделанных Майком L, мой опыт заключается в том, что на машине Windows 2000 при удалении/переустановке сервисов .Net "installutil/u" делает > требуется перезагрузка, даже если служба была остановлена ранее. "sc/delete", с другой стороны, не требует перезагрузки - он удаляет услугу сразу (пока она остановлена).
Я часто задавался вопросом, действительно ли есть веская причина, по которой "installutil/u" требует перезагрузки... "sc/delete" фактически что-то делает неправильно/оставляет что-то висящим?
И Джонатан, и Чарльз правы... сначала нужно остановить службу, а затем удалить/переустановить. Комбинирование их двух ответов делает идеальный пакетный файл или PowerShell script.
Я расскажу о предостережении, который был усердно изучен - Windows 2000 Server (возможно, и клиентская ОС) потребует перезагрузки перед переустановкой, несмотря ни на что. Должен быть раздел реестра, который не полностью очищается, пока он не перезагрузится. Windows Server 2003, Windows XP и более поздние версии ОС не страдают этой болью.
(поэтому Windows выпускает его на файл)
Вместо этого сделайте Ctrl + Alt + Del сразу после остановки службы и убейте .exe службы. Затем вы можете удалить службу без перезагрузки. Это случилось со мной в прошлом, и она решает ту часть, что вам нужно перезагрузить.
Если необходимо вручную удалить службу:
Вам придется перезагрузиться, прежде чем список будет обновлен в сервисах
Я использую InstallUtil.exe, упакованный в .NET Framework.
Использование для удаления: InstallUtil '\ path\to\assembly\with\the\installer\classes'/u, например: installutil MyService.HostService.exe /u
Переключатель /u
означает удаление, без которого утилита выполняет обычную установку службы. Утилита останавливает службу, если она запущена, и у меня никогда не было проблем с Windows, сохраняющей блокировку в служебных файлах. Вы можете прочитать о других опциях InstallUtil на MSDN.
PS: если у вас нет installutil в вашей переменной пути, используйте полный путь следующим образом: C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "C:\MyServiceFolder\MyService.HostService.exe" /u
или если вам нужна 64-битная версия, она может быть найдена в 'C:\Windows\Microsoft.NET\Framework64\v4. 0.30319\'. Номер версии в пути зависит от версии .NET.