2008-09-10 25 views
28

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 programa en ejecución.¿Cómo puedo ejecutar una aplicación GUI de Windows como un servicio?

¿Esto es posible?

EDITAR: Refinar más aquí ... No tengo la fuente, no es mi solicitud.

+0

Más refinamiento aquí ... No tengo la fuente, no es mi aplicación. – JeffV

+2

Este es el tipo de prueba que los administradores del sistema deben resolver todos los días, por lo que debe consultar con un administrador del sistema. Como no tiene la fuente, esta no es una aplicación de programación. –

Respuesta

4

Puede envolverlo en srvany, aunque puede que tenga que asignarle una cuenta de usuario real (en contraposición a LocalService o algo así)

0

¿Tiene 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 la conexión correcta del código al administrador de servicios. Una vez hecho esto, sabrá que cualquier problema que ocurra es el resultado de su programación y no de ningún otro programa.

15

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 mediante 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 IU es bastante simple, es posible que pueda salirse con la suya usando los archivos de configuración para archivos de entrada y registro o el Registro de eventos de Windows para la salida.

+0

Es por eso que es un problema difícil. Tengo una aplicación GUI existente (sin fuente) que necesito ejecutar como un servicio. – JeffV

+1

Esto está mal. Los servicios de Windows pueden tener GUI. Este es el caso del servicio de impresora que puede mostrar una ventana. – labilbe

+2

@labilbe - definitivamente es posible que los servicios de Windows generen procesos que tienen una GUI. Esto puede ser lo que está haciendo el servicio de la impresora. Esto no es lo mismo que el proceso de servicio que tiene una GUI. También es cierto que las piezas del SO Windows a veces pueden hacer cosas que de lo contrario no están permitidas. – McKenzieG1

0

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 una computadora de escritorio para ejecutar la GUI del servicio.

Dicho esto, puede establecer las propiedades en el servicio para que se ejecute como usuario según lo sugerido por Mark. También puede especificar en las propiedades del servicio "Permitir que el servicio interactúe con el escritorio". Haga esto solo si sabe que un usuario va a iniciar sesión.

0

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

Dado que, presumiblemente, el motivo para solicitar esto es poder supervisar de forma remota 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.

6

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

Parece que hace 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 enlazar al exe manualmente y llamar a WinMain o algo así.

+0

He intentado con AlwaysUp pero no funcionó. Funcionó muy bien, al menos para las aplicaciones de línea de comandos. He seguido recibiendo notificaciones sobre "Un programa que se ejecuta en esta computadora está tratando de mostrar un mensaje". Estoy usando winsw en cambio ahora. – VitalyB

0

Qué sucede si crea 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 servidor virtual de clase de 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 atajo a la carpeta de Inicio. Incluso puede usar el GUI del programa en el escritorio remoto (apuesto a que Always Up no puede hacer eso).

2

¿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.

0

Puede usar ServiceMill para lograr esta operación. Básicamente, instala ServiceMill Server en su servidor. Luego haga clic en el botón derecho sobre su archivo ejecutable y "Instalar como un servicio ServiceMill". A continuación, configure algunas cosas (usuario/contraseña, si desea interactuar con el escritorio o si prefiere ocultar la 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 piense en la integración del servicio (además, es libre de regalías).

0

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 this answer.

0

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

Cuestiones relacionadas