无论如何,在程序中,检测程序是否从远程桌面会话内运行,或者程序是否在.NET 2.0中运行正常?我想要做的是,我创建了一个时钟应用程序,它可以记录一个人的进出时间并跟踪记录。但我怀疑,这个特定的人正在远程工作,离开家,进出计算机。检测远程桌面连接
任何想法如何解决这个问题(并带走远程桌面访问不是一种选择)?我的想法是,如果有办法检测远程桌面会话,我将简单地将其实施到程序中,并防止它们远程计时。
无论如何,在程序中,检测程序是否从远程桌面会话内运行,或者程序是否在.NET 2.0中运行正常?我想要做的是,我创建了一个时钟应用程序,它可以记录一个人的进出时间并跟踪记录。但我怀疑,这个特定的人正在远程工作,离开家,进出计算机。检测远程桌面连接
任何想法如何解决这个问题(并带走远程桌面访问不是一种选择)?我的想法是,如果有办法检测远程桌面会话,我将简单地将其实施到程序中,并防止它们远程计时。
http://www.appdeploy.com/messageboards/tm.asp?m=21420&mpage=1&key=厬
系统变量%SESSIONNAME%将返回控制台如果本地或RDP *如果遥控器。
isRDP = [System.Environment]
.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")
如果您使用RDP /控制台开关(或/管理,根据不同的型号),则返回“控制台”(我刚刚检查;-p) – 2009-06-10 07:29:33
System.Environment..GetEnvironmentVariable(“SESSIONNAME”)。StartsWith ( “RDP-”);为我工作。 – RaoulRubin 2012-04-13 13:31:25
它在RDP上为我返回控制台。 – 2013-07-30 11:45:24
据称,
System.Windows.Forms.SystemInformation.TerminalServerSession
将是一个远程桌面会话真(或VNC会话)
,但我会测试它,以确保;-)
如果你关心的是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, ...)
}
如果你不想添加一个引用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 - 与前者(管理员/控制台模式也),没有检测到后者。
所有远程登录程序都需要在本地机器上运行的服务或程序。如果这些服务或程序被允许在他的本地机器上运行,提问者只需要担心VNC及其克隆。它们不是远程桌面使用所必需的,并且所有操作系统都有远程桌面客户端。如果远程桌面正在运行,则不需要VNC服务器。
此外,除非您以服务器计算机上的管理员身份安装VNC克隆,否则VNC克隆无法为您登录。只要您不让用户像其他用户一样运行流程,唯一的问题是您的其他员工之一是否以有问题的身份登录。如果是这样的话,没有技术解决方案就足够了。即使您为每位必须用于登录的员工制作了个人卡片,有问题的员工也可以给他的朋友发送卡片。
好吧,前几天我有类似的问题。我所做的,解决它了的事实,即一些远程桌面应用使用已知默认端口,至少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一起完成。
这对我有效,因为我只需要检查我之前提到的两个应用程序。
我希望它能提供帮助。
对于Windows应用商店的应用程序,你可以使用这个:
Windows.System.RemoteDesktop.InteractiveSession.IsRemote
哈哈,这是一个有趣的问题:) – willem 2009-06-10 05:32:53
这里的一个问题将是不同的远程工具的范围 - MSTSC和VNC会大竞争者,但PCAnywhere,Live Mesh,GoToMyPC等等,更不用说Live Meeting和Adobe Connect Pro等可以同时进行桌面远程处理的东西。要做得更好,这可能非常困难。 – 2009-06-10 07:35:27