2010-02-27 45 views
18

Tengo un servicio de Windows (C#) instalado en un servidor que lanza cada 10 minutos un archivo ejecutable (C#) para procesar algunas imágenes de un directorio a otro. No se requiere interacción con ningún usuario. Sin embargo, desde el archivo ejecutable como una ventana de salida, para que el servicio se ejecute tengo que habilitar el "Permitir que el servicio interactúe con el escritorio" casilla de verificación que se considera insecure and bad practice. ¿Cómo abordaría este problema? Me gustaría tener el ejecutable separado de mi servicio ventanas porque¿Alternativa a "Permitir que el servicio interactúe con el escritorio"?

  • que hace que sea más fácil de depurar y no requiere una redeploy servicio de Windows completo.
  • veces uso las mismas ventanas servicio a lanzar varios archivos ejecutables en diferentes intervalos (pero todos ellos relacionados con el mismo proyecto ).

EDIT:

Cuando la interacción con el escritorio no está activado, la aplicación de consola no recibe ejecutado correctamente y aparece el siguiente error dentro de los registros de Windows:

Faulting application myapp.exe, version 1.0.0.0, time stamp 0x4b8304c3, 
faulting module KERNEL32.dll, version 6.0.6002.18005, time stamp 0x49e03821, 
exception code 0xc0000142, fault offset 0x00009eed, process id 0x10ec, 
application start time 0x01cab736950a64b5. 

vez la interacción del escritorio está habilitada, la aplicación se ejecuta normalmente.

¿Alguna idea?

Muchas gracias por su tiempo.

+0

¿Esto es para Vista y más tarde? –

+0

La parte de depuración no es una buena razón. Podría tener un ejecutable y el servicio usar un ensamblaje común que contenga toda la funcionalidad. –

+0

Sí, el servicio de Windows ejecuta Windows Server 2008 Web Edition. El servicio de Windows y el ejecutable se generan con Visual Studio 2008 contra .NET Framework 3.5 – jdecuyper

Respuesta

10

Si está utilizando Vista y más tarde y que realmente no necesita ningún tipo de interacción con el usuario, pero tienen un exe interactiva para ejecutar, el Session 0 isolation feature debería ayudar a aliviar algunas de las preocupaciones acerca de la 'mala practique 'al hacer que un servicio interactúe con el escritorio (que en la Sesión 0 no tiene consola física).

Este aislamiento de la sesión 0 evitará que los usuarios sin privilegios realicen Shatter Attacks en su servicio, ya que obtienen sus escritorios interactivos en diferentes sesiones. Los ataques de desintegración son la razón principal por la que esta 'interacción con el escritorio' se consideró una mala práctica y si está usando Vista o más adelante, debería estar bien si no puede evitarlo (o tendrá que gastar demasiado esfuerzo para hacerlo).

Por lo tanto, si las cosas funcionan bien tal como están, probablemente estés bien.

Por supuesto, después de una actualización del sistema operativo, es posible que las cosas dejen de funcionar, por lo que probablemente sea mejor prepararse para mover la dependencia de la interactividad, ya que realmente no la necesita.

+0

El aislamiento de la sesión 0 tiene mucho sentido y de alguna manera me preocupa menos la implicación de seguridad de mi servicio. Pero como mencionó correctamente, sería mejor dejar fuera la interactividad. Al crear el proceso, ya traté de establecer las propiedades 'UseShellExecute' en verdadero y 'CreateNoWindow' en falso, pero el servicio aún requiere interacción con el escritorio. – jdecuyper

+0

¿Escribiste bien? CreateNoWindow debe ser * verdadero * y creo que UseShellExecute probablemente sea falso (aunque UseShellExecute podría no ser importante). – Weeble

+0

Disculpa por ese error tipográfico CreateNoWindow está configurado en verdadero. – jdecuyper

2

Si puede, recomiendo volver a escribir sus ejecutables que manejan el movimiento para no usar una ventana de salida. Si son aplicaciones de consola estándar sin salida, puede ejecutarlas desde un servicio sin necesidad de "Permitir que el servicio interactúe con el escritorio". Esto le proporciona todos los beneficios, sin ningún cambio en su servicio.

+0

¿Qué haría para eliminar la salida de la aplicación? ¿Dónde piensas en la misma solución que Weeble? Gracias. – jdecuyper

+0

Sí, eso fue básicamente mi pensamiento. Si solo se trata de una aplicación de consola, no debería necesitar interacción en el escritorio. Sin embargo, si está usando una aplicación de Windows, no funcionará ... –

2

¿El subproceso es simplemente una aplicación de consola? No escribí Servicios de Windows, pero creo que quizás comenzar el subproceso sin una ventana sería suficiente. Utilice la sobrecarga de Process.Start que toma ProcessStartInfo y establece ProcessStartInfo.CreateNoWindow en true.

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

+0

Muchas gracias por su enlace. Ya lo probé pero todavía requiere que la casilla de verificación esté habilitada. – jdecuyper

+0

Lamentablemente, no tengo acceso a una máquina con Windows en este momento. ¿Sabes si el subproceso está comenzando y luego está fallando o simplemente no está comenzando? ¿Y es una aplicación de consola, o algo más? – Weeble

+0

Es una aplicación de consola C#. Edité mi pregunta y agregué el mensaje de error que se registra. – jdecuyper

4

Sé que esto es un poco tarde, pero en esta circunstancia utilizaría el programador de tareas y no me molestaría con el servicio de Windows. El planificador de tareas tiene un conjunto completo de opciones de programación y puede ejecutar aplicaciones de consola sin problemas.

Cuestiones relacionadas