2010-09-26 11 views
11

Oye, estoy tratando de obtener un servicio para iniciar mi programa pero no muestra la GUI. El proceso comienza pero no se muestra nada. Intenté habilitar "Permitir que el servicio interactúe con el escritorio", pero eso todavía no funciona. Mi programa es un dispositivo de bloqueo de computadora para evitar que usuarios no autorizados accedan a la computadora. Estoy ejecutando Windows 7 con un sistema operativo de 64 bits.El servicio que inicia un proceso no muestra la GUI C#

Este es el código para mi servicio:

 protected override void OnStart(string[] args) 
    { 
     Process p = new Process(); 
     p.StartInfo.FileName = "notepad.exe"; 
     p.Start(); 

     FileStream fs = new FileStream(@"C:\Users\David\Documents\Visual Studio 2010\Projects\LockPCService\LockPCService\bin\Debug\ServiceLog.dj", 
     FileMode.OpenOrCreate, FileAccess.Write); 
     StreamWriter m_streamWriter = new StreamWriter(fs); 
     m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); 
     m_streamWriter.WriteLine(" LockPCService: Service Started " + DateTime.Now + "\n" + "\n"); 
     m_streamWriter.Flush(); 
     m_streamWriter.Close(); 
    } 

    protected override void OnStop() 
    { 
     FileStream fs = new FileStream(@"C:\Users\David\Documents\Visual Studio 2010\Projects\LockPCService\LockPCService\bin\Debug\ServiceLog.dj", 
     FileMode.OpenOrCreate, FileAccess.Write); 
     StreamWriter m_streamWriter = new StreamWriter(fs); 
     m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); 
     m_streamWriter.WriteLine(" LockPCService: Service Stopped " + DateTime.Now + "\n"); m_streamWriter.Flush(); 
     m_streamWriter.Close(); 
    } 

para tratar de obtener el servicio de trabajo que estoy usando el Bloc de notas. Cuando miro los procesos, el bloc de notas se está ejecutando pero no hay una GUI. Además, el ServiceLog está allí y funciona cada vez que lo ejecuto.

¿Alguna idea sobre por qué esto no funciona?

Gracias.

Respuesta

21

This article explica Session 0 Isolation que, entre otras cosas, impide que los servicios creen una IU en Windows Vista/7. En su servicio, comienza otro proceso, comienza en la Sesión 0 y tampoco muestra ninguna IU. (Por cierto, se crea la interfaz de usuario, es solo que la sesión 0 nunca se muestra). This article en CodeProject puede ayudarlo a crear un proceso desde un servicio en el escritorio del usuario y mostrar su UI.

Además, considere envolver sus objetos de secuencia en un using statement para que se desechen correctamente.

+0

Para esta tarea, en realidad es mejor no usar el escritorio del usuario, porque está tratando de bloquear el acceso a él. –

+0

Brillante, lo echarán un vistazo, ¡gracias! – Crazyd22

+0

Es un formulario que se muestra y bloquea el mouse dentro de él, de modo que cuando ingresen la contraseña, se liberará el mouse y podrán usar la computadora de nuevo – Crazyd22

4

Los servicios se ejecutan en una cuenta diferente, por lo que el bloc de notas lo ejecuta otro usuario y en otro escritorio, por lo que no puede verlo. 'Permitir que el servicio interactúe con el escritorio' ya no se admite desde Vista.

+0

Ah, ya veo, ¿cómo podría ejecutarlo con el usuario actual? – Crazyd22

+0

Incluso los servicios que se ejecutan bajo la cuenta del usuario conectado se encontrarán en una sesión de inicio de sesión diferente y se ejecutarán en un entorno de GUI de aislamiento. Necesita leer sobre estaciones de ventana y escritorios. http://msdn.microsoft.com/en-us/library/ms681928.aspx –

+0

Además, esto es cierto pero no ayuda a resolver el problema, por lo que debería haber sido un comentario, no una respuesta. –

2

Los servicios se ejecutan en una sesión de inicio de sesión diferente y tienen una estación de ventana diferente del usuario. Eso significa que toda la actividad de GUI se segrega de los programas del usuario, no que el servicio no pueda mostrar una GUI. En realidad, este diseño hace que sea mucho más fácil bloquear temporalmente el acceso a los programas del usuario.

Deberá llamar al SwitchDesktop.

+7

Ya sabes, esa pequeña caja que aparece cuando bajaste para sugerir que dejes un comentario explicando por qué, está ahí por una razón. Los que responden realmente prestan atención a los comentarios racionales. –

4

Sé que esta es una publicación tardía, pero encontré que this article fue muy útil para mí. Estoy ejecutando Windows 7 y la solución proporcionada en este artículo funciona muy bien.

Si descarga el código, hay una clase llamada ApplicationLoader. Incluya esa clase en su proyecto y luego sea tan simple como esto:

// the name of the application to launch 
String applicationName = "cmd.exe"; 

// launch the application 
ApplicationLoader.PROCESS_INFORMATION procInfo; 
ApplicationLoader.StartProcessAndBypassUAC(applicationName, out procInfo); 
+0

Tnx, funcionó para mí en windows7, ¿funcionará esto para Windows8 también? todavía no tienes uno para probar –

+0

No tengo una máquina con Windows 8 para probar. Supuestamente, la próxima semana comenzaré, ya veremos. – davehale23

+0

¿Ha funcionado? – bumbeishvili

Cuestiones relacionadas