Ответ 1
Одна вещь, которая меня поймала в прошлом, заключается в том, что если у вас запущено средство просмотра служб, это предотвращает полное удаление служб, поэтому закройте это заранее
Я установил службу windows с помощью installUtil.exe.
После обновления кода я снова использовал installUtil.exe для установки службы без первоначальной первоначальной версии.
Когда я пытаюсь удалить службу, installUtil.exe успешно завершит удаление, но служба все еще появляется.
Если я попытаюсь изменить его свойства, я получаю сообщение "служба помечена для удаления".
Как я могу принудительно удалить (предпочтительнее без перезапуска сервера)?
Одна вещь, которая меня поймала в прошлом, заключается в том, что если у вас запущено средство просмотра служб, это предотвращает полное удаление служб, поэтому закройте это заранее
Вам не нужно перезагружать компьютер. Запустите cmd или PowerShell в повышенном режиме.
sc.exe queryex <SERVICE_NAME>
Затем вы получите некоторую информацию. Отобразится номер PID.
taskkill /pid <SERVICE_PID> /f
Где/f - принудительная остановка.
Теперь вы можете установить или запустить службу.
Хорошо, вы можете использовать SC.EXE для принудительного удаления любых оконных сервисов, если un-install не удаляет их случайно.
sc delete <Service_Name>
Подробнее о "MS Techno Blogging" Удаление служб с помощью службы MMC
Я знаю, что это не поможет, но это может помочь кому-то в будущем.
У меня была такая же проблема, закрытие и повторное открытие диспетчера служб удалили как запись из реестра, так и завершили удаление службы.
До этого обновление менеджера служб не помогло.
sc delete sericeName
Просто убедитесь, что служба остановлена, прежде чем делать это. Я видел эту работу чаще всего. Бывают случаи, когда я вижу, что окна что-то застряли, и он настаивает на перезагрузке.
К сожалению, вам необходимо перезапустить сервер. Это должно удалить "удаленный" сервис.
Закройте окно cmd и services, если оно открыто, затем снова запустите cmd, щелкнув правой кнопкой мыши и выбрав "Запуск от имени администратора". Если sc delete sericeName
не работает или ничего не работает.
На всякий случай этот ответ помогает кому-то: как найдено here, вы можете сэкономить массу проблем Sysinternals Autoruns в качестве администратора. Просто зайдите на вкладку "Службы" и удалите свою службу.
Он помогло на машине, где у меня не было прав на редактирование реестра.
Следующее будет работать без перезагрузки машины:
Вы пытаетесь остановить службу перед вызовом деинсталляции? У меня была эта проблема случайным образом. Когда-нибудь я смогу удалить его без перезагрузки. Я предполагаю, что это связано с тем, что служба все еще работает
Я опаздываю, но хотел бы добавить альтернативу, которая может показаться странной, но я не видел другого способа:
Как я устанавливаю свои службы Windows в процессе CI каждую ночь, мне нужно что-то, что работает все время и полностью автоматизировано. По какой-то причине службы были всегда отмечены для удаления в течение длительного времени (5 минут и более) после их удаления. Поэтому я расширил пакет переустановки script, чтобы убедиться, что служба действительно удалена (упрощенная версия):
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 минут (!), пока она наконец не пройдет. Наконец, мне больше не нужны ручные вмешательства. Я буду расширять script в будущем, чтобы что-то произошло через определенное время (например, уведомление через 30 минут).
Обновление списка услуг всегда делало это для меня. Если окно служб открыто, по какой-то причине оно будет содержать некоторую память об этом. F5, и я снова переустанавливаю!
Также убедитесь, что экземпляры исполняемого файла еще не активны (возможно, тот, который мог быть запущен, по какой-либо причине, независимо от службы).
Я открывал и закрывал MMC и искал PID, чтобы убивать, но при поиске в Process Explorer существовало несколько существующих процессов, запущенных из забытой запланированной партии. Убил их. Работа выполнена.
В этом вопросе есть много вопросов форума.
Я нашел ответ в windows api. После удаления службы вам не нужно перезагружать компьютер. Вы должны позвонить:
BOOL WINAPI CloseServiceHandle(
SC_HANDLE hSCObject
);
Это закрывает дескриптор службы. В Windows 7 она решила мою проблему. Я:
Вы можете вручную удалить раздел реестра для своей службы, расположенный по адресу HKLM\SYSTEM\CurrentControlSet\Services
, после чего вы не увидите службу в диспетчере управления сервисом (необходимо обновить или повторно открыть, чтобы увидеть изменение), и вы можете переустановить как обычно.
Я использую следующую PowerShell, вымощенную из нескольких мест для наших экземпляров Octopus Deploy, когда 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 в Диспетчере задач. После этого вы можете удалить службу.