2009-07-10 9 views
5

He escrito un servicio de Windows simple que ejecutará un exe especificado en el método onstart() del servicio. Después de iniciar el servicio, el ejecutable del exe se mostró solo en en la memoria, pero no se muestra en el explorador.Lanzamiento de la aplicación GUI desde el servicio de Windows - La ventana no aparece

Estoy tratando de lanzar un calc.exe desde mi código. Muestra el exe en la memoria pero no aparece en mi vista (es decir) en el explorador.

A continuación se muestra el código para poner en marcha el exe en el método onStart()

Process pr=new Process(); 
    pr.StartInfo.FileName="calc.exe"; 
    pr.StartInfo.WindowStyle=ProcessWindowStyle.Maximized; 
    pr.StartInfo.CreateNoWindow=false; 
    pr.Start(); 
// pr.WaitForExit(); 
+0

¿Qué esperas? Intente ejecutar un archivo por lotes en su lugar. –

+0

¿Qué tipo de ejecutable estás tratando de ejecutar? – abhilash

+0

Por favor, reformule su pregunta a algo más significativo. No dice mucho al examinar una lista de preguntas ... – Hemant

Respuesta

1

Los servicios no son interactivos, por definición, por lo que no debe esperar ningún elemento de interfaz de usuario para mostrar al iniciar una aplicación desde un servicio.

Es por diseño ...

4

Los servicios se ejecutan con diferentes privilegios de la cuenta (LocalService/NetworkService etc) y por lo tanto no tienen acceso a su escritorio (bajo de control de su cuenta de acceso).

Los servicios están destinados a hacer su trabajo en silencio y eso es lo que deberían hacer. (con la excepción de registrar algo en el registro de eventos de Windows cuando tienen algo importante que decir)

+0

Además, el Administrador de tareas muestra de forma predeterminada solo los procesos que se ejecutan bajo * su * cuenta de inicio de sesión. – MSalters

10

Los servicios se ejecutan en otra sesión en Vista o posterior y las aplicaciones iniciadas directamente desde los servicios se inician en la misma sesión de forma predeterminada. Es posible iniciar aplicaciones en otras sesiones; debe encontrar el ID de la sesión del usuario y usar CreateProcessAsUser.

Si hay más de un usuario conectado y necesita iniciar su programa para todos los usuarios, debe encontrar los identificadores de todas las sesiones.

Aquí es código de ejemplo:

int session = Win32.WTSGetActiveConsoleSessionId(); 
if (session == 0xFFFFFFFF) 
{ 
    return false; 
} 

IntPtr userToken; 
bool res = Win32.WTSQueryUserToken(session, out userToken); 
if (!res) 
{ 
    this.log.WriteEntry("Error WTSQueryUserToken"); 
    return false; 
} 

string path = GetPath(); 
string dir = Path.GetDirectoryName(path); 
Win32.STARTUPINFO si = new Win32.STARTUPINFO(); 
si.lpDesktop = "winsta0\\default"; 
si.cb = Marshal.SizeOf(si); 

Win32.PROCESS_INFORMATION pi = new Win32.PROCESS_INFORMATION(); 
Win32.SECURITY_ATTRIBUTES sa = new Win32.SECURITY_ATTRIBUTES(); 
sa.bInheritHandle = 0; 
sa.nLength = Marshal.SizeOf(sa); 
sa.lpSecurityDescriptor = IntPtr.Zero; 

if (!Win32.CreateProcessAsUser(userToken,  // user token 
           path,   // exexutable path 
           string.Empty, // arguments 
           ref sa,   // process security attributes (none) 
           ref sa,   // thread security attributes (none) 
           false,   // inherit handles? 
           0,    // creation flags 
           IntPtr.Zero, // environment variables 
           dir,   // current directory of the new process 
           ref si,   // startup info 
           out pi))  // receive process information in pi 
{ 
    int error = Marshal.GetLastWin32Error(); 
    this.log.WriteEntry("Error CreateProcessAsUser:" + error); 
    return false; 
} 
0

Como ya se ha mencionado a los demás un servicio de Windows es "normalmente" ejecuta en una cuenta separada ("LocalSystem" o "NetworkService"). Esta es la razón por la cual es posible que no vea la interfaz de usuario del programa iniciado por su servicio. Además, los servicios no están destinados a tener una IU, sino que actúan como un servicio en segundo plano.

Pero también tenga en cuenta que iniciar una aplicación por un servicio puede ser un alto riesgo de seguridad, ya que la aplicación se ejecuta con los mismos privilegios que su servicio. Normalmente esta sería la cuenta del sistema local.

No sé lo que está tratando de lograr con su servicio, pero considere utilizar la función de inicio automático de Windows en lugar de un servicio para ejecutar su aplicación.

3

Si abre la ventana de propiedades de su servicio, vaya a la pestaña Iniciar sesión y luego marque la casilla de verificación "Permitir que el servicio interactúe con el escritorio" obtendrá el comportamiento que desea. Además, dependiendo de qué aplicación tenga qué ejecutar, es posible que necesite cambiar la cuenta de inicio de sesión.

+0

Lamentablemente, esto solo funciona para la cuenta de servicio :( – Grzenio

Cuestiones relacionadas