检测远程桌面连接

时间:2009-06-10 05:29:26

标签: c# .net vb.net

无论如何,在程序中,是否检测程序是否正在远程桌面会话内运行,或者程序是否在.NET 2.0中正常运行?我正在尝试做的是,我创建了一个时钟应用程序,它将为一个人输入和输出并跟踪。但是,我怀疑,这个特殊的人正在工作,家里和时钟进出他们的计算机。

任何想法如何解决此问题(并取消远程桌面访问不是一种选择)?我的想法是,如果有办法检测远程桌面会话,我只需将其实现到程序中,并防止它们远程计时。

9 个答案:

答案 0 :(得分:47)

据称

System.Windows.Forms.SystemInformation.TerminalServerSession

对于远程桌面会话(或VNC会话)

将成立

但我会测试它以确定; - )

答案 1 :(得分:15)

如果您不想为此添加对System.Windows.Forms.dll的引用(如上所述),那么您也可以直接通过PInvoke调用底层系统调用,如下所示:

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

可以在PInvoke.net - SystemMetric找到SystemMetric枚举(但您可以使用0x1000的值);而GetSystemMetrics的签名位于PInvoke.net - GetSystemMetrics

我用RDP和VNC进行了测试 - 与前者(管理员/控制台模式)一起使用,但没有检测到后者。

答案 2 :(得分:8)

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

系统变量%sessionname%将返回Console(如果是本地或RDP *,如果是远程。

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

答案 3 :(得分:8)

对于Windows应用商店应用,您可以使用:

Windows.System.RemoteDesktop.InteractiveSession.IsRemote

答案 4 :(得分:3)

所有远程登录程序都需要在本地计算机上运行的服务或程序。如果允许这些服务或程序在本地计算机上运行,​​提问者只需要担心VNC及其克隆。它们不是远程桌面使用所必需的,并且所有操作系统都有远程桌面客户端。如果远程桌面正在运行,则不需要VNC服务器。

此外,除非您在服务器计算机上以管理员身份安装VNC克隆,否则VNC克隆无法为您登录。只要您不让用户像其他用户一样运行流程,唯一的问题就是您的其他员工之一是否以有问题的方式登录。如果是这样的话,那么技术解决方案就不够了。即使您为每位员工准备了必须用于登录的个人卡片,但有问题的员工也可以向他的朋友提供卡片。

答案 5 :(得分:3)

好吧,我几天前也遇到过类似的问题。我所做的解决方法是利用了一些远程桌面应用程序使用已知的默认端口,至少 VNC 和/或 Microsoft远程桌面连接。所以我创建了一个方法来告诉端口是否正在使用,如下所示:

/* 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
                       );
}

请记住将带有库的using语句放在方法所在文件的开头。

您只需传递一个参数,例如 3389端口,这是远程桌面连接的默认端口,或 5900端口这是 VNC连接的默认端口。

该方法是使用 C#4.0 功能创建的,但它可以完美地使用 C#.Net或Visual Basic的旧版本。

这对我有用,因为我只需要检查我之前提到的两个应用程序。

我希望它可以提供帮助。

答案 6 :(得分:2)

如果您担心VNC,看起来可以检查与netstat打开的TCP连接。在命令提示符下,键入:

netstat -n -a -p tcp

并检查端口5900是否为“ESTABLISHED”。当然,5900是默认的连接端口,因此它取决于设置的端口。

从那里,我发现this post at CodeGuru解释了如何在c#程序中使用netstat

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, ...)
}

答案 7 :(得分:1)

对于WPF应用程序there is System.Windows.SystemParameters.IsRemoteSession and System.Windows.SystemParameters.IsRemotelyControlled

答案 8 :(得分:0)

仅需说明一下,如果会话正在使用GPU的RemoteFX虚拟化,则单独使用GetSystemMetrics(SystemMetric.SM_REMOTESESSION)对于Windows 8 / Server 2012或更高版本将不再可靠。

Microsoft在此处描述检测RDS的“官方”方法:Detecting the Remote Desktop Services environment(最新更新时间为18年5月31日)。

它包括使用SystemMetrics调用位于

的注册表检查
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId

该文章中的代码示例仅是C ++,但是鉴于它只是注册表查找,我认为人们不会觉得很难用其他语言进行复制。

我希望至少有一些.net内置函数在upthread中提到,可以完全遵循此要求,但是:

  • SystemParameters.IsRemoteSession是noted here,如“映射到SM_REMOTESESSION。请参阅GetSystemMetrics”和

  • SystemParameters.IsRemotelyControlled与noted here相同,

所以我并不乐观。

我将尽快进行一些详细的检查并发布结果。