c# .net vb.net

c# - Detectando la conexión de escritorio remota



.net vb.net (7)

¿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.

¿Alguna idea de cómo puedo resolver este problema (y eliminar el acceso remoto al escritorio 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.


Bueno, tuve un problema similar hace unos días. Lo que hice para resolverlo fue aprovechar el hecho de que algunas aplicaciones de escritorio remoto usan un puerto predeterminado conocido, al menos VNC y / o conexión a escritorio remoto de Microsoft . Así que creé un método que indica si el puerto se está utilizando, 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 ); }

Recuerde colocar las instrucciones de uso con las bibliotecas al principio del archivo donde está el método.

Solo tiene que pasar, por ejemplo, un parámetro como el puerto 3389, que es el puerto predeterminado para Conexión a Escritorio remoto , o el puerto 5900, que es el puerto predeterminado para las conexiones VNC .

El método se creó con las características de C # 4.0 , 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.


Para las aplicaciones de la Tienda Windows, puede usar esto:

Windows.System.RemoteDesktop.InteractiveSession.IsRemote


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 verifique 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é esta publicación en CodeGuru que explica cómo usar netstat en su programa 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, ...) }


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

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

La enumeración SystemMetric se puede encontrar en PInvoke.net - SystemMetric (pero puede usar 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 el último.


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 clones 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.


pretendidamente,

System.Windows.Forms.SystemInformation.TerminalServerSession

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

pero lo probaría para estar seguro ;-)