可能重复: 如何在.NET中检索已登录/连接的用户列表?
我在一台计算机上将WCF服务托管在IIS中。现在,我想在服务中编写一个方法,通过该方法可以检测托管的计算机当前是否被任何远程桌面连接所使用。
有没有其他更好的方法来找出这一点,以及检测RDC连接的确切代码API是什么。
我使用的是C#.net,框架3.5
发布于 2012-11-29 08:09:10
你有两个选择。您可以将P/调用调用用于WSTAPI库,但是很容易造成混乱并获得资源泄漏。
另一个选项是使用WTSAPI包装器库桂花。我以前使用过它,它很容易使用,而且这些类是相当自我记录的。
在卡斯西亚,你的功能很简单
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会话的控制台会话,则使用"active“。有更多的州,看看[医]枚举的所有选项。
发布于 2012-11-29 07:58:52
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
https://stackoverflow.com/questions/13619459
复制相似问题