0

可能重复:
如何在 .NET 中检索已登录/已连接用户的列表?

我在一台机器上的 IIS 中托管了 WCF 服务。现在我想在服务中编写一个方法,通过它我可以检测托管机器当前是否被任何远程桌面连接使用。

有没有其他更好的方法来找出这一点,以及检测 RDC 连接的确切代码 API 是什么。

我正在使用 C#.net,框架 3.5

4

2 回答 2

2

您有两种选择。您可以使用对 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 会话,则使用“活动”。还有更多状态,请查看所有选项的枚举

于 2012-11-29T08:09:10.117 回答
1

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

于 2012-11-29T07:58:52.497 回答