¿Cómo puede un servicio de Windows iniciar un proceso cuando se produce un evento de temporizador?

timer.Elapsed un servicio de Windows con el temporizador y en el evento de timer.Elapsed del timer.Elapsed . timer.Elapsed estoy creando un proceso ( System.Diagnostics.Process.Start(exe path) ) en un intervalo de 5 segundos. Pero este proceso no se crea al disparar un evento.

¿Hay otra manera de hacer esto?

Gracias por adelantado.

 private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Process pr = new Process(); pr.StartInfo.FileName = @"C:\Program Files\Messenger\msmsgs.exe"; pr.StartInfo.WindowStyle = ProcessWindowStyle.Normal; pr.StartInfo.CreateNoWindow = false; pr.Start(); } 

Está agregando descripciones del problema en los comentarios a medida que avanza, lo que habría sido útil saber desde el principio. La razón por la que puede ver que el proceso ha comenzado, pero no se abre ninguna ventana, se debe a los cambios en el modelo de seguridad que se realizaron a los Servicios de Windows en Windows Vista y posteriores. Aún no lo has mencionado específicamente, pero tengo una fuerte sospecha de que estás tratando de ejecutar esto en uno de esos sistemas operativos. El verdadero problema no es comenzar un proceso, sino mostrar una IU.

Lo que está tratando de lograr se llama un “Servicio interactivo” , que es uno que se permite interactuar directamente con el usuario y el escritorio (es decir, mostrar una ventana o diálogo).
Si usa Windows XP (y su servicio solo tendrá que ejecutarse bajo Windows XP), puede seguir las instrucciones en ese artículo para permitir que su servicio se ejecute en modo interactivo, lo que le permitirá visualizar la aplicación Adobe Acrobat. ventana como esperas Sin embargo, como también indica esa documentación, esta característica no funciona en Windows Vista y posteriores:

Los servicios importantes no pueden interactuar directamente con un usuario a partir de Windows Vista. Por lo tanto, las técnicas mencionadas en la sección titulada Uso de un servicio interactivo no se deben utilizar en el nuevo código.

Más específicamente, en esas versiones, se realizaron cambios a la forma en que se ejecutan los servicios y las aplicaciones. Los servicios ahora están aislados por el sistema en la Sesión 0, mientras que las aplicaciones se ejecutan en otras sesiones. Esto tiene como objective aislar los servicios de los ataques que se originan en el código de la aplicación. Por lo tanto, ninguna UI mostrada por un servicio será visible para ningún usuario en el sistema, incluido un simple cuadro de mensaje. Puede leer el documento que explica estos cambios con más detalle aquí . Si es una persona más visual, consulte el siguiente diagtwig que ilustra el nuevo modelo, prestando especial atención a las líneas divisorias:

Modelo de aislamiento de procesos de Windows en Windows Vista / 7

El resultado es que si estás apuntando a esas versiones, o tal vez necesites enfocar esas versiones, no puedes usar esta laguna. Digo “escapatoria” porque la línea de fondo, como mencioné en un comentario, es que los Servicios de Windows no están destinados a ser interactivos . Lo que intenta hacer aquí va en contra del propósito y el diseño de un servicio. No fue recomendado antes, y ahora no funciona en absoluto. Si necesita esta funcionalidad en particular, debe crear un tipo diferente de aplicación. Tanto Windows Forms como WPF están destinados a aplicaciones en modo usuario, y ambos pueden iniciar procesos y abrir ventanas nuevas según sea necesario. Recomiendo encarecidamente que se convierta en este estilo de aplicación en su lugar.

Como no obtendrá un proceso para mostrar la interfaz de usuario del servicio, le recomiendo que ejecute el proceso de ayuda cuando el usuario inicie sesión y comience su proceso desde allí.

Me doy cuenta de que llegué un poco tarde a esta fiesta. Pero dado que surgió esta pregunta en mi búsqueda de una solución, proporcionaré una respuesta a la pregunta del OP.

Puede iniciar un progtwig desde un servicio utilizando CreateProcessAsUser, utilizando el token del usuario que ha iniciado sesión. MSDN proporciona una buena aplicación de ejemplo que lo demuestra; busque CSCreateProcessAsUserFromService: https://code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e#content

Lo intenté, y funciona. Puedo crear un nuevo proceso para mi aplicación .NET existente desde un servicio, y funciona muy bien. Establecí las propiedades de inicio de sesión del servicio en la cuenta del sistema local, pero dejé sin marcar la opción “Permitir que el servicio interactúe con el escritorio”. Mi aplicación se crea cuando expira el temporizador y funciona igual que cuando se inicia normalmente, incluida la presentación de la GUI y la interacción del usuario.

Si esto es algo indebido o indeseable es otra discusión. Pero de hecho es posible, y realmente no es tan difícil.

Hay una especie de solución, pero le aconsejo que solo haga esto si ASEGÚRESE DE ACEPTAR EL PROBLEMA DE SEGURIDAD.

Esta podría ser la respuesta a su problema: CreateProcessAsUser .

El ejemplo muestra cómo crear / iniciar un proceso de forma interactiva en la sesión del usuario conectado desde una aplicación de servicio escrita en C # .Net.