Cuentas de usuario con cambio rápido de usuario y Escritorio remoto

Las cuentas de usuario de Windows XP permiten que varios usuarios inicien sesión simultáneamente, cada uno con su propia configuración y cada una con sus propias aplicaciones. Dado que un usuario no tiene que cerrar sesión para permitir el acceso a otro usuario, se puede acceder fácilmente al escritorio de cada usuario mediante la característica de cambio rápido de usuario. Las cuentas de usuario también incluyen la característica Personal Terminal Server o Escritorio remoto, que permite a los usuarios acceder a su cuenta de escritorio desde sistemas remotos.

Se abordan los siguientes temas.

Requisitos de uso de la infraestructura

La infraestructura subyacente heredada de Windows 2000 admite la separación de estado de los datos de usuario, la configuración de usuario y la configuración del equipo. Al aprovechar esta infraestructura, se requiere lo siguiente para ejecutar correctamente la aplicación en Windows XP.

  • El valor predeterminado es la carpeta Mis documentos para el almacenamiento de datos creados por el usuario.
  • Clasifique y almacene correctamente los datos de la aplicación.
  • Degrade correctamente los mensajes de "Acceso denegado".

Los archivos temporales, los archivos asignados a memoria y los documentos deben almacenarse en el subdirectorio adecuado del directorio de perfiles del usuario. Use SHGetFolderLocation o SHGetFolderPath para determinar la ubicación de almacenamiento adecuada para estos archivos. Al pasar la marca CSIDL_APPDATA a estas funciones, se devuelve la ruta de acceso de un directorio del sistema de archivos que actúa como repositorio común para datos específicos de la aplicación. Use la marca CSIDL_LOCAL_APPDATA en lugar de CSIDL_APPDATA para los datos que deben cambiar cuando cambie el usuario, como los archivos temporales.

Los requisitos enumerados anteriormente son un subconjunto de los del programa de certificación de Microsoft. Para obtener más información, consulte la página Requisitos de certificación para aplicaciones de escritorio de Windows.

Compatibilidad con aplicaciones existentes

Tanto el cambio de usuario rápido como Personal Terminal Server usan la tecnología Terminal Services y, por tanto, son compatibles con la mayoría de las aplicaciones anteriores de Microsoft Win32. Si una aplicación es compatible con el logotipo de Windows 2000, implementando características básicas de separación de perfiles y administración de energía, esa aplicación debe ejecutarse correctamente en cuentas de usuario individuales de Windows XP.

Registro para la notificación de cambio de sesión

Normalmente, una aplicación no necesita recibir una notificación cuando se produce un cambio de escritorio. Sin embargo, las aplicaciones que se deben notificar cuando la cuenta con la que se ejecutan es el escritorio actual, como las aplicaciones que acceden al puerto serie u otros recursos compartidos, pueden registrarse para la notificación del cambio de escritorio. Para registrarse para obtener una notificación, use la función WTSRegisterSessionNotification.

Una vez que se ha llamado a esa función, la ventana con el identificador hWnd se registra para recibir un mensaje WM_WTSSESSION_CHANGE a través de su función WndProc. El identificador de sesión se envía en el parámetro lParam y un código que indica el evento que generó el mensaje se envía en wParam como una de las siguientes marcas.

  • WTS_CONSOLE_CONNECT
  • WTS_CONSOLE_DISCONNECT
  • WTS_REMOTE_CONNECT
  • WTS_REMOTE_DISCONNECT
  • WTS_SESSION_LOGOFF
  • WTS_SESSION_LOGON

Las aplicaciones pueden usar este mensaje para realizar un seguimiento de su estado, así como para liberar y adquirir recursos específicos de la consola. Los escritorios de usuario se pueden cambiar dinámicamente entre el control remoto y la consola. Las aplicaciones deben usar el mensaje WM_WTSSESSION_CHANGE para sincronizarse con el estado de conexión remota o local.

Cuando el proceso ya no requiera estas notificaciones o termine, debe llamar a WTSUnRegisterSessionNotification para anular el registro de su notificación.

Importante

Se cuentan los valores hWnd pasados a WTSRegisterSessionNotification, por lo que debe realizar una cantidad igual de llamadas a WTSUnRegisterSessionNotification para garantizar la liberación de todos los recursos asignados.

 

Asegurarse de que solo se está ejecutando una instancia de la aplicación

Muchas aplicaciones deben asegurarse de que solo tienen una instancia en ejecución. Hay varias maneras de hacerlo en Windows XP. Entre ellas se encuentran las siguientes:

  • Use FindWindow o FindWindowEx para buscar una ventana conocida que abra la aplicación. Si esa ventana ya está abierta, puede usarla como indicación de que la aplicación ya se está ejecutando.
  • Cree un objeto de exclusión mutua o semáforo cuando se abra la aplicación y cierre ese objeto cuando finalice. El espacio de nombres de objeto global se separa para cada escritorio, lo que permite una lista única de objetos de exclusión mutua y semáforo para cada uno.

Apagado de la aplicación en todas las sesiones

Es posible que una aplicación tenga que apagarse en todas las sesiones. Por ejemplo, una aplicación que se ejecuta en dos o más sesiones simultáneamente podría descargar un nuevo archivo desde la web. A continuación, es posible que tenga que cerrarse y reiniciarse con los bits actualizados. Esto, por supuesto, tendría que realizarse en todas las sesiones en ejecución. La aplicación debe escribirse para que salga limpiamente cuando se reciba una notificación.

Interacción con los servicios del sistema

Desde el punto de vista de la programación, es necesario abordar los siguientes casos.

  • El proceso de servidor recibe una solicitud directa de un proceso de cliente.

    En este caso, es probable que el mensaje se transmita mediante una llamada a procedimiento local (LPC) o una llamada a procedimiento remoto (RPC). Hay API para LPC o RPC que permiten la recuperación del token de cliente. Una vez obtenido el token de cliente, el servidor puede usarlo en una llamada a CreateProcessAsUser. Esto abre el proceso en la estación de ventana correcta, suponiendo que el token de usuario cliente tenga una etiqueta de sesión, que debería.

    Nota:

    CreateProcessAsUser no admite el control de herencia entre sesiones en este momento.

     

  • El proceso del servidor recibe una notificación y necesita mostrar la interfaz de usuario, pero la pantalla no tiene que estar en el contexto del usuario actual.

    En este caso, el proceso del servidor puede duplicar su token de proceso principal y cambiar el identificador de sesión en cuestión para que coincida con el identificador de sesión actual. El identificador de sesión actual se puede obtener mediante la función WTSGetActiveConsoleSessionId.

    Nota:

    Para establecer el identificador de sesión del token, necesita el SE_TCB_PRIVILEGE. Solo lo tendrá como servicio que se ejecuta en NT AUTHORITY\SYSTEM.

     

Escritorio remoto y ancho de banda

Con la adición de la característica escritorio remoto a Windows XP, las aplicaciones deben hacer un esfuerzo por no usar más ancho de banda de lo necesario, evitando amplios dibujos de pantalla y efectos de animación si el escritorio está conectado de forma remota. Para determinar si la sesión actual es remota, puede llamar a GetSystemMetrics con SM_REMOTESESSION. Sin embargo, tenga en cuenta que esta llamada no distingue entre remoto y desconectado.