有没有办法在程序中检测一个程序是否正在远程桌面会话中运行,或者该程序是否在.NET 2.0中正常运行?我试图创建一个时间钟应用程序,它将记录一个人的上下班打卡并跟踪。但是我怀疑这个特定的人正在从家里远程登录到他们工作的计算机上,然后打卡。
有什么想法可以解决这个问题(取消远程桌面访问不算选项)?我的想法是,如果有一种方法可以检测远程桌面会话的存在,那么我将简单地将其实现到程序中,并防止他们远程打卡。
有没有办法在程序中检测一个程序是否正在远程桌面会话中运行,或者该程序是否在.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);而GetSystemMetrics的签名在PInvoke.net - GetSystemMetrics上。
我用RDP和VNC测试了一下 - 前者可以工作(也支持管理员/控制台模式),但后者无法检测到。
对于 Windows Store 应用程序,您可以使用以下内容:
Windows.System.RemoteDesktop.InteractiveSession.IsRemote
isRDP = [System.Environment]
.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")
对于WPF应用程序,有System.Windows.SystemParameters.IsRemoteSession
和System.Windows.SystemParameters.IsRemotelyControlled
,前者用于判断是否处于远程会话状态,后者用于判断是否由远程控制。
几天前我遇到了类似的问题。我解决它的方法是利用一些远程桌面应用程序使用已知的默认端口,至少包括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
);
}
这里提醒一下,如果会话使用RemoteFX GPU虚拟化,则仅使用GetSystemMetrics(SystemMetric.SM_REMOTESESSION)已经不再可靠,针对Windows 8 / Server 2012及以上版本。
微软在此处描述了检测RDS的“官方”方法: 检测远程桌面服务环境 (最后更新于18年5月31日)。
该方法包括使用SystemMetrics调用和注册表检查。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId
我希望至少提到的一些.Net内置函数完全遵循这个,但是:
SystemParameters.IsRemoteSession在{{link1:此处注明}}为“映射到SM_REMOTESESSION。请参见GetSystemMetrics”,并且
SystemParameters.IsRemotelyControlled在{{link2:此处注明}}为相同,
所以我不抱太大希望。
我将尽快进行一些详细检查并发布结果。
如果您关心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, ...)
}
StandardOutput
被拼错为StandartOutput
。 - Adaline Simonian