C# 检测远程桌面连接

C# 检测远程桌面连接,c#,.net,vb.net,C#,.net,Vb.net,在程序中,是否存在检测程序是否从远程桌面会话内部运行,或程序是否在.NET 2.0中正常运行的方法?我正在尝试做的是,我创建了一个时钟应用程序,它可以为一个人的出入打卡并跟踪。但我怀疑,这个特殊的人在工作时、在家里、打卡时都会远程进入他们的电脑 有什么办法可以解决这个问题吗(取消远程桌面访问不是一个选项)?我的想法是,如果有一种方法可以检测远程桌面会话,我只需将其实现到程序中,并防止它们远程打卡。 如果系统变量%sessionname%是本地变量,则返回Console;如果是远程变量,则返回RD

在程序中,是否存在检测程序是否从远程桌面会话内部运行,或程序是否在.NET 2.0中正常运行的方法?我正在尝试做的是,我创建了一个时钟应用程序,它可以为一个人的出入打卡并跟踪。但我怀疑,这个特殊的人在工作时、在家里、打卡时都会远程进入他们的电脑

有什么办法可以解决这个问题吗(取消远程桌面访问不是一个选项)?我的想法是,如果有一种方法可以检测远程桌面会话,我只需将其实现到程序中,并防止它们远程打卡。

如果系统变量%sessionname%是本地变量,则返回Console;如果是远程变量,则返回RDP*

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

System.Windows.Forms.SystemInformation.TerminalServerSession
对于远程桌面会话(或VNC会话)将为true


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

如果您关心VNC,那么可以使用
netstat
检查打开的TCP连接。在命令提示下,键入:

netstat -n -a -p tcp
并检查端口5900是否“已建立”。当然,5900是默认连接端口,因此它将取决于设置的端口

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

string sCommand=“netstat”;
字符串sArgs=“”;
System.Diagnostics.ProcessStartInfo psi=新的System.Diagnostics.ProcessStartInfo(sCommand,sArgs);
psi.UseShellExecute=false;
psi.0输出=真;
System.Diagnostics.Process proc=null;
proc=系统诊断过程启动(psi);
进程WaitForExit();
//阅读前4行。它们不包含我们需要获取的任何信息
对于(int i=0;i<4;i++)
proc.StandardOutput.ReadLine();
while(true)
{
字符串strLine=proc.StandardOutput.ReadLine();
if(strLine==null)
打破
//分析线路
//该行采用以下结构:
//协议(TCP/UDP)本地地址(主机:端口)外部地址(主机:端口)状态(已建立…)
}

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

    int result = GetSystemMetrics(SystemMetric.SM_REMOTESESSION);
    bool isRemoteSession = (result != 0);
SystemMetric枚举可以在中找到(但您可以只使用0x1000的值);而GetSystemMetrics的签名位于


我使用RDP和VNC对此进行了测试-也使用前者(管理/控制台模式),没有检测到后者。

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


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

好吧,几天前我也遇到了类似的问题。我所做的解决方法是利用以下事实:一些远程桌面应用程序使用已知的默认端口,至少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#4.0或Visual Basic的较旧版本来完成。

这对我来说很有效,因为我只需要检查我前面提到的两个应用程序


我希望它能有所帮助。

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

Windows.System.RemoteDesktop.InteractiveSession.IsRemote
适用于WPF应用程序
System.Windows.SystemParameters.IsRemoteSession
System.Windows.SystemParameters.IsRemotelyControlled
只需注意使用GetSystemMetrics(SystemMetric.SM\u REMOTESESSION)如果会话使用的是GPU的RemoteFX虚拟化,则其本身就不再可靠,适用于Windows 8/Server 2012及以后的版本

微软在这里描述了检测RDS的“官方”方法:(最后更新日期为5月18日31日)

它包括在以下位置使用SystemMetrics调用和注册表检查

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId

该文章中的代码示例仅为C++,但考虑到它只是注册表查找,我认为人们不会发现用其他语言复制太难了。 我希望upthread中提到的.Net内置函数中至少有一些完全遵循了这一点,但是:

  • SystemParameters.IsRemoteSession为“映射到SM_REMOTESESSION。请参阅GetSystemMetrics”,并且

  • SystemParameters.IsremotelyControl与此相同

所以我并不乐观


我很快会尝试做一些详细的检查并发布结果。

Ha,这是一个有趣的问题:)这里的一个问题是不同的远程工具的范围-MSTSC和VNC将是大竞争者,但是PCAnywhere、Live Mesh、GoToMyPC等呢,更不用说Live Meeting和Adobe Connect Pro之类的东西,两者都可以进行桌面远程处理。要想有力地做到这一点,这可能会非常困难。很抱歉问。。。我知道
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId