2009-06-10 13 views
46

Esiste comunque, in un programma, per rilevare se un programma viene eseguito da una sessione desktop remota o se il programma viene eseguito normalmente in .NET 2.0? Quello che sto cercando di fare è creare un'applicazione per un orologio che farà cronometrare una persona dentro e fuori e tenere traccia. Ma questa persona in particolare, ho il sospetto, sta facendo il servizio remoto sul proprio computer al lavoro, da casa e con il cronometraggio.Rilevamento della connessione desktop remota

Qualche idea su come posso risolvere questo problema (e togliere l'accesso al desktop remoto non è un'opzione)? La mia idea è, se c'è un modo per rilevare sessioni di desktop remoto, semplicemente implementerò questo nel programma e impedirò loro di effettuare il clock remoto.

+1

Ah ah, questo è un problema interessante :) – willem

+3

Un problema qui sarà la gamma di diversi strumenti remoti - MSTSC e VNC saranno grandi contendenti, ma che dire di PCAnywhere, Live Mesh, GoToMyPC, ecc., per non parlare di Live Meeting e Adobe Connect Pro, che possono entrambi fare il desktop remoto. Per fare in modo robusto, questo potrebbe essere molto difficile. –

risposta

9

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

Il sistema variabile% nomesessione% restituirà console se locale o RDP * se remoto.

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

Se RDP con lo switch/console (o/admin, a seconda della versione), restituisce "Console" (ho appena controllato ;-p) –

+0

System.Environment..GetEnvironmentVariable ("SESSIONNAME"). ("RDP-"); Ha funzionato per me – RaoulRubin

+0

Per me restituisce Console su RDP. –

45

presumibilmente,

System.Windows.Forms.SystemInformation.TerminalServerSession 

sarà vero per una sessione di desktop remoto (o della sessione VNC)

ma mi piacerebbe provarlo per essere sicuri ;-)

+6

Dubito fortemente che riprenderà le sessioni VNC. Probabilmente rileverà RDP. –

+1

Ho controllato, e (a differenza di% sessionname% - altra risposta) funziona bene anche con l'opzione/console o/admin. Questa sembra la migliore risposta per MSTSC. –

+0

I buoni server VNC si inseriscono nel driver grafico per migliorare le prestazioni. Potrebbe essere possibile rilevarlo. –

2

Se sei preoccupato per VNC, sembra che sia possibile verificare le connessioni TCP aperte con netstat. Nel prompt dei comandi digitare:

netstat -n -a -p tcp 

e verificare se la porta 5900 è "ESTABLISHED". Naturalmente, 5900 è la porta di connessione predefinita, quindi dipende da quale porta è impostata.

Da lì, ho trovato this post at CodeGuru che spiega come utilizzare netstat nel vostro programma di C#:

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, ...) 
} 
+0

Una piccola nota: sembra che lo snippet di codice pubblicato su CodeGuru abbia un po 'di errore di ortografia, in quanto 'StandardOutput' è errato come' StandartOutput' –

14

Se non si desidera aggiungere un riferimento a System.Windows.Forms.dll solo per questo (come suggerito sopra), allora si può anche chiamare la chiamata di sistema sottostante direttamente tramite PInvoke, in questo modo:

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

l'enumerazione SystemMetric può essere trovato alla PInvoke.net - SystemMetric (ma si può semplicemente utilizzare il valore di 0x1000); mentre la firma per GetSystemMetrics a PInvoke.net - GetSystemMetrics.

Ho provato questo con RDP e VNC - funziona con il primo (anche in modalità admin/console), non rileva quest'ultimo.

3

Tutti i programmi di accesso remoto richiedono un servizio o un programma in esecuzione sul computer locale. L'interrogante deve solo preoccuparsi di VNC e dei suoi cloni se tali servizi o programmi sono autorizzati a girare sul suo computer locale. Non sono necessari per l'utilizzo di Desktop remoto e sono disponibili client Desktop remoto per tutti i sistemi operativi. Un server VNC non è necessario se Remote Desktop funziona.

Inoltre, i cloni VNC non possono accedere per te a meno che non li installi come amministratore sul server. Finché non si consente agli utenti di eseguire processi come altri utenti, l'unica preoccupazione è se uno degli altri dipendenti sta effettuando l'accesso come problematico. E se questo è il caso, nessuna soluzione tecnica sarà sufficiente. Anche se disponi di carte individuali per ciascun dipendente che devono essere utilizzate per accedere, l'impiegato problematico potrebbe semplicemente dare la carta al suo amico.

4

Bene, ho avuto un problema simile pochi giorni fa. Quello che ho fatto per risolvere era ha approfittato del fatto che alcune applicazioni Remote Desktop utilizzare un noto porta predefinita, almeno VNC e/o Microsoft Remote Desktop Connection. Così ho creato un metodo che dice se è in uso la porta, come segue:

/* 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 
         ); 
} 

ricordarsi di mettere le dichiarazioni utilizzando con le librerie all'inizio del file in cui il metodo è.

Non vi resta che passare per esempio, un parametro come il porto3389 che è la porta di default per Connessione desktop remoto, o la porta5900 che è la porta di default per VNC connessioni.

Il metodo viene creato con le funzioni C# 4.0 ma può essere eseguito perfettamente con la versione precedente di C# .Net o Visual Basic.

Questo ha funzionato per me poiché avevo solo bisogno di verificare le due applicazioni che ho menzionato prima.

Spero possa essere d'aiuto.

7

Per le applicazioni Windows Store, è possibile utilizzare questo:

Windows.System.RemoteDesktop.InteractiveSession.IsRemote 
+0

Funziona anche con le app UWP (Universal Windows Platform). Grazie! –

Problemi correlati