可能重複:
How do you retrieve a list of logged-in/connected users in .NET?如何從C#.NET檢測RDC
我主持WCF服務在IIS的機器上。現在我想在服務中編寫一個方法,通過該方法我可以檢測到託管機器當前是否正在被任何遠程桌面連接使用。
有沒有其他更好的方法來找出這個問題,以及檢測RDC連接的確切代碼API是什麼。
我使用C#.net框架默認3.5
可能重複:
How do you retrieve a list of logged-in/connected users in .NET?如何從C#.NET檢測RDC
我主持WCF服務在IIS的機器上。現在我想在服務中編寫一個方法,通過該方法我可以檢測到託管機器當前是否正在被任何遠程桌面連接使用。
有沒有其他更好的方法來找出這個問題,以及檢測RDC連接的確切代碼API是什麼。
我使用C#.net框架默認3.5
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
有給你兩個選擇。你可以使用P/Invoke Calls到WSTAPI library但是很容易弄髒東西並且得到資源泄漏。您的其他選項是使用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會話使用。有更多的州,看所有的選項the enum。
「活動」狀態實際上由控制檯會話和遠程會話使用,並且是您真正需要的狀態。 「連接」狀態不太常見,我只在Windows最初設置會話時纔會看到它(也可能當用戶在登錄屏幕上時沒有在RD連接上使用網絡級身份驗證時)。 –
正如我所說的,我沒有在我面前的TS服務器進行測試。謝謝(你的)信息。 –
謝謝你的回答 - 你讓我擺脫了嚴重的堵塞!有一點改變:'GetSessions()'應該是'localSvr.GetSessions()' –
關於端口部分 - 有一個註冊表鍵可以用來獲取端口HKEY_LOCAL_MACHINE> SYSTEM> CurrentControlSet> Control> Terminal Server> WinStations> RDP-Tcp> PortNumber' – t3hn00b
@ t3hn00b您是對的。它可以用於3389常量 –