[英]Detecting remote desktop connection
无论如何,在程序中,是否检测程序是否正在远程桌面会话内运行,或者程序是否在.NET 2.0中正常运行? 我正在尝试做的是,我创建了一个时钟应用程序,它将为一个人输入和输出并跟踪。 但是,我怀疑,这个特殊的人正在工作,家里和时钟进出他们的计算机。
任何想法如何解决这个问题(并取消远程桌面访问不是一个选项)? 我的想法是,如果有办法检测远程桌面会话,我将简单地将其实现到程序中并防止它们远程计时。
据称,
System.Windows.Forms.SystemInformation.TerminalServerSession
对于远程桌面会话(或VNC会话)将是如此
但我会测试它确定;-)
如果你不想为此添加对System.Windows.Forms.dll的引用(如上所述),那么你也可以通过PInvoke直接调用底层系统调用,如下所示:
int result = GetSystemMetrics(SystemMetric.SM_REMOTESESSION);
bool isRemoteSession = (result != 0);
可以在PInvoke.net - SystemMetric中找到SystemMetric枚举(但您可以使用0x1000的值); 而PInvoke.net上的GetSystemMetrics签名- GetSystemMetrics 。
我使用RDP和VNC进行了测试 - 与前者(管理员/控制台模式)一起使用,但未检测到后者。
对于Windows应用商店应用,您可以使用:
Windows.System.RemoteDesktop.InteractiveSession.IsRemote
http://www.appdeploy.com/messageboards/tm.asp?m=21420&mpage=1&key=厬
系统变量%sessionname%将返回Console(如果是本地)或RDP *(如果是远程)。
isRDP = [System.Environment]
.GetEnvironmentVariable("SESSIONNAME").StartsWith("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#.Net或Visual Basic。
这对我有用,因为我只需要检查我之前提到的两个应用程序。
我希望它可以提供帮助。
如果你担心VNC,看起来可以用netstat
检查打开的TCP连接。 在命令提示符下,键入:
netstat -n -a -p tcp
并检查端口5900是否“已建立”。 当然,5900是默认的连接端口,因此它取决于设置的端口。
从那里,我在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, ...)
}
请注意,如果会话使用GPU的RemoteFX虚拟化,那么使用GetSystemMetrics(SystemMetric.SM_REMOTESESSION)本身已经不再适用于Windows 8 / Server 2012。
Microsoft在此描述了检测RDS的“官方”方法: 检测远程桌面服务环境 (最后更新时间为5月31日)。
它包括使用SystemMetrics调用和注册表检查
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId
该文章中的代码示例仅为C ++,但考虑到它只是一个注册表查找,我认为人们不会发现它在其他语言中复制过于苛刻。
我希望至少有一些.Net内置函数提到的upthread完全遵循这个,但是:
SystemParameters.IsRemoteSession 在此处标注为“映射到SM_REMOTESESSION。请参阅GetSystemMetrics”,以及
SystemParameters.IsRemotelyControlled 在这里注明为相同,
所以我不乐观。
我会尽快做一些详细的检查并发布结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.