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 código nuevo.

 

Interacción con un usuario de un servicio indirectamente

Puede usar las siguientes técnicas 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ón WTSSendMessage .

  • 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 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 asignando 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ón MessageBox con 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 rutina HandlerEx , a menos que la 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 ventanas no interactivas y no pueden interactuar con el usuario. Sin embargo, un servicio interactivo puede mostrar una interfaz de usuario y recibir entradas de usuario.

Precaución

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, ya que 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 ha iniciado sesión. Además, los servicios que se ejecutan como LocalSystem no deben tener acceso 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 :

  1. Especifique NULL para el parámetro lpServiceStartName para ejecutar el servicio en el contexto de la cuenta LocalSystem.
  2. 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 valor NoInteractiveServices tiene como valor predeterminado 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: El valor NoInteractiveServices tiene como valor predeterminado 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 a partir de entonces 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).