2009-06-10 44 views
46

¿Hay alguna forma, en un programa, para detectar si un programa se está ejecutando desde una sesión de escritorio remoto o si el programa se ejecuta normalmente en .NET 2.0? Lo que estoy tratando de hacer es crear una aplicación de reloj de tiempo que muestre la entrada y salida de una persona y realice un seguimiento. Pero esta persona en particular, sospecho, está remotamente en su computadora en el trabajo, desde su casa, y entrando y saliendo.Detección de conexión de escritorio remoto

¿Alguna idea de cómo puedo solucionar este problema (y quitarle el acceso al escritorio remoto no es una opción)? Mi idea es que, si hay una manera de detectar sesiones remotas de escritorio, simplemente implementaré esto en el programa y evitaré que se registren remotamente.

+1

Ja, ja, eso es un problema interesante :) – willem

+3

Un problema en este caso será la gama de diferentes herramientas remotas - MSTSC y VNC serán grandes contendientes, pero ¿qué pasa con PCAnywhere, Live Mesh, GoToMyPC, etc., por no mencionar cosas como Live Meeting y Adobe Connect Pro, que pueden hacer tanto escritorio remoto. Para hacerlo de manera robusta, esto podría ser muy difícil. –

Respuesta

9

http://www.appdeploy.com/messageboards/tm.asp?m=21420&mpage=1&key=&#21420

El sistema variable% sessionname% volverá consola si es local o RDP * Si su control remoto.

isRDP = [System.Environment] 
    .GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-") 
+6

Si RDP con el modificador/console (o/admin, según la versión), devuelve "Console" (Acabo de marcar ;-p) –

+0

System.Environment..GetEnvironmentVariable ("SESSIONNAME"). StartsWith ("RDP-"); Trabajó para mi. – RaoulRubin

+0

Su consola de devoluciones en RDP para mí. –

45

supuestamente,

System.Windows.Forms.SystemInformation.TerminalServerSession 

será cierto para una sesión de escritorio remoto (o sesión de VNC)

pero me gustaría probar que sea seguro ;-)

+6

Dudo mucho que esto retome las sesiones de VNC. Probablemente detectará RDP. –

+1

He comprobado, y (a diferencia de% sessionname% - other answer) esto funciona bien incluso con el modificador/console o/admin. Esta parece ser la mejor respuesta para MSTSC. –

+0

Los buenos servidores VNC se conectan al controlador de gráficos para mejorar el rendimiento. Es posible detectar eso. –

2

Si le preocupa VNC, parece que sería posible comprobar las conexiones TCP abiertas con netstat. En un símbolo del sistema, escriba:

netstat -n -a -p tcp 

y compruebe si el puerto 5900 está "ESTABLECIDO". Por supuesto, 5900 es el puerto de conexión predeterminado, por lo que dependería de qué puerto esté configurado.

A partir de ahí, encontré this post at CodeGuru que explica cómo utilizar netstat en su programa de C#:

string sCommand = "netstat"; 
string sArgs = ""; 
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo (sCommand, sArgs); 

psi.UseShellExecute = false; 
psi.RedirectStandartOutput = true; 

System.Diagnostics.Process proc = null; 
proc = System.Diagnostics.Process.Start(psi); 
proc.WaitForExit(); 

// Read the first 4 lines. They don't contain any information we need to get 
for (int i = 0; i < 4; i++) 
    proc.StandardOutput.ReadLine(); 

while (true) 
{ 
    string strLine = proc.StandardOutput.ReadLine(); 
    if (strLine == null) 
     break; 

    // Analyze the line 
    // Line is in following structure: 
    // Protocol (TCP/UDP) Local Address(host:port) Foreign Address(host:port) State(ESTABLISHED, ...) 
} 
+0

Una pequeña nota: parece que el fragmento de código publicado en CodeGuru tiene un pequeño error ortográfico, en el que 'StandardOutput' está mal escrito como' StandartOutput' –

14

Si no desea agregar una referencia a System.Windows.Forms.dll sólo para esto (como se sugirió anteriormente), entonces también puede llamar a la llamada al sistema subyacente directamente a través de PInvoke, así:

int result = GetSystemMetrics(SystemMetric.SM_REMOTESESSION); 
    bool isRemoteSession = (result != 0); 

la enumeración SystemMetric se puede encontrar en PInvoke.net - SystemMetric (pero sólo se puede utilizar el valor de 0x1000); mientras que la firma para GetSystemMetrics en PInvoke.net - GetSystemMetrics.

Probé esto con RDP y VNC - funciona con el primero (modo admin/console también), no detecta este último.

3

Todos los programas de inicio de sesión remoto requieren un servicio o programa ejecutándose en la máquina local. El que pregunta solo necesita preocuparse por VNC y sus clones si esos servicios o programas pueden ejecutarse en su máquina local. No son necesarios para el uso de Escritorio remoto, y hay clientes de Escritorio remoto para todos los sistemas operativos. Un servidor VNC es innecesario si Remote Desktop está funcionando.

Además, los clics de VNC no pueden iniciar sesión a menos que los instale como administrador en la máquina del servidor. Siempre que no permita que los usuarios ejecuten procesos como otros usuarios, la única preocupación es si uno de sus otros empleados inicia sesión como el más problemático. Y si ese es el caso, ninguna solución técnica será suficiente. Incluso si tiene tarjetas individuales para cada empleado que se deben utilizar para iniciar sesión, el empleado problemático podría simplemente darle a su amigo la tarjeta.

4

Bueno, tuve un problema similar hace unos días. Lo que hice para resolver era aprovechó el hecho de que algunos de aplicaciones de escritorio remoto utilizar un conocido puerto predeterminado, al menos VNC y/o Microsoft Remote Desktop Conexión. Así que creé un método que indica si se está utilizando el puerto, de la siguiente manera:

/* Libraries needed */ 
using System.Linq; 
using System.Net.NetworkInformation; 

/*.... 
    .... 
    ....*/ 

private static bool IsPortBeingUsed(int port) 
{ 
    return IPGlobalProperties.GetIPGlobalProperties(). 
       GetActiveTcpConnections(). 
        Any(
          tcpConnectionInformation => 
          tcpConnectionInformation.LocalEndPoint.Port == port 
         ); 
} 

recuerda poner las instrucciones using con las bibliotecas en el principio del archivo en el que el método es.

Sólo hay que pasar, por ejemplo, un parámetro como el puerto3389 que es el puerto por defecto para Conexión a Escritorio remoto, o el puerto5900 que es el puerto por defecto para conexiones VNC .

El método se creó con C# 4.0 características pero se puede hacer perfectamente con una versión anterior de C# .Net o Visual Basic.

Esto funcionó para mí ya que solo necesitaba verificar las dos aplicaciones que mencioné antes.

Espero que pueda ayudar.

7

Para aplicaciones de Windows Store, puede utilizar esto:

Windows.System.RemoteDesktop.InteractiveSession.IsRemote 
+0

Funciona también con aplicaciones de la Plataforma universal de Windows (UWP). ¡Gracias! –

Cuestiones relacionadas