Interactive Services
Normalmente, los servicios son aplicaciones de consola diseñadas para ejecutarse desatendidas sin una interfaz gráfica de usuario (GUI). Sin embargo, algunos servicios pueden requerir interacción ocasional con un usuario. En esta página se describen las mejores maneras de interactuar con el usuario desde un servicio.
Importante
Los servicios 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 deben usarse en el nuevo código.
Interacción con un usuario de un servicio indirectamente
Puede usar las técnicas siguientes para interactuar con el usuario desde un servicio en todas las versiones compatibles de Windows:
Muestra un cuadro de diálogo en la sesión del usuario mediante la funciónWTSSendMessage.
Cree una aplicación de GUI oculta independiente y use la función CreateProcessAsUser para ejecutar la aplicación en el contexto del usuario interactivo. Diseñe la aplicación de GUI para comunicarse con el servicio a través de algún método de comunicación entre procesos (IPC), por ejemplo, canalizaciones con nombre. El servicio se comunica con la aplicación de GUI para indicarle cuándo mostrar la GUI. La aplicación comunica los resultados de la interacción del usuario de nuevo con el servicio para que el servicio pueda realizar la acción adecuada. Tenga en cuenta que IPC puede exponer las interfaces de servicio a través de la red a menos que use una lista de control de acceso (ACL) adecuada.
Si este servicio se ejecuta en un sistema multiusuario, agregue la aplicación a la siguiente clave para que se ejecute en cada sesión: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Si la aplicación usa canalizaciones con nombre para IPC, el servidor puede distinguir entre varios procesos de usuario proporcionando a cada canalización un nombre único basado en el identificador de sesión.
La técnica siguiente también está disponible para Windows Server 2003 y Windows XP:
- Para mostrar un cuadro de mensaje, llame a la funcióncuadro de mensajes decon MB_SERVICE_NOTIFICATION. Esto se recomienda para mostrar mensajes de estado simples. No llame a MessageBox durante la inicialización del servicio o desde la rutinahandlerEx, a menos que lo llame desde un subproceso independiente, de modo que vuelva al SCM de forma oportuna.
Uso de un servicio interactivo
De forma predeterminada, los servicios usan una estación de ventana de no interactiva y no pueden interactuar con el usuario. Sin embargo, un servicio interactivo puede mostrar una interfaz de usuario y recibir entradas de usuario.
Cautela
Los servicios que se ejecutan en un contexto de seguridad con privilegios elevados, como la cuenta LocalSystem, no deben crear una ventana en el escritorio interactivo porque cualquier otra aplicación que se ejecuta en el escritorio interactivo puede interactuar con esta ventana. Esto expone el servicio a cualquier aplicación que ejecute un usuario que haya iniciado sesión. Además, los servicios que se ejecutan como LocalSystem no deben acceder al escritorio interactivo llamando a la función OpenWindowStation o GetThreadDesktop.
Para crear un servicio interactivo, haga lo siguiente al llamar a la función CreateService:
- Especifique NULL para el parámetro lpServiceStartName para ejecutar el servicio en el contexto de la cuenta localSystem de .
- Especifique la marca SERVICE_INTERACTIVE_PROCESS.
Para determinar si un servicio se ejecuta como un servicio interactivo, llame a la función GetProcessWindowStation para recuperar un identificador a la estación de ventanas y la función GetUserObjectInformation para probar si la estación de ventana tiene el atributo WSF_VISIBLE.
Sin embargo, tenga en cuenta que la siguiente clave del Registro contiene un valor, NoInteractiveServices, que controla el efecto de SERVICE_INTERACTIVE_PROCESS:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
El NoInteractiveServices valor predeterminado es 1, lo que significa que no se permite que ningún servicio se ejecute de forma interactiva, independientemente de si tiene SERVICE_INTERACTIVE_PROCESS. Cuando NoInteractiveServices se establece en 0, los servicios con SERVICE_INTERACTIVE_PROCESS pueden ejecutarse de forma interactiva.
Windows 7, Windows Server 2008 R2, Windows XP y Windows Server 2003: The NoInteractiveServices valor predeterminado es 0, lo que significa que los servicios con SERVICE_INTERACTIVE_PROCESS pueden ejecutarse de forma interactiva. Cuando NoInteractiveServices se establece en un valor distinto de cero, no se permite que ningún servicio iniciado posteriormente se ejecute de forma interactiva, independientemente de si tiene SERVICE_INTERACTIVE_PROCESS.
Importante
Todos los servicios se ejecutan en la sesión 0 de Terminal Services. Por lo tanto, si un servicio interactivo muestra una interfaz de usuario, solo es visible para el usuario que se ha conectado a la sesión 0. Dado que no hay ninguna manera de garantizar que el usuario interactivo esté conectado a la sesión 0, no configure un servicio para que se ejecute como un servicio interactivo en Terminal Services o en un sistema que admita el cambio rápido de usuario (el cambio de usuario rápido se implementa mediante Terminal Services).