2008-10-01 11 views
22

¿Hay alguna manera en que mi programa pueda determinar cuándo se está ejecutando en un Escritorio remoto (Servicios de Terminal Server)?Determine si un programa se está ejecutando en un escritorio remoto

Me gustaría habilitar un "tiempo de inactividad" en el programa cuando se ejecuta en una sesión de Escritorio remoto. Como los usuarios son conocidos por dejar abiertas las sesiones de Escritorio remoto, deseo que mi programa finalice después de un período de inactividad específico. Pero no quiero que el tiempo de inactividad esté habilitado para usuarios que no sean RD.

Respuesta

10

Aquí está el código C# administrado yo uso:

/// <summary> 
/// Indicates if we're running in a remote desktop session. 
/// If we are, then you MUST disable animations and double buffering i.e. Pay your taxes! 
/// 
/// </summary> 
/// <returns></returns> 
public static Boolean IsRemoteSession 
{ 
    //This is just a friendly wrapper around the built-in way 
    get 
    { 
     return System.Windows.Forms.SystemInformation.TerminalServerSession; 
    } 
} 
5

Los siguientes trabajos si desea saber sobre su aplicación que se está ejecutando en la sesión :

BOOL IsRemoteSession(void) 
{ 
    return GetSystemMetrics(SM_REMOTESESSION); 
} 

Pero no en general para ningún ID de proceso.


Si usted quiere saber acerca de cualquier proceso arbitrario que podría estar ejecutándose en cualquier sesión arbitraria, puede utilizar el método siguiente.

Primero puede convertir la ID del proceso en una ID de sesión llamando al ProcessIdToSessionId. Una vez que tenga el ID de sesión, puede usarlo para llamar al: WTSQuerySessionInformation. Puede especificar WTSInfoClass como valor WTSIsRemoteSession y esto le dará la información sobre si esa aplicación es una conexión de escritorio remoto o no.

BOOL IsRemoteSession(DWORD sessionID) 
{ 
    //In case WTSIsRemoteSession is not defined for you it is value 29 
    return WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, sessionID, WTSIsRemoteSession, NULL, NULL); 
} 
+0

¿Cuáles son las situaciones que pueden provocar que un proceso esté en una sesión diferente? ¿Esto es si estoy preguntando sobre los servicios, o el procesamiento que se ejecuta bajo otros usuarios conectados? –

+0

Cuando hace un nuevo inicio de sesión, ya sea desde la máquina local o mediante RDP sin el modificador/console, se crea una nueva sesión. Cuando se crea una nueva sesión, cualquier proceso creado se iniciará en esa sesión de manera predeterminada. También puede orientar sesiones cuando crea un proceso a través de Win32 API CreateProcessAsUser. –

Cuestiones relacionadas