Подтвердить что ты не робот

Как удалить службу Windows и удалить ее файлы без перезагрузки

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

  • Остановить службу
  • Удалить службу
  • Перезагрузите систему (так что Windows выпускает ее в файл)
  • Разверните новый .exe
  • Переустановите службу
  • Запустите обновленную службу.

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

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

4b9b3361

Ответ 2

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

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

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

Ответ 3

У меня была такая же проблема, как и вы. У меня есть системная служба, которую я хочу удалить, а затем переустановить как часть обновления. В некоторых системах это не будет работать без перезагрузки. Проблема заключалась в том, что вызов 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(у которого было хотя бы "Сервис" в его имени!). 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.)

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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