【问题标题】:How to detect RDC from C#.net [duplicate]如何从 C#.net 检测 RDC [重复]
【发布时间】:2012-11-29 05:30:21
【问题描述】:

可能重复:
How do you retrieve a list of logged-in/connected users in .NET?

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

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

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

【问题讨论】:

    标签: c# .net wcf remote-desktop


    【解决方案1】:

    您有两种选择。您可以使用P/Invoke CallsWSTAPI library,但是很容易搞砸并导致资源泄漏。

    您的另一个选择是使用 WTSAPI 包装库Cassia。我以前用过它,它很容易使用,而且这些类是相当自我记录的。

    在 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 了解所有选项。

    【讨论】:

    • Active 状态实际上由控制台会话和远程会话使用,并且是您真正需要的状态。 Connected 状态不太常见,我只是在 Windows 最初设置会话时才短暂看到它(也许当用户在登录屏幕上时,RD 连接上没有使用网络级别身份验证)。
    • 正如我所说,我面前没有 TS 服务器来测试。感谢您的信息。
    • 感谢您的回答 - 你让我摆脱了严重的困境!一点点变化:GetSessions() 应该是 localSvr.GetSessions()
    【解决方案2】:

    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

    【讨论】:

    • 关于端口部分 - 有一个注册表项可用于获取端口HKEY_LOCAL_MACHINE > SYSTEM > CurrentControlSet > Control > Terminal Server > WinStations > RDP-Tcp > PortNumber
    • @t3hn00b 你是对的。可用于3389常量
    猜你喜欢
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多