我在一台机器上的 IIS 中托管了 WCF 服务。现在我想在服务中编写一个方法,通过它我可以检测托管机器当前是否被任何远程桌面连接使用。
有没有其他更好的方法来找出这一点,以及检测 RDC 连接的确切代码 API 是什么。
我正在使用 C#.net,框架 3.5
我在一台机器上的 IIS 中托管了 WCF 服务。现在我想在服务中编写一个方法,通过它我可以检测托管机器当前是否被任何远程桌面连接使用。
有没有其他更好的方法来找出这一点,以及检测 RDC 连接的确切代码 API 是什么。
我正在使用 C#.net,框架 3.5
您有两种选择。您可以使用对 WSTAPI 库的P / Invoke 调用,但是很容易弄乱东西并导致资源泄漏。
您的另一个选择是使用 WTSAPI 包装库Cassia。我以前用过它,它很容易使用,而且这些类是相当自我记录的。
在决明子你的功能只是
public bool IsComputerUsedByTS()
{
var tsMgr = new TerminalServicesManager();
var localSvr = tsMgr.GetLocalServer();
var sessions = localSvr.GetSessions();
foreach(var session in sessions)
{
if(session.ConnectionState == ConnectionState.Active ||
session.ConnectionState == ConnectionState.Connected) //Add more states you want to check for as needed
{
return true;
}
}
return false;
}
我没有测试上述内容,我认为如果您是控制台会话,其中“已连接”用于 RDP 会话,则使用“活动”。还有更多状态,请查看所有选项的枚举。
RDP 服务器默认侦听端口 3389(但可以进行不同的配置)。
因此(即使不是 100% 可靠)这可以用来检查任何活动的 RDP 连接。
bool inUse = IPGlobalProperties.GetIPGlobalProperties()
.GetActiveTcpConnections()
.Any(tcp => tcp.LocalEndPoint.Port == 3389);
编辑
我添加了@t3hn00b 的建议。
int port = 3389;
using (var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp", false))
{
if (key != null)
{
object value = key.GetValue("PortNumber");
if (value != null) port = Convert.ToInt32(value);
}
}
命名空间:System.Net.NetworkInformation