¿Cómo puedo ejecutar una aplicación GUI de Windows como un servicio?

Tengo una aplicación GUI existente que debería haberse implementado como un servicio. Básicamente, necesito poder iniciar sesión de forma remota en el servidor de Windows 2003 y aún así mantener este progtwig en ejecución.

¿Esto es posible?

EDITAR: Más refinamiento aquí … No tengo la fuente, no es mi aplicación.

Los servicios de Windows no pueden tener GUI, por lo que tendrá que deshacerse de la GUI o separar su aplicación en dos partes: un servicio sin interfaz de usuario y una aplicación de “controlador”. Si tiene el código fuente, es fácil convertir el código que no es de la GUI en un servicio: Visual Studio tiene un tipo de proyecto de “Servicio de Windows” que se ocupa de la envoltura, y hay un tutorial sencillo que le muestra cómo crear un proyecto de implementación que se encargará de la instalación.

Si opta por la segunda ruta y necesita poner parte del código GUI original en un controlador, el controlador y el servicio pueden comunicarse a través de WCF, .NET Remoting o conexiones de socket simple con un protocolo que usted mismo defina. Si usa Remoting, asegúrese de usar una interfaz “gruesa” que transfiera datos con la menor cantidad posible de invocaciones de métodos: cada llamada tiene una cantidad considerable de gastos generales.

Si la interfaz de usuario es bastante simple, es posible que pueda salirse con la suya usando los archivos de configuración para los archivos de entrada y registro o el registro de eventos de Windows para la salida.

¿Alguien ha usado un producto de terceros como Always Up ?

Parece hacer lo que necesito. Es la capacidad de seguir corriendo a través de los ciclos de inicio de sesión / cierre de sesión que necesito. Y la capacidad de ignorar que es una aplicación GUI y ejecutarla de todos modos.

Deben vincularse manualmente con el exe y llamar a WinMain o algo así.

Puede envolverlo en srvany , aunque es posible que deba asignarle una cuenta de usuario real (en lugar de LocalService o algo similar)

¿Realmente necesita que se ejecute como un servicio o simplemente necesita que siga funcionando cuando no está conectado? Si es el último, puede desconectarse en lugar de cerrar la sesión y la aplicación continuará ejecutándose. La opción debe estar en la lista desplegable después de elegir Apagar o puede llamar a tsdiscon.exe.

¿Tienes la fuente? En muchos casos, la diferencia entre una aplicación independiente y un servicio es mínima.

La mayoría de los cambios están relacionados con conectar el código correctamente al administrador de servicios. Una vez hecho esto, sabrá que cualquier problema que ocurra es el resultado de su progtwigción y no de ningún otro progtwig.

Primero, debería preguntar por qué su servicio necesita una interfaz de usuario. Lo más probable es que no sea así, pero probablemente necesite un cliente que obtenga datos de este servicio. La razón por la cual los servicios no suelen tener GUI es que no tienen un entorno de ventana para ejecutar. Los servicios pueden iniciarse y ejecutarse sin que un usuario inicie sesión en la máquina. En este caso, no habría un escritorio para ejecutar la GUI del servicio.

Una vez dicho esto, puede establecer propiedades en el servicio para que se ejecute como usuario, como sugiere Mark. También puede especificar en las propiedades del servicio “Permitir que el servicio interactúe con el escritorio”. Solo haga esto si sabe que un usuario iniciará sesión.

Un servicio no debe tener una GUI, ya que debe ejecutarse sin necesidad de ninguna intervención de un usuario, y existen todo tipo de problemas asociados con la búsqueda y comunicación con el escritorio de usuarios correcto.

Dado que, presumiblemente, la razón para preguntar esto es poder monitorear remotamente la aplicación, la forma de hacerlo sería tener dos aplicaciones. El lado del servicio (escrito básicamente como una aplicación de consola) y el lado del cliente / monitor de la GUI. El servicio usaría alguna conectividad remota (cuando hice esto, utilicé Named Pipes) para comunicarme con la aplicación cliente / monitoreo. Cualquiera de los dos debería poder funcionar sin el otro, y ciertamente el servicio debería poder ejecutarse sin el cliente.

Qué pasa si creas un servicio. Ese servicio está configurado para interactuar con el escritorio. Configúrelo para ejecutar un poco de usuario y para iniciarse automáticamente. Del servicio CreateProcess en esta otra aplicación. Supongo que esto es rápido para tratar de usar C # (C / C ++ era un montón de código incluso para ser un servicio si no recuerdo). ¿¿Funcionaría eso??

¡PERO!

Lo primero que pensé fue crear una computadora virtual en un host virtual de clase servidor (como Virtual Server, HyperV, VMWare). Esas máquinas virtuales se ejecutarán como servicio (o lo que sea que Hyper V haga). La máquina virtual siempre se estaría ejecutando, independientemente del inicio y cierre de sesión.

Haga que esta computadora virtual inicie sesión automáticamente en Windows (TweakUI puede configurar esto) y luego simplemente inicie la aplicación GUI usando un acceso directo a la carpeta de Inicio. Incluso puede usar el GUI del progtwig en el escritorio remoto (apuesto a que Always Up no puede hacer eso).

Puede usar ServiceMill para lograr esta operación. Básicamente, instala ServiceMill Server en su servidor. A continuación, haz clic en el botón derecho sobre tu archivo ejecutable e “Instalar como Servicio ServiceMill”. A continuación, configure algunas cosas (usuario / contraseña, si desea interactuar con el escritorio o si prefiere ocultar el interfaz de usuario … y establecer el modo de inicio en automático).

Otra herramienta de Active + Software puede ser una solución, ServiceMill Exe Builder que le permite crear servicios desde Command Line y esto es genial si está usando un Servidor de Integración Continua o si planea distribuir su componente como un servicio sin tener que pensar en integración de servicios (además es libre de regalías).

He tenido una buena experiencia con winsw . Pude convertir bastante fácilmente mis archivos por lotes a los servicios que lo usaban.

Lo he usado también para nginx, por esta respuesta .

FireDaemonPro convierte la mayoría de las aplicaciones GUI en servicios; no es gratis, pero valdría la pena obtenerlo.