Как удалить службу Windows и удалить ее файлы без перезагрузки - PullRequest
45 голосов
/ 18 ноября 2008

Мой текущий проект предусматривает развертывание обновленного .exe-файла, который работает как служба Windows. Чтобы перезаписать существующий .exe новой версией, мне нужно:

  1. Остановить услугу
  2. Удаление службы
  3. Перезагрузите систему (чтобы Windows выпустила файл)
  4. Развернуть новый .exe
  5. Переустановите сервис
  6. Запустите обновленный сервис.

Я бы хотел избежать перезагрузки, чтобы это было полностью автоматическое обновление по сценарию.

Есть ли способ избежать перезагрузки? Может быть, инструмент командной строки, который заставит Windows отказаться от мертвой хватки на старом .exe?

Ответы [ 9 ]

78 голосов
/ 19 ноября 2008
sc delete "service name"

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

14 голосов
/ 09 июля 2012

У меня была такая же проблема, как и у вас. У меня есть системная служба, которую я хочу удалить, а затем переустановить как часть обновления. На некоторых системах это не будет работать без перезагрузки. Проблема заключалась в том, что вызов DeleteService () возвращался бы нормально, но следующий вызов CreateService () сказал бы, что служба все еще там, но помечена для удаления (код ошибки 1072). Реестр будет отражать это, так как подраздел все еще там (в разделе HKLM \ System \ CurrentControlSet \ Services), но для «DeleteFlag» установлено значение 1. С этого момента только перезагрузка может исправить ситуацию.

Некоторые вещи, которые не работают:

  • Использование "sc delete": у него были те же проблемы, что и у меня. Вызов вернется нормально, но служба не исчезла и все еще находится в реестре с DeleteFlag = 1.
  • Удаление ключа в реестре. Диспетчер служб, похоже, хранит базу данных в памяти, а реестр является лишь копией для следующей загрузки.
  • Добавление циклов ожидания, ожидание готовности файлов .exe к перезаписи, уничтожение процесса и т. Д.
  • Закрывающие ручки к сервису. Какие из них ??

Но вот что сработало:

В некоторых статьях, посвященных 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 (в названии которого было хотя бы "Service"!). 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.)

14 голосов
/ 18 ноября 2008

Не можете ли вы остановить службу до обновления (и перезапустить после обновления), используя команды ниже?

net stop <service name>
net start <service name>

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

3 голосов
/ 11 марта 2009

Как отмечают StingyJack и mcbala, а также в отношении комментариев, сделанных Майком Л, мой опыт заключается в том, что на компьютере с Windows 2000 при удалении / переустановке служб .Net «installutil / u» делает требуется перезагрузка, даже если служба была ранее остановлена. "sc / delete", с другой стороны, не требует перезагрузки - он сразу удаляет службу (если она остановлена).

Я часто задавался вопросом, действительно ли существует веская причина, по которой «installutil / u» требует перезагрузки ... «sc / delete» действительно что-то делает неправильно или что-то не работает?

3 голосов
/ 18 ноября 2008

Если в .net (я не уверен, работает ли он для всех служб Windows)

  • Остановите службу (возможно, именно поэтому у вас возникли проблемы.)
  • InstallUtil -u [имя исполняемого файла]
  • Installutil -i [имя исполняемого файла]
  • Запустить сервис заново ...

Если я не изменяю открытый интерфейс службы, я часто развертываю обновленные версии своих служб, даже не удаляя и не переустанавливая ... ALl Я делаю это, останавливая службу, заменяя файлы и перезапуская службу снова ...

2 голосов
/ 22 сентября 2010

Если необходимо вручную удалить службу:

  1. Запустите Regedit или regedt32.
  2. Найдите запись ключа реестра для вашей службы под следующим ключом: HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services
  3. Удалить ключ реестра

Вам придется перезагрузиться, прежде чем список обновится в сервисах

2 голосов
/ 19 ноября 2008

(поэтому Windows выпускает его на файл)

Вместо этого выполните Ctrl + Alt + Del сразу после остановки службы и уничтожьте .exe службы. Затем вы можете удалить сервис без перезагрузки. Это случилось со мной в прошлом, и это решает ту часть, которую нужно перезагрузить.

2 голосов
/ 18 ноября 2008

И Джонатан, и Чарльз правы ... сначала нужно остановить службу, а затем удалить / переустановить. Сочетание двух ответов делает идеальный пакетный файл или скрипт PowerShell.

Я упомяну о предостережении, усвоенном трудным путем - Windows 2000 Server (возможно, и клиентская ОС) потребует перезагрузки перед переустановкой, несмотря ни на что. Должен существовать раздел реестра, который не очищен полностью до перезагрузки блока. Windows Server 2003, Windows XP и более поздние версии ОС не страдают от этой боли.

0 голосов
/ 17 апреля 2014

Я использую 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.

...