检测远程桌面连接
无论如何,在一个程序中,检测程序是从远程桌面会话中运行,还是程序在.NET 2.0中运行正常? 我想要做的是,我创build一个时钟应用程序,它会logging一个人的进出时间并跟踪。 但是我怀疑,这个特殊的人正在远程工作,在家里工作,进出计算机。
任何想法如何解决这个问题(并带走远程桌面访问不是一个选项)? 我的想法是,如果有办法检测远程桌面会话,我将简单地将其实施到程序中,并防止它们远程计时。
据称,
System.Windows.Forms.SystemInformation.TerminalServerSession
对于远程桌面会话(或VNC会话)
但我会testing它是肯定的;-)
如果您不想为此添加对System.Windows.Forms.dll的引用(如上所示),则还可以通过PInvoke直接调用基础系统调用,如下所示:
int result = GetSystemMetrics(SystemMetric.SM_REMOTESESSION); bool isRemoteSession = (result != 0);
SystemMetric枚举可以在PInvoke.net – SystemMetric中find(但您可以使用值0x1000); 而在PInvoke.net GetSystemMetrics的签名- GetSystemMetrics 。
我用RDP和VNCtesting了这个版本 – 与前者(pipe理员/控制台模式)一起工作,没有检测到后者。
http://www.appdeploy.com/messageboards/tm.asp?m=21420&mpage=1&key=厬
系统variables%sessionname%将返回控制台,如果它的本地或RDP *,如果它的远程。
isRDP = [System.Environment] .GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")
对于Windowsapp store应用,您可以使用这个:
Windows.System.RemoteDesktop.InteractiveSession.IsRemote
好吧,前几天我也有类似的问题。 我所做的解决这个问题的方式是利用了一些远程桌面应用程序使用已知的默认端口 ,至less是VNC和/或Microsoft远程桌面连接 。 所以我创build了一个方法来告诉端口是否被使用,如下所示:
/* 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 ); }
请记住将使用语句与库放在方法所在文件的开头。
您只需传递一个参数,例如远程桌面连接的默认端口3389端口或VNC连接的默认端口5900端口 。
这个方法是用C#4.0特性创build的,但是它可以完美地用C#.Net或Visual Basic的旧版本完成。
这工作对我来说,因为我只需要检查我前面提到的两个应用程序。
我希望它可以帮助。
所有远程login程序都需要在本地机器上运行的服务或程序。 如果这些服务或程序被允许在本地机器上运行,提问者只需要担心VNC及其克隆。 它们不是远程桌面使用所必需的,所有操作系统都有远程桌面客户端。 如果远程桌面正在工作,则不需要VNC服务器。
此外,VNC克隆除非以服务器计算机上的pipe理员身份安装,否则无法login。 只要不让用户像其他用户那样运行进程,唯一的问题就是如果其他员工之一login为有问题的进程。 如果是这样的话,没有技术解决scheme就足够了。 即使您为每位必须用于login的员工准备了单独的卡片,问题员工也可以给他的朋友发送卡片。
如果你关心VNC,看起来好像有可能用netstat
检查打开的TCP连接。 在命令提示符下键入:
netstat -n -a -p tcp
并检查端口5900是否“ESTABLISHED”。 当然,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, ...) }