2009-06-10 141 views
46

無論如何,在程序中,檢測程序是否從遠程桌面會話內運行,或者程序是否在.NET 2.0中運行正常?我想要做的是,我創建了一個時鐘應用程序,它可以記錄一個人的進出時間並跟蹤記錄。但我懷疑,這個特定的人正在遠程工作,離開家,進出計算機。檢測遠程桌面連接

任何想法如何解決這個問題(並帶走遠程桌面訪問不是一種選擇)?我的想法是,如果有辦法檢測遠程桌面會話,我將簡單地將其實施到程序中,並防止它們遠程計時。

+1

哈哈,這是一個有趣的問題:) – willem 2009-06-10 05:32:53

+3

這裏的一個問題將是不同的遠程工具的範圍 - MSTSC和VNC會大競爭者,但PCAnywhere,Live Mesh,GoToMyPC等等,更不用說Live Meeting和Adobe Connect Pro等可以同時進行桌面遠程處理的東西。要做得更好,這可能非常困難。 – 2009-06-10 07:35:27

回答

9

http://www.appdeploy.com/messageboards/tm.asp?m=21420&mpage=1&key=&#21420

系統變量%SESSIONNAME%將返回控制檯如果本地或RDP *如果遙控器。

isRDP = [System.Environment] 
    .GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-") 
+6

如果您使用RDP /控制檯開關(或/管理,根據不同的型號),則返回「控制檯」(我剛剛檢查;-p) – 2009-06-10 07:29:33

+0

System.Environment..GetEnvironmentVariable(「SESSIONNAME」)。StartsWith ( 「RDP-」);爲我工作。 – RaoulRubin 2012-04-13 13:31:25

+0

它在RDP上爲我返回控制檯。 – 2013-07-30 11:45:24

45

據稱,

System.Windows.Forms.SystemInformation.TerminalServerSession 

將是一個遠程桌面會話真(或VNC會話)

,但我會測試它,以確保;-)

2

如果你關心的是VNC,看起來可以用netstat來檢查開放的TCP連接。在命令提示,輸入:

netstat -n -a -p tcp 

,並檢查,以查看是否該端口5900被「已建立」。當然,5900是默認的連接端口,所以它將取決於設置的端口。

從那裏,我發現this post at CodeGuru說明如何在C#程序中使用netstat

string sCommand = "netstat"; 
string sArgs = ""; 
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo (sCommand, sArgs); 

psi.UseShellExecute = false; 
psi.RedirectStandartOutput = true; 

System.Diagnostics.Process proc = null; 
proc = System.Diagnostics.Process.Start(psi); 
proc.WaitForExit(); 

// Read the first 4 lines. They don't contain any information we need to get 
for (int i = 0; i < 4; i++) 
    proc.StandardOutput.ReadLine(); 

while (true) 
{ 
    string strLine = proc.StandardOutput.ReadLine(); 
    if (strLine == null) 
     break; 

    // Analyze the line 
    // Line is in following structure: 
    // Protocol (TCP/UDP) Local Address(host:port) Foreign Address(host:port) State(ESTABLISHED, ...) 
} 
14

如果你不想添加一個引用System.Windows.Forms.dll中只爲這(如上面所建議的),則還可以直接通過的PInvoke調用基礎系統調用,例如:

int result = GetSystemMetrics(SystemMetric.SM_REMOTESESSION); 
    bool isRemoteSession = (result != 0); 

的SystemMetric枚舉可以在PInvoke.net - SystemMetric找到(但是可以只使用的0x1000的值);而GetSystemMetrics的簽名位於PInvoke.net - GetSystemMetrics

我測試了這個與RDP和VNC - 與前者(管理員/控制檯模式也),沒有檢測到後者。

3

所有遠程登錄程序都需要在本地機器上運行的服務或程序。如果這些服務或程序被允許在他的本地機器上運行,提問者只需要擔心VNC及其克隆。它們不是遠程桌面使用所必需的,並且所有操作系統都有遠程桌面客戶端。如果遠程桌面正在運行,則不需要VNC服務器。

此外,除非您以服務器計算機上的管理員身份安裝VNC克隆,否則VNC克隆無法爲您登錄。只要您不讓用戶像其他用戶一樣運行流程,唯一的問題是您的其他員工之一是否以有問題的身份登錄。如果是這樣的話,沒有技術解決方案就足夠了。即使您爲每位必須用於登錄的員工製作了個人卡片,有問題的員工也可以給他的朋友發送卡片。

4

好吧,前幾天我有類似的問題。我所做的,解決它了的事實,即一些遠程桌面應用使用已知默認端口,至少VNC和/或微軟遠程桌面連接。因此,我創建如果正在使用的端口,它告訴的方法,具體如下:

/* Libraries needed */ 
using System.Linq; 
using System.Net.NetworkInformation; 

/*.... 
    .... 
    ....*/ 

private static bool IsPortBeingUsed(int port) 
{ 
    return IPGlobalProperties.GetIPGlobalProperties(). 
       GetActiveTcpConnections(). 
        Any(
          tcpConnectionInformation => 
          tcpConnectionInformation.LocalEndPoint.Port == port 
         ); 
} 

記得把using語句與圖書館的文件,其中該方法的開始。

你只需要通過例如參數如3389端口這是遠程桌面連接,或5900端口這是VNC連接默認端口的默認端口。

該方法是用C#4.0創建的功能,但它可以完美地與舊版本的C#.Net或Visual Basic一起完成。

這對我有效,因爲我只需要檢查我之前提到的兩個應用程序。

我希望它能提供幫助。

7

對於Windows應用商店的應用程序,你可以使用這個:

Windows.System.RemoteDesktop.InteractiveSession.IsRemote