Как заставить деинсталляцию службы Windows - PullRequest
162 голосов
/ 22 октября 2008

Я установил службу Windows, используя installUtil.exe.

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

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

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

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

Ответы [ 18 ]

1 голос
/ 19 февраля 2017

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

$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()
1 голос
/ 24 февраля 2014

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

Поскольку я устанавливал свои службы 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 минут).

1 голос
/ 24 октября 2008

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

0 голосов
/ 10 февраля 2017

Я использую следующий 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
0 голосов
/ 16 ноября 2016

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

0 голосов
/ 23 мая 2013

В этой теме множество вопросов на форуме.

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

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

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

  • остановка обслуживания
  • закрыть ручку
  • Служба удаления
  • подождите 3 сек
  • скопировать новый exe в каталог
  • установить сервис
  • запуск сервиса
  • закрыть ручку
0 голосов
/ 06 марта 2013

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

Я открывал и закрывал MMC и искал PID для уничтожения, но при поиске в проводнике процессов было несколько существующих процессов, запущенных из забытого запланированного пакета. Убил их. Работа выполнена.

0 голосов
/ 28 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...