Saltar al contenido

Cómo desinstalar un servicio de Windows y eliminar sus archivos sin reiniciar

Agradecemos tu ayuda para extender nuestros artículos acerca de las ciencias informáticas.

Solución:

sc delete "service name"

eliminará un servicio. Encuentro que la utilidad sc es mucho más fácil de localizar que buscar installutil. Recuerde detener el servicio si aún no lo ha hecho.

¿No puede detener el servicio antes de la actualización (y reiniciar después de la actualización) usando los siguientes comandos?

net stop 
net start 

Siempre que estoy probando / implementando un servicio, puedo cargar archivos sin reinstalar siempre que el servicio esté detenido. No estoy seguro de si el problema que tiene es diferente.

Tuve el mismo problema que tú. Tengo un servicio del sistema que quiero desinstalar y luego reinstalar como parte de una actualización. En ciertos sistemas, esto no funcionaría sin un reinicio. El problema era que una llamada a DeleteService () devolvería bien, pero la siguiente llamada a CreateService () me diría que el servicio todavía estaba allí, pero marcado para su eliminación (código de error 1072). El registro reflejaría eso, dado que la subclave todavía estaba allí (en HKLM System CurrentControlSet Services), pero “DeleteFlag” se estableció en 1. A partir de ese momento, solo un reinicio podría solucionar la situación.

Algunas cosas que no funcionan:

  • Usando “sc delete”: tenía los mismos problemas que yo. La llamada regresaba bien, pero el servicio no se había ido realmente y todavía estaba en el registro con DeleteFlag = 1.
  • Eliminando el key en el registro. El administrador de servicios parece mantener una base de datos en la memoria y el registro es solo una copia para el próximo arranque.
  • Agregar bucles de espera, esperar a que los archivos .exe estén listos para ser sobrescritos, terminar el proceso, etc.
  • Manillas de cierre al servicio. ¿¿Cuáles??

Pero esto es lo que funcionó:

Noté en algunos artículos aquí sobre stackoverflow que net.exe también tiene funciones de inicio / detención (solo conocía la utilidad sc.exe). Y, curiosamente, ¡funcionó un “net stop svcname” más un “sc delete svcname”! Así que net.exe debe hacer algo que yo no hago.

Pero net.exe no contiene una importación a ControlService (), entonces, ¿cómo detiene el servicio? Descubrí que net.exe genera net1.exe, pero net1.exe tampoco importa ControlService (). Usé la gran utilidad API Monitor (http://www.rohitab.com/apimonitor) para ver qué está haciendo net1.exe, pero nunca llamó a nada que pareciera prometedor.

Pero luego vi que importa NetServiceControl () de NETAPI32.DLL (¡que tenía al menos “Servicio” en su nombre!). MSDN dice que esta función está obsoleta. Sin embargo, encontré el prototipo en LMSvc.hy una descripción de parámetros aquí: http://cyberkinetica.homeunix.net/os2tk45/srvfpgr/369_L2_NetServiceControlorN.html. Cuando carga NETAPI32.DLL y usa NetServiceControl(NULL, service_name, 3, 0, 0) (3 es para SERVICE_CTRL_UNINSTALL, que se usa para detener) el servicio se detiene después. ¡Y se puede eliminar y reinstalar luego sin DeleteFlag o reiniciar!

Por lo tanto, nunca fue un problema de eliminar, sino de detener el servicio correctamente. Y NetServiceControl () hace el truco. Perdón por la publicación larga, pero pensé que podría ayudar a alguien con problemas similares. (Solo como referencia, uso Win7 SP1 x64).

Comentarios y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *