2012-11-29 31 views

回答

0

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

+0

關於端口部分 - 有一個註冊表鍵可以用來獲取端口HKEY_LOCAL_MACHINE> SYSTEM> CurrentControlSet> Control> Terminal Server> WinStations> RDP-Tcp> PortNumber' – t3hn00b

+0

@ t3hn00b您是對的。它可以用於3389常量 –

1

有給你兩個選擇。你可以使用P/Invoke CallsWSTAPI 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

+0

「活動」狀態實際上由控制檯會話和遠程會話使用,並且是您真正需要的狀態。 「連接」狀態不太常見,我只在Windows最初設置會話時纔會看到它(也可能當用戶在登錄屏幕上時沒有在RD連接上使用網絡級身份驗證時)。 –

+0

正如我所說的,我沒有在我面前的TS服務器進行測試。謝謝(你的)信息。 –

+0

謝謝你的回答 - 你讓我擺脫了嚴重的堵塞!有一點改變:'GetSessions()'應該是'localSvr.GetSessions()' –