42

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

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

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

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

+0

Спасибо всем за помощь! Я обнаружил, что источником моей проблемы был дескриптор файла .exe от WMI. См. Мой новый вопрос: http://stackoverflow.com/questions/302315/want-to-script-window-wmi-wmiprvseexe-to-release-handle-on-file – 2008-11-19 15:44:10

+4

FYI, если у вас открыт диспетчер служб, вам нужно закрыть перед повторной установкой службы, иначе вы получите сообщение об ошибке «служба уже отмечена для удаления». – ChandlerPelhams 2012-07-03 21:20:15

+0

В [моем опыте] (http://stackoverflow.com/a/16293612/1810429) «[SC] CreateService FAILED 1072: указанная служба была помечена для удаления» зависит от того, не была ли остановлена ​​служба, которая была удалена , Я попытался воспроизвести ошибку, просто открыв инструмент администрирования служб и не смог. – J0e3gan 2013-05-01 05:16:14

ответ

76
sc delete "service name" 

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

14

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

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

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

+4

Это всегда был мой опыт - я бесконечно обновлял службы, просто останавливая их и заменяя .EXE. Так или иначе, это обычный процесс. – 2008-12-05 22:08:51

+0

То же самое здесь - работал для меня, как описано в течение нескольких месяцев разработки в наборе услуг Windows (работает в Windows 7). – J0e3gan 2013-05-01 05:26:34

3

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

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

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

+0

В моем случае я не могу этого сделать из-за проблемы с разрешением – 2013-04-02 15:22:59

2

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

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

2

(так для Windows высвобождает это держать на файле )

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

3

Как отметил StingyJack и mcbala, а также в отношении замечаний, сделанных Mike L, мой опыт показывает, что на компьютере Windows 2000, при удалении/переустановке .NET Services, «InstallUtil/у» делает требует перезагрузки , даже когда служба была остановлена ​​ранее. «sc/delete», с другой стороны, не требует перезагрузки - он удаляет услугу сразу (пока она остановлена).

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

2

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

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

Вам придется перезагрузить компьютер перед список обновляется в сфере услуг

13

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

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

  • Использование «СБН удалить»: это были те же проблемы, как и я вызов будет вернуться в порядке, но услуга не была на самом деле нет и до сих пор в реестре с DeleteFlag = 1.
  • Удаление ключа в реестре. Кажется, что Service Manager хранит базу данных в памяти, а реестр - только ее копия для следующей загрузки.
  • Добавление циклов ожидания, ожидающих, что файлы .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.)

0

Я использую InstallUtil.exe, упакованный в .NET Framework.

Использование деинсталлировать является: InstallUtil '\ путь \ к \ Assembly \ с \ к \ Installer \ классов'/ц, так, например: installutil MyService.HostService.exe /u

Выключатель /u обозначает деинсталлировать, без нее UTIL выполняет нормальная установка услуги. Утилита останавливает службу, если она запущена, и у меня никогда не было проблем с 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.