2008-10-22 15 views
134

Instalé un servicio de Windows usando installUtil.exe.Cómo forzar la desinstalación del servicio de Windows

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

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

Si trato de cambiar sus propiedades, recibo el mensaje "el servicio está marcado para eliminación".

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

Respuesta

367

Una cosa que me ha atrapado en el pasado es que si usted tiene el visor de servicios que se ejecutan a continuación, que impide que los servicios que se borre completamente, tan cerca que de antemano

+26

+1 Esta es mi experiencia también –

+0

¡Excelente, gracias! –

+7

Esto resolvió mi problema sin reiniciar. – mirezus

4

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

+1

Triste pero cierto. Al menos funcionó. – Manu

+11

No. No es necesario reiniciar. Ver mi solución :) – johan

+2

Realmente me gusta la solución de user186749 aún mejor. Bonito y limpio. – McKay

1

¿Has intentado detener el servicio antes de llamar a la desinstalación? Tuve este problema al azar. En algún momento podría eliminarlo sin reiniciar. Supongo que tiene que ver con el servicio que todavía está ejecutándose

9
sc delete sericeName 

Solo asegúrese de que el servicio esté detenido antes de hacer esto. He visto esto trabajar la mayoría de las veces. Hay momentos en los que he visto ventanas atascadas en algo e insiste en un reinicio.

+0

Solo una adición .. Tuve que ejecutar mi símbolo de sistema 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. –

+0

Ejecute "NET STOP " antes de SC DELETE para asegurarse de que el servicio se detuvo antes de eliminar – Adi

+0

Esta fue mi experiencia también, 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 lo hizo desaparecer. – delliottg

73

bien, 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 en "MS Techno Blogging" Deleting Services Forcefully from Services MMC

+5

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

esto no funcionará si se abre el visor de servicios –

+7

'sc delete' también informará que" el servicio está marcado para eliminación "si hay un identificador abierto para el servicio. – Matt

0

La actualización de la lista de servicios siempre lo hizo por mí. Si la ventana de servicios está abierta, mantendrá algún recuerdo de ella existiendo por alguna razón. F5 y estoy reinstalando nuevamente!

35

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

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

Anteriormente, actualizar el administrador de servicios no había ayudado.

+1

Gracias por sonar. Mi experiencia fue exactamente como la describiste. –

116

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

sc.exe queryex <SERVICE_NAME> 

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

taskkill /pid <SERVICE_PID> /f 

Where/f is to force stop.

Ahora puede instalar o iniciar su servicio.

+1

Funcionó de manera rentable donde todo lo que no sea un reinicio falló, ¡muy satisfecho! – DaveF

+0

Esta es una gran respuesta. Mucho mejor que un reinicio como se sugiere en la respuesta menos buena (en mi humilde opinión). – Benedict

+33

Esto no funcionó para mí: el pid para mi servicio devolvió 0 y no me permitió eliminar un proceso crítico del sistema. – plasma147

2

El siguiente trabajo sin necesidad de reiniciar la máquina:

  1. buscar en el Registro \ HKEY_LOCAL_MACHINE para < Su nombre Servicio> (ambas claves y valores)
  2. Conjunto valor "legado" a 0
0

también asegurarse de que no existen instancias del ejecutable aún activo (tal vez uno que podría haber estado funcionando, por cualquier razón, independientemente del servicio).

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

0

Hay muchas preguntas en el foro sobre ese tema.

He encontrado la respuesta en la API de Windows. No es necesario reiniciar la computadora después de desinstalar el servicio. Debe llamar al:

BOOL WINAPI CloseServiceHandle(
    SC_HANDLE hSCObject 
); 

que cierra el identificador del servicio. En Windows 7 resolvió mi problema. hago:

  • servicio de la parada
  • Cerrar un gestor de
  • servicio de desinstalación
  • esperar 3 segundos
  • copia nueva EXE al directorio
  • instalar el servicio
  • servicio de inicio
  • cerrar manejar
+2

¿De dónde sacas el mango para cerrar si no estás en el programa que tiene el mango abierto? – Matt

1

llego tarde, pero me gustaría añadir una alternativa, que puede parecer extraño, pero no vi otra manera:

Como instalo mi servicios de Windows en un proceso CI cada noche, necesitaba algo que funciona todo el tiempo y está completamente automatizado. Por algún motivo, los servicios siempre se marcaron para su eliminación durante un tiempo prolongado (5 minutos o más) después de desinstalarlos. Por lo tanto, he ampliado el guión reinstalación por lotes para asegurarse de que el servicio es realmente borrado (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 unos 5 minutos hasta que (!) finalmente pasa. Finalmente, no necesito más intervenciones manuales. Extenderé la secuencia de comandos en el futuro para que algo suceda después de un cierto tiempo (por ejemplo, notificación después de 30 minutos).

3

Por si acaso esta respuesta ayuda a alguien: como se encontró here, puede ahorrarse un montón de problemas ejecutando Sysinternals Autoruns como administrador. Simplemente vaya a la pestaña "Servicios" y elimine su servicio.

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

0

Puede eliminar manualmente la clave de registro para su servicio, ubicada en HKLM\SYSTEM\CurrentControlSet\Services, luego 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 siempre.

+0

En Windows 2012 R2, el complemento Servicios MMC (Services.MSC) muestra "_Fallado para leer la descripción. Código de error: 2_". A pesar de asegurarse de que todos los demás MMC se cerraron y ningún otro usuario inició sesión. – Signal15

+0

Veo, solo probado en Windows 8 y Windows 10 (y funcionó). –

0

Uso el siguiente PowerShell improvisado en algunos lugares para nuestras instancias de Octopus Deploy cuando TopShelf se estropea o un servicio falla por algún otro motivo.

$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

Esto funcionó para mí

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

Si su salida de eso muestra 'ReturnValue: 16', entonces el comando falló con" _Este servicio se está eliminando del sistema_ ". Lista completa de ReturnValues ​​de Microsoft [aquí] (https://msdn.microsoft.com/en-us/library/aa393673 (v = vs.85) .aspx) – Signal15

0

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

Cuestiones relacionadas