Как принудительно удалить службу windows



Я установил службу windows с помощью installUtil.исполняемый.



после обновления кода я использовал installUtil.exe снова, чтобы установить службу без удаления исходной версии в первую очередь.



когда я сейчас пытаюсь удалить службу, installUtil.exe успешно завершает удаление, но служба все еще появляется.



Если я попытаюсь изменить его свойства, я получаю сообщение "сервис помечен для удаления".



Как я могу заставить удаление (предпочтительно без перезагрузки сервера)?

827   18  

18 ответов:

одна вещь, которая поймала меня в прошлом, заключается в том, что если у вас есть средство просмотра служб, то это предотвращает полное удаление служб, так близко, что заранее

вам не нужно перезагружать компьютер. Запустите cmd или PowerShell в повышенном режиме.

sc.exe queryex <SERVICE_NAME>

затем вы получите некоторую информацию. ПИД количество покажет.

taskkill /pid <SERVICE_PID> /f

где /f-принудительная остановка.

теперь вы можете установить или запустить свои услуги.

ну, вы можете использовать SC.EXE для удаления любой службы windows принудительно, если un-install не удаляет случайно.

sc delete <Service_Name>

подробнее о "MS Techno Blogging" принудительное удаление служб из службы MMC

Я знаю, что это не поможет, но это может помочь кому-то в будущем.

У меня только что была та же проблема, закрытие и повторное открытие Диспетчер служб удалил обе записи из реестра и завершил удаление службы.

до этого обновление менеджера служб не помогло.

sc delete sericeName

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

к сожалению, вам нужно перезапустить сервер. Это должно удалить" удаленную " службу.

закройте окно cmd и services, если оно открыто, затем снова запустите cmd, щелкнув правой кнопкой мыши и выбрав Запуск от имени администратора. Если sc delete sericeName не работает или ничего не работает.

http://weblogs.asp.net/avnerk/archive/2007/09/05/windows-services-services-msc-and-the-quot-this-service-is-marked-for-deletion-quot-error.aspx

на всякий случай этот ответ кому-то помогает: как нашел здесь, вы можете сэкономить много проблем с запуском Sysinternals Autoruns в качестве администратора. Просто перейдите на вкладку "Услуги" и удалите свой сервис.

Он сделал трюк для меня на машине, где у меня не было разрешение на редактирование реестра.

следующий будет работать без перезагрузки машины:

  1. Поиск реестра \ HKEY_LOCAL_MACHINE для (оба ключа и значения)
  2. установите значение "Legacy" в 0

вы пытались остановить службу перед вызовом uninstall? У меня была эта проблема случайно. Когда-нибудь я мог бы удалить его без перезагрузки. Я предполагаю, что это связано с тем, что Служба все еще работает

Я опаздываю, но хотел бы добавить альтернативу, которая может показаться странной, но я не видел другого пути:

поскольку я устанавливаю свои службы Windows в процесс CI каждую ночь, мне нужно было что-то, что работает все время и полностью автоматизировано. По какой-то причине службы всегда были помечены для удаления в течение длительного времени (5 минут или более) после их удаления. Поэтому я расширил пакетный сценарий переустановки, чтобы убедиться, что служба действительно удалена (упрощенная версия):

REM Stop the service first
net stop My-Socket-Server

REM Same as installutil.exe, just implemented in the service
My.Socket.Server.exe /u

:loop1
    REM Easy way to wait for 5 seconds
    ping 192.0.2.2 -n 1 -w 5000 > nul
    sc delete My-Socket-Server
    echo %date% %time%: Trying to delete service.
    if errorlevel 1072 goto :loop1

REM Just for output purposes, typically I get that the service does not exist
sc query My-Socket-Server

REM Installing the new service, same as installutil.exe but in code
My.Socket.Server.exe /i

REM Start the new service
net start My-Socket-Server

что я вижу, это то, что сервис помечен для удаления в течение примерно 5 минут (!) пока он, наконец,не пройдет. Наконец, мне больше не нужно никаких ручных вмешательств. Я буду расширять скрипт в будущем, чтобы что-то произошло через определенное время (например, уведомление через 30 минут).

обновление списка услуг всегда делал это для меня. Если окно службы открыто, оно будет содержать некоторую память о нем, существующую по какой-то причине. F5 и я снова устанавливаю!

также убедитесь, что нет экземпляров исполняемого файла все еще активны (возможно, тот, который мог бы быть запущен, по какой-либо причине, независимо от службы).

я открывал и закрывал MMC и искал PIDs, чтобы убить, но при просмотре в Process explorer было несколько существующих процессов, запущенных из забытого запланированного пакета. Убить их. Дело сделано.

есть много вопросов форума в этой теме.

Я нашел ответ в Windows api. Перезагрузка компьютера после удаления службы не требуется. Вы должны позвонить:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

это закрывает дескриптор службы. На windows 7 это решило мою проблему. Я делаю:

  • остановить службу
  • закрыть дескриптор
  • удаление услуги
  • подождите 3 сек
  • скопировать новый exe в каталог
  • установить службу
  • запустить службу
  • закрыть дескриптор

вы можете вручную удалить раздел реестра для вашего сервиса, расположенный по адресу HKLM\SYSTEM\CurrentControlSet\Services, после этого вы не увидите в диспетчере управления службами (нужно обновить или открыть, чтобы увидеть изменения), и вы можете переустановить службу как обычно.

Я использую следующий PowerShell, собранный из нескольких мест для наших экземпляров развертывания Octopus, когда TopShelf запутывается или служба не работает по какой-либо другой причине.

$ServiceName = 'MyNaughtyService'
$ServiceName | Stop-Service -ErrorAction SilentlyContinue
# We tried nicely, now KILL!!!
$ServiceNamePID = Get-Service | Where { $_.Name -eq $ServiceName} # If it was hung($_.Status -eq 'StopPending' -or $_.Status -eq 'Stopping') -and
$ServicePID = (Get-WmiObject Win32_Service | Where {$_.Name -eq $ServiceNamePID.Name}).ProcessID
Stop-Process $ServicePID -Force

это сработало для меня

$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()

Если вы не можете остановить службу в услуги, вы можете остановить службу Windows exe в Диспетчер Задач. После этого вы можете удалить сервис.

Comments

    Ничего не найдено.