可能重复:How do you retrieve a list of logged-in/connected users in .NET?
我已经在一台计算机上的IIS中托管了WCF服务。现在,我想在服务中编写一种方法,通过该方法可以检测任何远程桌面连接当前是否正在使用托管计算机。
还有其他更好的方法可以找出这一点,以及检测RDC连接的确切代码API是什么。
我正在使用C#.net,框架3.5
有两个选项供您选择。您可以使用P/Invoke Calls到WSTAPI library,但是很容易弄乱内容并导致资源泄漏。
您的另一个选择是使用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会话,则认为使用“活动”。还有更多的状态,请查看the enum的所有选项。
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