Cómo forzar la desinstalación del servicio de Windows

173

Instalé un servicio de Windows usando installUtil.exe.

Después de actualizar el código, utilicé installUtil.exe nuevamente para instalar el servicio sin desinstalar primero la versión original.

Cuando ahora trato de desinstalar el servicio, installUtil.exe completa la desinstalación con éxito, pero el servicio aún aparece.

Si intento cambiar sus propiedades, recibo el mensaje 'el servicio está marcado para su eliminación'.

¿Cómo puedo forzar la eliminación (preferiblemente sin reiniciar el servidor)?

Manu
fuente
Si el servicio se cuelga y la eliminación no funciona, vea Cómo forzar la desinstalación del servicio de Windows
Wernfried Domscheit

Respuestas:

469

Una cosa que me ha sorprendido en el pasado es que si tiene el visor de servicios ejecutándose, eso evita que los servicios se eliminen por completo, tan cerca que de antemano

the_mandrill
fuente
70
No puedo creer que tener el visor abierto rompa la eliminación del servicio, ¡qué estúpido!
Draemon
1
Esto es tan estúpido por parte de Microsoft, pero funciona de hecho. Por alguna razón inexplicable, tener abierto el visor de servicios evita que a veces se eliminen correctamente.
ivantod
1
Creo que esta respuesta tendrá cientos de comentarios similares. Acabo de perder 30 minutos con este estúpido problema ...
PierrOz
2
Parece que el explorador de procesos SysInternals también bloquea los servicios (y quizás también el administrador de tareas), ¡así que asegúrese de cerrarlos también!
danio
3
también asegúrese de usar cmd prompt. PowerShell no muestra ningún error, pero tampoco lo elimina.
Bruno Faria
145

No tiene que reiniciar su máquina. Inicie cmd o PowerShell en modo elevado.

sc.exe queryex <SERVICE_NAME>

Entonces obtendrás información. Se mostrará un número PID.

taskkill /pid <SERVICE_PID> /f

Donde / f es forzar la parada.

Ahora puede instalar o iniciar su servicio.

johan
fuente
2
Trabajó de forma multimillonaria donde todo lo demás, excepto un reinicio falló, ¡muy contento!
DaveF
36
Esto no funcionó para mí: el pedido de mi servicio devolvió 0 y no me permitió eliminar un proceso crítico del sistema.
plasma147
44
A + impresionante. Use sc delete y luego lo anterior.
Zone12
77
no funcionó ya que PID llegó como 0, esto resolvió mi problema - (SC) DeleteService FAILED 1072
Web-E
3
Absolutamente útil! En mi caso, nada menos que un reinicio funcionó. ¡Ni siquiera eliminando el directorio de servicios en el Registro! Uno de gotcha sin embargo: Si está trabajando en el uso de PowerShell: sc.exe queryex <SERVICENAME>. Porque sctambién es un alias para Set-Content, fallará SILENCIOSAMENTE cuando lo uses.
Ifedi Okonkwo
97

bueno, puede usar SC.EXE para eliminar cualquier Servicio de Windows con fuerza si la desinstalación no se elimina por casualidad.

sc delete <Service_Name>

Lea más sobre "MS Techno Blogging" Eliminando Servicios con Fuerza de los Servicios MMC


fuente
55
Gracias por esto. Tenga en cuenta que si el "Nombre del servicio" no es el mismo que el "Nombre para mostrar", puede obtener el "Nombre del servicio" en las propiedades del servicio.
GuiSim
8
sc deletetambién informará "el servicio está marcado para su eliminación" si hay un identificador abierto para el servicio.
Matt
@GuiSim gracias por eso, ¡sospecho que muchos pondrán el nombre para mostrar como yo!
nik0lai
Intenté eso pero recibí este mensaje: [SC] DeleteService FAILED 1072: El servicio especificado se ha marcado para su eliminación.
Andrew W. Phillips el
37

Sé que esto no va a ayudar, pero podría ayudar a alguien en el futuro.

Acabo de tener el mismo problema, cerrar y volver a abrir el administrador de servicios eliminó la entrada del registro y completó la desinstalación del servicio.

Antes de eso, actualizar el gerente de servicios no había ayudado.

Kennifer
fuente
1
Gracias por entrar. Mi experiencia fue exactamente como la describiste.
pk.
10
sc delete sericeName

Solo asegúrese de detener el servicio antes de hacer esto. He visto este trabajo la mayoría de las veces. Hay momentos en que he visto que las ventanas se atascan en algo e insiste en reiniciar.

Aaron Weiker
fuente
Solo una adición ... Tuve que ejecutar mi indicador de dos / .NET como administrador para obtener acceso para ejecutar el comando sc delete ... en caso de que alguien más se encuentre con ese problema.
Dav.id
Ejecute "NET STOP <serviceName>" antes de SC DELETE para asegurarse de que el servicio se detuvo antes de eliminar
Adi
Esta fue también mi experiencia, finalmente tuve que reiniciar para eliminar un servicio obstinado que solo se desinstaló parcialmente (todavía apareció en el complemento con un código 2). Reiniciar fue lo que finalmente hizo que desapareciera.
delliottg
4

Lamentablemente, debe reiniciar el servidor. Eso debería eliminar el servicio "eliminado".

seanyboy
fuente
12
No. No necesitas reiniciar. Ver mi solución :)
johan
2
De hecho, me gusta la solución de user186749 aún mejor. Bonito y limpio.
McKay
3

En caso de que esta respuesta ayude a alguien: como se encuentra aquí , puede ahorrarse muchos problemas para ejecutar Sysinternals Autoruns como administrador. Simplemente vaya a la pestaña "Servicios" y elimine su servicio.

Me funcionó en una máquina donde no tenía permiso para editar el registro.

Broncearse
fuente
3

Puede eliminar manualmente la clave de registro para su servicio, ubicado en HKLM\SYSTEM\CurrentControlSet\Services, después de eso no verá el servicio en el administrador de control de servicios (necesita actualizar o volver a abrir para ver el cambio), y puede reinstalar el servicio como de costumbre.

Fernando Gonzalez Sanchez
fuente
En Windows 2012 R2, el complemento Servicios MMC (Services.MSC) muestra " Error al leer la descripción. Código de error: 2 ". A pesar de garantizar que todos los demás MMC se cerraron y ningún otro usuario inició sesión.
Señal15
Ya veo, solo probado en Windows 8 y Windows 10 (y funcionó).
Fernando González Sánchez
ESO finalmente resolvió mi problema. Olvidé agregar un instalador de servicio en el proyecto y no pude eliminar mi servicio después de la instalación. Recomiendo hacer una exportación del árbol de registro de servicio antes de eliminar cualquier cosa en él. ¡Muchas gracias!
user3772108
2

Lo siguiente funcionará sin reiniciar la máquina:

  1. Busque en el Registro \ HKEY_LOCAL_MACHINE <Nombre del servicio> (claves y valores)
  2. Establezca el valor "Legacy" en 0
Dmitry
fuente
1

¿Has intentado detener el servicio antes de llamar a desinstalar? Tuve este problema al azar. En algún momento podría eliminarlo sin reiniciar. Supongo que tiene que ver con que el servicio aún se esté ejecutando.

defectuoso
fuente
1

Llego tarde, pero me gustaría agregar una alternativa, que puede parecer extraña, pero no vi otra forma:

Al instalar mis Servicios de Windows en un proceso de CI cada noche, necesitaba algo que funcionara todo el tiempo y que estuviera completamente automatizado. Por alguna razón, los servicios siempre se marcaron para su eliminación durante mucho tiempo (5 minutos o más) después de desinstalarlos. Por lo tanto, extendí el script por lotes de reinstalación para asegurarme de que el servicio realmente se elimina (versión simplificada):

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

Lo que puedo ver es que el servicio está marcado para su eliminación durante aproximadamente 5 minutos (!) Hasta que finalmente se completa. Finalmente, no necesito más intervenciones manuales. Extenderé el script en el futuro para que algo suceda después de un cierto tiempo (por ejemplo, notificación después de 30 minutos).

marco
fuente
1

Esto funciono para mi

$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()
expirat001
fuente
Si su resultado de eso se muestra ReturnValue : 16, entonces el comando falló con " Este servicio se está eliminando del sistema ". Lista completa de los ReturnValues ​​de Microsoft aquí
Signal15
1

Si no puede detener el servicio en Servicios , puede detener su exe de servicio de Windows en el Administrador de tareas . Después de eso, puede eliminar el servicio.

Oguzhan KIRCALI
fuente
0

Actualizar la lista de servicios siempre lo hizo por mí. Si la ventana de servicios está abierta, mantendrá algo de memoria existente por algún motivo. F5 y estoy reinstalando de nuevo!

Jer
fuente
0

También asegúrese de que no haya instancias del ejecutable aún activo (quizás uno que podría haber estado ejecutándose, por cualquier razón, independientemente del servicio).

Estaba abriendo y cerrando MMC y buscando los PID para matar, pero cuando buscaba en el explorador de procesos había un par de procesos existentes que se ejecutaban desde un lote programado olvidado. Los mató Trabajo hecho.

Sin cortar
fuente
0

Hay muchas preguntas en el foro sobre ese tema.

He encontrado la respuesta en la API de Windows. No necesita reiniciar la computadora después de desinstalar el servicio. Tienes que llamar a:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

Eso cierra el mango del servicio. En Windows 7 resolvió mi problema. Hago:

  • parada de servicio
  • mango cerrado
  • servicio de desinstalación
  • espera 3 segundos
  • copia nuevo exe al directorio
  • instalar el servicio
  • Comienza el servicio
  • mango cerrado
Gabor Balazs
fuente
2
¿Dónde obtiene el controlador para cerrar si no está en el programa que tiene el controlador abierto?
Matt
0

Utilizo el siguiente PowerShell improvisado desde algunos lugares para nuestras instancias de Octopus Deploy cuando TopShelf falla o un servicio falla por alguna otra razón.

$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
dragon788
fuente
0

También vale la pena señalar que esto:

sc delete "ServiceName"

no funciona en PowerShell, sc es un alias para el cmdlet Set-Content en PowerShell. Necesitas hacer:

sc.exe delete "ServiceName"
Ricardo
fuente