0

重複の可能性:
.NET でログイン/接続しているユーザーのリストを取得するにはどうすればよいですか?

マシン上の IIS で WCF サービスをホストしました。ここで、ホストされたマシンが現在リモート デスクトップ接続で使用されているかどうかを検出できるサービスにメソッドを記述したいと考えています。

これを見つけるための他の良い方法はありますか?RDC接続が検出される正確なコードAPIは何ですか?

C#.net、フレームワーク 3.5 を使用しています

4

2 に答える 2

2

2 つのオプションがあります。P/Invoke CallsWSTAPI ライブラリに使用できますが、簡単に混乱してリソース リークが発生します。

もう 1 つのオプションは、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セッション用であるコンソールセッションの場合、「アクティブ」が使用されると思います. さらに多くの状態があります。すべてのオプションの列挙を見てください。

于 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 に答える