2009-06-10 154 views
46

无论如何,在程序中,检测程序是否从远程桌面会话内运行,或者程序是否在.NET 2.0中运行正常?我想要做的是,我创建了一个时钟应用程序,它可以记录一个人的进出时间并跟踪记录。但我怀疑,这个特定的人正在远程工作,离开家,进出计算机。检测远程桌面连接

任何想法如何解决这个问题(并带走远程桌面访问不是一种选择)?我的想法是,如果有办法检测远程桌面会话,我将简单地将其实施到程序中,并防止它们远程计时。

+1

哈哈,这是一个有趣的问题:) – willem 2009-06-10 05:32:53

+3

这里的一个问题将是不同的远程工具的范围 - MSTSC和VNC会大竞争者,但PCAnywhere,Live Mesh,GoToMyPC等等,更不用说Live Meeting和Adobe Connect Pro等可以同时进行桌面远程处理的东西。要做得更好,这可能非常困难。 – 2009-06-10 07:35:27

回答

9

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

系统变量%SESSIONNAME%将返回控制台如果本地或RDP *如果遥控器。

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

如果您使用RDP /控制台开关(或/管理,根据不同的型号),则返回“控制台”(我刚刚检查;-p) – 2009-06-10 07:29:33

+0

System.Environment..GetEnvironmentVariable(“SESSIONNAME”)。StartsWith ( “RDP-”);为我工作。 – RaoulRubin 2012-04-13 13:31:25

+0

它在RDP上为我返回控制台。 – 2013-07-30 11:45:24

45

据称,

System.Windows.Forms.SystemInformation.TerminalServerSession 

将是一个远程桌面会话真(或VNC会话)

,但我会测试它,以确保;-)

2

如果你关心的是VNC,看起来可以用netstat来检查开放的TCP连接。在命令提示,输入:

netstat -n -a -p tcp 

,并检查,以查看是否该端口5900被“已建立”。当然,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, ...) 
} 
14

如果你不想添加一个引用System.Windows.Forms.dll中只为这(如上面所建议的),则还可以直接通过的PInvoke调用基础系统调用,例如:

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

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

我测试了这个与RDP和VNC - 与前者(管理员/控制台模式也),没有检测到后者。

3

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

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

4

好吧,前几天我有类似的问题。我所做的,解决它了的事实,即一些远程桌面应用使用已知默认端口,至少VNC和/或微软远程桌面连接。因此,我创建如果正在使用的端口,它告诉的方法,具体如下:

/* 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一起完成。

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

我希望它能提供帮助。

7

对于Windows应用商店的应用程序,你可以使用这个:

Windows.System.RemoteDesktop.InteractiveSession.IsRemote