update través registro por para las hacer grupo gpedit directivas deshabilitar desde desactivar como automaticas actualizar actualizaciones activar windows-services service auto-update

windows-services - través - deshabilitar windows update por gpo



Las mejores prácticas para escribir un servicio de Windows de actualización automática (2)

Sólo algunos pensamientos que tenía.

1 parece problemático porque terminas lidiando con la situación que estás tratando de resolver porque en algún momento el actualizador necesitará una actualización. 3 suena bien, pero si al "cambiar" te refieres a usar un reflejo elegante para cargar la dll durante el tiempo de ejecución, no estoy seguro de que el rendimiento se convierta en un problema.

Hay una cuarta opción en la que el servicio puede generar un proceso de actualización que le permitiría actualizar el ejecutable de la actualización, si es necesario, antes de ejecutarlo. A partir de ahí, es una simple cuestión de escribir una aplicación de instalación que el servicio generará justo antes de apagarse.

Necesitamos crear un servicio de Windows que tenga la capacidad de auto actualizarse.

Tres opciones vienen a la mente,

  1. un segundo servicio que gestiona la recuperación, desinstalación e instalación del primer servicio.

  2. Uso de un marco de terceros (las sugerencias son bienvenidas. Creo que .NET es compatible con la actualización automática de las aplicaciones de formularios de Windows, pero no los servicios de Windows)

  3. Uso de un modelo de complemento, en el que el servicio es simplemente un shell que contiene la lógica de actualización y ejecución, y la lógica de negocios del servicio está contenida en una DLL que se puede intercambiar.

¿Alguien puede arrojar algo de luz sobre la solución a este problema?

Gracias


Uso la opción 1. El proceso de actualización se actualiza muy raramente en estos días. Utiliza un archivo XML que contiene los detalles de dónde obtener los archivos (actualmente es compatible con SVN, está trabajando para agregar el soporte de NuGet) y dónde colocarlos. También especifica cuáles son servicios y cuáles son sitios web y especifica el nombre del servicio que se utilizará para cada proyecto.

El proceso sondea la fuente, si hay una nueva versión disponible, la copia a un directorio con una nueva versión numerada y luego actualiza el servicio. También guarda 5 copias de cada actualización, lo que facilita la reversión si hay un problema.

Aquí está la pieza central de código para el actualizador que detiene el servicio existente, copia los archivos y luego lo reinicia.

if (isService) { log.Debug("Stopping service " + project.ServiceName); var service = GetService(project); if (service != null && service.Status != System.ServiceProcess.ServiceControllerStatus.Stopped && service.Status != System.ServiceProcess.ServiceControllerStatus.StopPending) { service.Stop(); } service.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped, new TimeSpan(0, 1, 0)); if (service.Status == System.ServiceProcess.ServiceControllerStatus.Stopped) log.Debug("Service stopped"); else log.Error("ERROR: Expected Stopped by Service is " + service.Status); } log.Debug("Copying files over"); CopyFolder(checkoutDirectory, destinationDirectory); if (isService) { log.Debug("Starting service"); var service = GetService(project); // Currently it doesn''t create services, you need to do that manually if (service != null) { service.Start(); service.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running, new TimeSpan(0, 1, 0)); if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running) log.Debug("Service running"); else log.Error("Service " + service.Status); } }