Cómo diseñar un servicio para interactuar con varias sesiones de usuario

Resumen

Este artículo describe cómo diseñar una aplicación de servicio de Windows para interactuar con los usuarios a través de una interfaz gráfica de usuario (GUI) en un sistema multiusuario.

La arquitectura que se describe en este artículo está destinada a utilizarse en los servicios que se ejecutan en los sistemas operativos siguientes:
  • Microsoft Windows NT 4.0 Terminal Server Edition
  • Windows 2000 con servicios de Terminal Server
  • Microsoft Windows XP con el cambio rápido de usuario
  • Microsoft Windows Server 2003
Esta arquitectura también funciona bien para sistemas de usuario único (servidores de servicios que no sean de Terminal Server).

Más información

En la siguiente sección, se describe la arquitectura general de un servicio interactivo en un sistema multiusuario. Sin embargo, puede ser útil para lea primero la sección más adelante en este artículo titulada "Understanding servicios y Terminal Server". Esa sección proporciona información y términos arquitectónico que pertenecen a este diseño.

Diseñar un servicio interactivo para Terminal Server

Si un servicio que se ejecuta en un sistema multiusuario debe interactuar con el usuario que ha iniciado la sesión, Microsoft recomienda que el servicio interactuar por medio de una aplicación GUI independiente que se ejecuta en la sesión del usuario. Microsoft recomienda que esta aplicación GUI diseñarse para comunicarse con el servicio a través de algún método de comunicación entre procesos, como a través de una canalización con nombre.

Nota: Se trata de una arquitectura cliente/servidor. Puede configurar el proceso del cliente (la aplicación de interfaz gráfica de usuario) para ejecutar en cada sesión de usuario como un proceso oculto. Para que el cliente se ejecutan en cada sesión, lo más sencillo es agregar el proceso del cliente a la clave Run en el subárbol HKEY_LOCAL_MACHINE del registro.
Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
Definición de 137367 de las claves RunOnce en el registro
El servidor de proceso (el servicio), a continuación, se comunica con el cliente adecuado a través de algún medio de comunicación entre procesos para indicar cuándo se muestra la interfaz gráfica al cliente. El cliente, a su vez, comunica los resultados de la interacción del usuario al servicio para que el servicio pueda actuar correctamente.

Puesto que habrá varios clientes ejecutándose en el sistema (un independiente cliente ejecutan en cada sesión de usuario), el servicio debe tener un método bien definido para distinguir a los clientes. El método más común para distinguir a los clientes consiste en el nombre del canal de comunicación utilizando el identificador de sesión. del cliente

Por ejemplo, si el cliente está ejecutando en la sesión 4, el cliente puede crear una canalización cuyo nombre es una concatenación de un GUID no publicado, seguido por "Channel_4". El cliente entonces pasará su identificador de sesión para el servicio (quizás conectándose a otra canalización que es creado por el servicio) para que sepa el servicio para conectarse a la canalización "Channel_4". El cliente puede obtener su identificador de sesión llamando a WTSQuerySessionInformation() con WTSSessionId como la clase de información.

Importante: Para mayor seguridad, el cliente debe especificar FILE_FLAG_FIRST_PIPE_INSTANCE en el parámetro dwOpenMode al llamar a CreateNamedPipe(). Esto protege contra los intentos por aplicaciones malintencionadas para conectarse a un proceso que se ejecuta en la cuenta LocalSystem.

Al diseñar las aplicaciones de cliente y de servicio, una última consideración es el uso compartido de objetos de núcleo con nombre (por ejemplo, eventos, exclusiones mutuas, semáforos, objetos de asignación de archivos y otros objetos). De forma predeterminada, un objeto de kernel es accesible sólo en la sesión que se creó el objeto. Esto se denomina el espacio de nombres de sesión local. Si la aplicación cliente y la aplicación de servicio deben acceder al mismo objeto de kernel, debe crear el objeto en el espacio de nombres global. Para crear un objeto en el espacio de nombres global, como prefijo el nombre del objeto con "Global\". Objetos globales son accesibles a través de sesiones de Terminal Services.

Nota: De forma predeterminada, las canalizaciones son globales. Por lo tanto, no es necesario el prefijo "Global\" en el nombre de canalización. Para determinar si el prefijo "Global\" es necesario para un objeto, consulte la documentación de Platform SDK para el objeto.

Descripción de los servicios y Terminal Server

Un servicio es una aplicación que puede ejecutarse incluso cuando ningún usuario ha iniciado sesión en el sistema. Normalmente, un servicio se ejecuta bajo una cuenta de usuario especial denominada la cuenta LocalSystem . Aplicaciones que se ejecutan bajo la cuenta LocalSystem tienen privilegios especiales que les dan mucha energía en el equipo local. En circunstancias normales, no desea conceder a un usuario a este tipo de alimentación (se puede utilizar para eludir la seguridad del sistema).

Para aislar además un servicio desde el usuario interactivo, el servicio se ejecuta normalmente en una estación de ventana no interactiva. Esto significa que incluso si el servicio mostrará una interfaz gráfica de usuario, la interfaz no estará visible para el usuario.

Antes de que el servidor de Terminal, si tuviera un servicio mostrar una interfaz gráfica de usuario, el servicio se instaló como un servicio interactivo . De esta forma, el servicio se ejecutaba bajo la cuenta LocalSystem en la estación de ventana interactiva. En un sistema de usuario único, una interfaz gráfica que se muestra por un servicio interactivo aparece en el escritorio del usuario interactivo.

Servidores basados en servicios de Terminal Server utiliza el concepto de una sesiónde usuario. Cuando varios usuarios inician sesión en el servidor basado en servicios de Terminal Server, hay varias sesiones de usuario. Cada sesión está identificada por un identificador de sesión único (comenzando en la sesión 0 y aumenta en uno por cada sesión) y cada sesión recibe su propia estación de ventana interactiva. Cuando un usuario inicia sesión en un servidor basado en servicios de Terminal Server, el usuario se conecta a una sesión existente. En ese momento, el sistema crea una nueva sesión para aceptar la próxima conexión. Si un usuario inicia sesión en el equipo basado en servicios de Terminal Server, se destruye la sesión del usuario (a menos que sea la sesión 0) y el identificador de sesión está disponible para su reutilización.

Un usuario puede iniciar sesión en un servidor de servicios de Terminal Server ya sea de forma local o remota:
  • Para iniciar sesión localmente, el usuario está presente físicamente en el equipo servidor basado en servicios de Terminal Server e inicia sesión en la sesión de consola.
  • Para iniciar sesión de forma remota, el usuario se conecta al servidor de servicios de Terminal Server a través de una red a través de una aplicación de cliente de servicios de Terminal Server.
En Windows NT 4.0 y Windows 2000, la sesión de consola siempre tiene un identificador de la sesión 0 y sesiones remotas siempre tienen un identificador de sesión que es mayor que 0. Sin embargo, en Windows XP, la sesión de consola puede tener cualquier identificador de sesión (incluido un identificador de sesión mayor que 0). Del mismo modo, las sesiones remotas pueden tener cualquier identificador de sesión (incluyendo la sesión 0).

Al diseñar un servicio, tenga en cuenta que todos los servicios que se ejecutan en la sesión 0. Por lo tanto, si un servicio interactivo muestra una interfaz gráfica de usuario, será visible sólo para el usuario que está conectado a la sesión 0.

Nota: Un servicio no puede interactuar directamente con cualquier sesión excepto la sesión 0.

Porque no hay ninguna manera de garantizar que el usuario interactivo está conectado a la sesión 0, Microsoft recomienda que un servicio no configurado como un servicio interactivo en los servidores de servicios de Terminal Server.


Nota: Windows XP introdujo una característica denominada cambio rápido de usuario (FUS). Esta característica es una implementación de servicios de Terminal Server que permite que varios usuarios compartan un único equipo. Cuando está activada la opción FUS, el usuario no tiene que cierre la sesión antes de que otro usuario dinámicamente inicia una nueva sesión de usuario (o cambia a una sesión de usuario existente) en el mismo equipo. Esto crea el dilema donde no hay ninguna forma de saber si el usuario interactivo actual está conectado a la sesión 0. Por lo tanto, Microsoft recomienda no configurar un servicio que está diseñado para Windows XP como un servicio interactivo.
Propiedades

Id. de artículo: 308403 - Última revisión: 22 ene. 2017 - Revisión: 1

Comentarios