servicios servicio puedo por eliminar elimina cómo como comando windows scripting windows-services operating-system filesystems

puedo - eliminar un servicio de windows regedit



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

Mi proyecto actual implica la implementación de un archivo .exe actualizado que se ejecuta como un servicio de Windows. Para sobrescribir el .exe existente con la nueva versión, actualmente necesito:

  1. Detener el servicio
  2. Desinstalar el servicio
  3. Reinicia el sistema (para que Windows libere el archivo)
  4. Implementar el nuevo .exe
  5. Reinstalar el servicio
  6. Comience el servicio actualizado.

Me gustaría evitar el reinicio, por lo que esta puede ser una actualización totalmente guionizada / automatizada.

¿Hay alguna forma de evitar reiniciar? ¿Tal vez una herramienta de línea de comandos que obligará a Windows a renunciar a su agarre mortal en el antiguo .exe?


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

net stop <service name> net start <service name>

Cada vez que estoy probando / implementando un servicio, puedo cargar archivos sin reinstalar, siempre que se detenga el servicio. No estoy seguro de si el problema que está teniendo es diferente.


Si está en .net (no estoy seguro de si funciona para todos los servicios de Windows)

  • Detenga el servicio (esta puede ser la razón por la que tiene un problema).
  • InstallUtil -u [nombre del ejecutable]
  • Installutil -i [nombre del ejecutable]
  • Comience el servicio otra vez ...

A menos que cambie la interfaz pública del servicio, a menudo despliego versiones actualizadas de mis servicios sin siquiera desinstalar / reinstalar ... ALlo hago es detener el servicio, reemplazar los archivos y reiniciar el servicio nuevamente ...


Tanto Jonathan como Charles tienen razón ... primero debes detener el servicio y luego desinstalar / reinstalar. La combinación de sus dos respuestas crea el archivo por lotes perfecto o el script de PowerShell.

Haré mención de una advertencia aprendida de la manera más difícil: Windows 2000 Server (posiblemente el sistema operativo del cliente también) requerirá un reinicio antes de la reinstalación pase lo que pase. Debe haber una clave de registro que no se borre por completo hasta que se reinicie la caja. Windows Server 2003, Windows XP y versiones posteriores del sistema operativo no sufren ese dolor.


(Así que Windows libera el archivo)

En su lugar, haga Ctrl + Alt + Supr justo después de la detención del servicio y elimine el .exe del servicio. Entonces, puedes desinstalar el servicio sin reiniciar. Esto me pasó en el pasado y soluciona la parte que necesita para reiniciar.


Como señalan StingyJack y mcbala, y en referencia a los comentarios hechos por Mike L, mi experiencia es que en una máquina con Windows 2000, al desinstalar / reinstalar servicios .Net, "installutil / u" requiere reiniciar, incluso cuando el servicio era previamente parado. "sc / delete", por otro lado, no requiere un reinicio; elimina el servicio de inmediato (siempre que se detenga).

A menudo me he preguntado, en realidad, si hay una buena razón para que "installutil / u" requiera un reinicio ... ¿Es "sc / delete" algo que realmente hace algo incorrecto / dejando algo colgando?


En caso de ser necesario eliminar manualmente un servicio:

  1. Ejecute Regedit o regedt32.
  2. Busque la entrada de clave de registro para su servicio bajo la siguiente clave: HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services
  3. Eliminar la clave del registro

Tendrá que reiniciar antes de que la lista se actualice en los servicios


Tuve el mismo problema que tú. Tengo un servicio del sistema que deseo desinstalar y luego volver a instalar como parte de una actualización. En ciertos sistemas esto no funcionaría sin un reinicio. El problema era que una llamada a DeleteService () volvería a estar 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, ya 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 volvería a estar bien, pero el servicio no se había ido realmente y seguía en el registro con DeleteFlag = 1.
  • Eliminar la clave 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 inicio.
  • Agregando bucles de espera, esperando que los archivos .exe estén listos para ser sobrescritos, matando el proceso, etc.
  • Tiradores de cierre para el servicio. ¿¿Cuáles??

Pero aquí está lo que funcionó:

Observé en algunos artículos aquí en que net.exe también tiene funciones de inicio / detención (yo solo sabía de la utilidad sc.exe). Y, curiosamente, funcionó un "net stop svcname" más un "sc delete svcname". Entonces 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 de 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 es obsoleta. Sin embargo, encontré el prototipo en LMSvc.h y alguna descripción de parámetro aquí: http://cyberkinetica.homeunix.net/os2tk45/srvfpgr/369_L2_NetServiceControlorN.html . Cuando carga NETAPI32.DLL y utiliza NetServiceControl(NULL, service_name, 3, 0, 0) (3 es SERVICE_CTRL_UNINSTALL, que se usa para detener) el servicio se detiene después. ¡Y puede ser eliminado y reinstalado luego sin DeleteFlag o reiniciar!

Por lo tanto, nunca fue un problema de eliminación, 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.)


sc delete "service name"

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


Estoy usando InstallUtil.exe empaquetado con .NET Framework.

El uso para desinstalar es: InstallUtil ''/ path / to / assembly / with / the / installer / classes'' / u así que por ejemplo: installutil MyService.HostService.exe /u

El /u significa desinstalación, sin él, la utilidad realiza la instalación normal del servicio. La utilidad detiene el servicio si se está ejecutando y nunca tuve problemas con Windows manteniendo el bloqueo en los archivos del servicio. Puede leer sobre otras opciones de InstallUtil en MSDN .

PD: si no tienes installutil en tu variable de ruta usa una ruta completa como esta: C:/Windows/Microsoft.NET/Framework/v4.0.30319/InstallUtil.exe "C:/MyServiceFolder/MyService.HostService.exe" /u Si necesita una versión de 64 bits, puede encontrarla en ''C: / Windows / Microsoft.NET / Framework64 / v4.0.30319 /'. El número de versión en la ruta varía según la versión de .NET.