Cómo resolver el error "El servicio especificado se ha marcado para su eliminación" error

584

Intento eliminar un servicio de Windows sc delete <service name>y encuentro el siguiente error:

[SC] DeleteService FALLÓ 1072:

El servicio especificado se ha marcado para su eliminación.

Lo que ya hice:

El problema persiste.

¿Cuál es el próximo paso?

Arseni Mourzenko
fuente
44
Un reinicio normalmente debería aclarar cualquier estado persistente.
Damien_The_Unbeliever
14
Lo sé. Pero pensé en una solución menos radical. Reiniciar treinta veces al día no será una solución aceptable en mi caso.
Arseni Mourzenko
54
"¿Por qué estás eliminando servicios de esta manera regularmente?" : Estoy escribiendo un servicio de Windows. Cada vez que se compila, debe reiniciarse. "Sin embargo, ¿es aceptable hackear el registro 30 veces al día?" : totalmente. Eliminar una clave del registro no me obliga a guardar todo, cerrar todas las aplicaciones abiertas, esperar un minuto y luego volver a abrir todo.
Arseni Mourzenko
46
He escrito servicios de Windows. A menos que cambie el código real que realiza el registro, no es necesario desinstalarlo y volver a instalarlo cada vez que realice una compilación. Mientras la ruta sea la misma, la información de registro anterior seguirá siendo válida.
Damien_The_Unbeliever
44
@NickTurner - enlace a cualquier informe de error? Cualquier error al que te refieras, no lo he encontrado. Y no estoy seguro de cómo está involucrado un MSI, ya que presumiblemente estamos hablando de construir y ejecutar servicios en una máquina de desarrollo (que al menos parece ser el contexto en esta pregunta de 5 años)
Damien_The_Unbeliever

Respuestas:

1245

Puede haber varias causas que conducen a que el servicio se atasque en "marcado para eliminación".

  1. Se abre el Explorador de procesos de SysInternals . Cerrarlo debería conducir a la eliminación automática del servicio.

  2. El Administrador de tareas está abierto .

  3. Se abre Microsoft Management Console (MMC) . Para asegurarse de que todas las instancias estén cerradas, ejecute taskkill /F /IM mmc.exe.

  4. La consola de servicios está abierta . Esto es lo mismo que el punto anterior, ya que MMC aloja la consola de Servicios.

  5. El visor de eventos está abierto . De nuevo, esto es lo mismo que el tercer punto.

  6. La clave HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {service name} existe .

  7. Alguien más ha iniciado sesión en el servidor y tiene abierta una de las aplicaciones mencionadas anteriormente.

  8. Una instancia de Visual Studio utilizada para depurar el servicio está abierta.

Arseni Mourzenko
fuente
99
El administrador de tareas parece hacer lo mismo. Y como se indica a continuación, dejar la consola de Servicios abierta también podría causar esto.
CodingBarfield
44
... y si cerrar todo esto aún no ayuda y aún ve el servicio como "marcado para eliminación", cierre la sesión en lugar de reiniciarlo por completo. Me ayudó algunas veces.
Nedko
2
Un flujo de trabajo común: sus colegas nefastos también están conectados al servidor remoto, y todos tienen algo abierto ...
Chris O
72
¡Cerrar la consola de servicios resolvió este problema para mí! Mi proceso fue el siguiente: en el símbolo del sistema VS2012 x64 Native Tools -> Navegar al directorio con el servicio ejecutable -> installutil / u servicename.exe (para desinstalar el servicio obsoleto) -> copiar sobre el nuevo exe de servicio incorporado - > installutil servicename.exe (para instalar el servicio actualizado) . Por lo general, puedo desinstalar y reinstalar de inmediato sin problemas. Hasta que al azar no pueda. El cierre de la consola de servicios lo resolvió. ¡Gracias por el consejo!
thehelix
17
Process Explorer es el más grande aquí, en mi opinión. Sugiero ponerlo en negrita y / o moverlo a la parte superior de la lista.
Coxy
224

Esto también puede ser causado al dejar abierta la consola de Servicios. Windows no eliminará el servicio hasta que se cierre.

forzado
fuente
3
Como indiqué en mi pregunta, "Microsoft Management Console está cerrado" durante las pruebas.
Arseni Mourzenko
25
En mi caso, la consola de Servicios fue el problema. Tan pronto como lo cerré y lo volví a abrir, los servicios eliminados desaparecieron.
Farrukh Najmi
3
Es difícil de creer que mantener la ventana abierta fuera el caso ... ¡Gracias!
Karol Tyl
Esto también funcionó para mí, aunque extrañamente ha habido muchos casos en los que simplemente presionar F5 actualizará la lista con el servicio eliminado.
Steve Smith
1
Me salvaste el día
Pranoy Sarkar
50

Tuve el mismo problema, finalmente decido matar el proceso de servicio.

para ello intente los siguientes pasos:

  • obtener la identificación del proceso de servicio con

    sc queryex <service name>

  • proceso de matar con

    taskkill /F /PID <Service PID>

Ali Sadri
fuente
2
mi PID es 0, ¡así que será mejor que no mate eso!
robar
puede desinstalar el servicio, siga los pasos a continuación: 1- ejecute cmd 2- cambie la dirección al archivo .exe de su servicio ubique ese 3- ejecute el comando installutil / u <yourfilename.exe>
Ali Sadri
+1 para sc queryex Podré usar eso para obtener el PID si quiero adjuntar el depurador
Paul McCarthy
44

En mi caso funcionó después de cerrar el Services. Compruebe si Services.mscestá abierto, en caso afirmativo, ciérrelo y compruebe si se encuentra algún proceso de servicio Task Manager.

Sumit Agrawal
fuente
13

Eso significa que el servicio todavía aparece como deshabilitado en services.msc. Simplemente cierre services.msc y vuelva a abrir como administrador ... El servicio no aparecerá en la lista. Ahora, instale el servicio usando el comando,

installutil "ruta de servicio"

Amey P Naik
fuente
11

Al eliminar las claves de registro como se sugirió anteriormente, mi servicio se atascó en el estado de detención. El siguiente procedimiento me funcionó:

abra el administrador de tareas> seleccione la pestaña servicios> seleccione el servicio> haga clic derecho y seleccione "ir al proceso"> haga clic derecho en el proceso y seleccione Finalizar proceso

El servicio debería desaparecer después de eso

mathart63
fuente
7

Descubrí una cosa más para verificar, mira en el Administrador de tareas, si otros usuarios están conectados a este cuadro, incluso si están 'desconectados', debes cerrar la sesión para que el servicio finalmente se elimine.

Kathy Gryta
fuente
44
Innecesario. Solo tiene que asegurarse de que todos salgan de Microsoft Management Console (MMC) y del panel de control de Servicios.
Marqués de Lorne
6

Parece que en las versiones de Windows posteriores a Windows 7 (sin verificar, pero según la experiencia más reciente con Windows Server 2012 R2), el Administrador de control de servicios (SCM) es más estricto.

Mientras que en Windows 7 solo genera otro proceso, ahora está verificando si el proceso de servicio aún está disponible y puede devolver ERROR_SERVICE_MARKED_FOR_DELETE (1072) para cualquier llamada posterior a CreateService / DeleteService, incluso si el servicio parece estar detenido.

Estoy hablando del código de la API de Windows aquí, pero quiero describir claramente lo que está sucediendo, por lo que esta secuencia puede conducir al error mencionado:

SC_HANDLE hScm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);

SC_HANDLE hSvc = OpenService(hScm, L"Stub service", SERVICE_STOP | SERVICE_QUERY_STATUS | DELETE);

SERVICE_STATUS ss;
ControlService(hSvc, SERVICE_CONTROL_STOP, &ss);
// ... wait for service to report its SERVICE_STOPPED state

DeleteService(hSvc);
CloseServiceHandle(hSvc);
hSvc = nullptr;

// any further calls to CreateService/DeleteService will fail
// if service process is still around

La razón por la que un proceso de servicio aún existe después de que ya ha informado su estado SERVICE_STOPPED no es sorprendente. Es un proceso regular, cuyo hilo principal está 'atascado' en su llamada alStartServiceCtrlDispatcher API, por lo que primero reacciona a una acción de detener el control, pero luego tiene que ejecutar la secuencia de código restante.

Es desafortunado que SCM / OS no esté manejando esto adecuadamente para nosotros. Una solución programática es un poco simple y precisa: obtenga el identificador de proceso del ejecutable del servicio antes de detener el servicio, luego espere a que se señale este identificador.

Si se aborda el problema desde una perspectiva de administración del sistema, la solución también es esperar a que el proceso de servicio desaparezca por completo.

klaus triendl
fuente
6

Esto es lo que funcionó para mí: - Me encontré con el mismo problema: mi servicio estaba atascado en 'marcado para eliminación'. - Abrí services.msc. Mi servicio apareció como en ejecución, aunque ya estaba desinstalado. - Hice clic en Detener Recibí un mensaje de error, diciendo que el servicio no está en un estado para recibir mensajes de control. Sin embargo, el servicio fue detenido. - Servicios cerrados.msc. - Reapertura de services.msc. - El servicio desapareció (ya no aparece en la lista de servicios).

(El entorno era Windows 7.)

Balintn
fuente
2
Windows 2008 aquí, tuve que cerrar el panel de servicios
Mathijs Segers
5

En mi caso, ejecuto taskkill /f /im dongleserver.exe, dondedongleserver.exe está el archivo exe de mi programa?

Entonces puedo reinstalar mi programa ya.

Sian Chiew See
fuente
4

En mi caso, fue causado por una excepción no controlada al crear la fuente eventLog. Use try catch para señalar la causa.

Arijus Gilbrantas
fuente
4

Cerrar todas las ventanas que estaban abiertas actualmente y luego ejecutar el siguiente comando me resolvió el problema:

taskkill /F /IM mmc.exe
Tshilidzi Mudau
fuente
3

Cerrar la consola de servicios como lo sugieren algunas de las respuestas aquí me permitió eliminar el servicio. En mi caso, esto fue solo una solución a corto plazo, ya que todas las reinstalaciones posteriores y la eliminación del servicio requerirían que tome estos pasos adicionales. Al revisar mi archivo web.config, se descubrió que había un error que, una vez solucionado, me permitía eliminar fácilmente el servicio sin el cierre adicional del paso de la consola de servicios.

GatesReign
fuente
1

Esto funciona para mi.

  • Administrador de tareas abierto
  • Seleccionar pestaña de servicios
  • Seleccione el servicio con el problema
  • Haga clic derecho y seleccione "Ir a detalles"
  • Haga clic derecho en el servicio y seleccione "Finalizar árbol de procesos"

El árbol de proceso finalizará el proceso y todos los procesos creados por el proceso.

Luego, puede reinstalar el servicio.

OIbuoye
fuente
1

En mi caso, el nombre del servicio era 'Monitor', que también es utilizado por un servicio de Windows llamado 'Monitor', cuando intenté actualizar mis servicios, intenté desinstalarlos, el instalador intentó eliminar el servicio de Windows 'Monitor' que no se pudo, y la instalación siempre fue revertida.

Terminé cambiando el nombre de mi servicio a otra cosa

Yaman
fuente
0

Si los pasos proporcionados por @MainMa no funcionaron, siga los siguientes pasos

Paso 1 Intenta eliminar el proceso desde el administrador de tareas de Windows o usando taskkill / F / PID. Puede encontrar pid del proceso mediante el comando 'sc queryex'. Pruebe el siguiente paso si aún no puede desinstalarlo.

Paso 2 Si arriba

Ejecute Autoruns para Windows Busque servicio por nombre y elimine resultados.

Charith
fuente
0

La razón principal del error es que el proceso no se detiene. para resolverlo, inicie el administrador de tareas, vaya a los servicios y vea si aún puede ver su servicio, luego vaya al proceso de ese servicio y finalice el proceso. Que el problema se resolverá por completo.

Gaurav Tyagi
fuente
0

Estaba teniendo este problema cuando estaba usando Application Verifier para verificar mi servicio ganador. Incluso después de cerrar App Ver, mi servicio fue bloqueado para su eliminación. Solo eliminar el servicio de App Ver resolvió el problema y el servicio se eliminó de inmediato. Parece que todavía hay algún proceso usando su servicio después de que intentó eliminar uno.

vadzvnik
fuente
0

pasos a seguir:

paso-1 ir a la ubicación C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

comando de ejecución del paso 2 : installutil / u full-path / servicename.exe

paso 3 cierre el panel de servicios y vuelva a abrirlo

comando de ejecución del paso 4 : installutil full-path / servicename.exe

Divyang Shah
fuente
1
una nota al margen: installutil funciona SOLO como administrador, así que abra un shell como administrador.
ingconti
0

Lo más probable es que el servicio de eliminación falle porque

protected override void OnStop()

lanzar error al detener un servicio. envolver cosas dentro de una captura de prueba evitará la marca de error de eliminación

protected override void OnStop()
{
            try
            {
                //things to do
            }
            catch (Exception)
            {
            }

}

e03050
fuente
0

A veces, esto puede suceder durante la eliminación del servicio a través del script de sesión remota de PowerShell, especialmente cuando intenta eliminar el servicio varias veces. En este caso, intente recrear una sesión antes de la eliminación:

Remove-PSSession -Session $session
$newSession = New-PSSession -ComputerName $Name  -Credential $creds -ErrorAction Stop
Enter-PSSession $newSession
Alex Podles
fuente