マシン上の IIS で WCF サービスをホストしました。ここで、ホストされたマシンが現在リモート デスクトップ接続で使用されているかどうかを検出できるサービスにメソッドを記述したいと考えています。
これを見つけるための他の良い方法はありますか?RDC接続が検出される正確なコードAPIは何ですか?
C#.net、フレームワーク 3.5 を使用しています
マシン上の IIS で WCF サービスをホストしました。ここで、ホストされたマシンが現在リモート デスクトップ接続で使用されているかどうかを検出できるサービスにメソッドを記述したいと考えています。
これを見つけるための他の良い方法はありますか?RDC接続が検出される正確なコードAPIは何ですか?
C#.net、フレームワーク 3.5 を使用しています
2 つのオプションがあります。P/Invoke CallsをWSTAPI ライブラリに使用できますが、簡単に混乱してリソース リークが発生します。
もう 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セッション用であるコンソールセッションの場合、「アクティブ」が使用されると思います. さらに多くの状態があります。すべてのオプションの列挙を見てください。
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