2012-08-10 35 views
6

Estoy creando un servicio de Windows con Delphi. Lo que mi servicio necesita hacer es básicamente abrir un programa. En mi código estoy usando WinExec(aux,SW_SHOWNORMAL);. Cuando comienzo y ejecuto el servicio parece que no se hace nada, pero cuando miro en TaskManager, el programa que mi servicio debería abrir está en la lista y en la Columna de nombre de usuario aparece SYSTEM.Crear un servicio de Windows para abrir un programa- Delphi

El programa se está abriendo pero no aparece en la pantalla. Hice una investigación en Google y encontré algunas funciones como CreateProcess pero no sé cómo usarla. ¿Qué estoy haciendo mal?

Lo siento por mi mal inglés.

+0

Si usa Windows Vista o 7, consulte este artículo de MSDN [Iniciando un proceso interactivo desde el Servicio de Windows en Windows Vista y más adelante] (http://blogs.msdn.com/b/winsdk/archive/2009/07/14) /launching-an-interactive-process-from-windows-service-in-windows-vista-and-later.aspx) – RRUZ

+1

@Daniel Tu inglés está magníficamente bien. –

+0

@Daniel, no olvides ['aceptar respuestas'] (http://meta.stackexchange.com/a/5235/179541) si resuelven tus problemas ;-) – TLama

Respuesta

6

Los servicios siempre se ejecutan en la Sesión 0. Un proceso iniciado por un servicio se ejecuta en la Sesión del servicio por defecto, a menos que el servicio use CreateProcessAsUser() para ejecutar el proceso en una Sesión diferente.

En XP y anteriores, el primer usuario que inicia sesión también se ejecuta en la Sesión 0 (los usuarios subsiguientes para iniciar sesión se ejecutan en las Sesiones 1+). Por lo tanto, si el servicio está marcado como interactivo cuando está instalado y ejecuta un proceso que tiene una interfaz de usuario, un usuario que se ejecuta en la sesión 0 puede ver la interfaz de usuario.

En Vista y versiones posteriores, esto ya no es posible. Los usuarios ya no se ejecutan en la Sesión 0, y los servicios ya no pueden marcarse como Interactivos. Esto se conoce como "Aislamiento de la sesión 0". Un servicio debe usar CreateProcessAsUser() ahora para ejecutar un proceso de IU en una sesión interactiva para que el usuario pueda verlo.

consulte en MSDN para más detalles:

Session 0 Isolation

Impact of Session 0 Isolation on Services and Drivers in Windows

Calling CreateProcessAsUser() from service

Launching an interactive process from Windows Service in Windows Vista and later

CreateProcessAsUser function

+0

¡Gracias! 'CreateProcessAsUser()' ayudará. Otra cosa, ¿puedes ejemplificar los usos de 'CreateProcessAsUser()'? Tengo problemas con los parámetros. – Daniel

+3

Los artículos que he vinculado le muestran cómo usar 'CreateProcessAsUser()' en un servicio, y hay mucha información disponible en línea al respecto, así que no voy a explicarlo aquí. Simplemente sepa que la diferencia entre 'WinExec()' (que usa 'CreateProcess()' internamente) y 'CreateProcessAsUser()' es que 'CreateProcess()' ejecuta el nuevo proceso en la cuenta de usuario del proceso de llamada, mientras 'CreateProcessAsUser() 'ejecuta el nuevo proceso en la cuenta de usuario especificada en su lugar. Esto es importante cuando se intenta acceder a la sesión del usuario desde una sesión de servicio. –

Cuestiones relacionadas