2009-06-10 10 views
46

Y a-t-il un programme permettant de détecter si un programme est exécuté à partir d'une session de bureau à distance ou si le programme est exécuté normalement dans .NET 2.0? Ce que j'essaye de faire est, je crée une application de timeclock qui surveillera une personne dedans et dehors et garder la trace. Mais cette personne en particulier, je le soupçonne, est en train d'entrer dans son ordinateur au travail, à la maison, et d'entrer et sortir.Détection de la connexion Bureau à distance

Des idées comment je peux résoudre ce problème (et enlever l'accès au bureau à distance n'est pas une option)? Mon idée est, s'il y a un moyen de détecter les sessions de bureau à distance, je vais simplement implémenter cela dans le programme et les empêcher de se synchroniser à distance.

+1

Ha ha, c'est un problème intéressant :) – willem

+3

Un problème ici sera la gamme des différents outils à distance - MSTSC et VNC seront grands prétendants, mais qu'en est-il de PCAnywhere, Live Mesh, GoToMyPC etc., sans parler de choses comme Live Meeting et Adobe Connect Pro, qui peuvent tous les deux faire des connexions à distance. Pour le faire de manière robuste, cela pourrait être très difficile. –

Répondre

9

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

La variable système% SessionName% retournera console si son local ou RDP * si sa télécommande.

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

Si vous RDP avec le commutateur/console (ou/admin, selon la version), alors il retourne "Console" (Je viens de vérifier ;-p) –

+0

System.Environment..GetEnvironmentVariable ("SESSIONNAME"). StartsWith ("RDP-"); A travaillé pour moi. – RaoulRubin

+0

Ses retours Console sur RDP pour moi. –

45

aurait,

System.Windows.Forms.SystemInformation.TerminalServerSession 

sera vrai pour une session de bureau à distance (ou session VNC)

mais je le tester pour être sûr ;-)

+6

Je doute fortement que cela ramasse les sessions VNC. Il détectera probablement RDP. –

+1

J'ai vérifié, et (contrairement à% sessionname% - autre réponse) cela fonctionne très bien même avec le commutateur/console ou/admin. Cela semble être la meilleure réponse pour MSTSC. –

+0

De bons serveurs VNC se branchent sur le pilote graphique pour améliorer les performances. Il pourrait être possible de détecter cela. –

2

Si vous êtes préoccupé par VNC, il semble qu'il serait possible de vérifier les connexions TCP ouvertes avec netstat. Dans une invite de commande, tapez:

netstat -n -a -p tcp 

et vérifiez si le port 5900 est « RECONNU ». Bien sûr, 5900 est le port de connexion par défaut, il dépend donc du port défini.

À partir de là, je trouve this post at CodeGuru qui explique comment utiliser netstat dans votre C# programme:

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

Une petite note: on dirait que l'extrait de code affiché sur CodeGuru a un peu une faute d'orthographe, en ce que 'StandardOutput' est mal orthographié comme' StandartOutput' –

14

Si vous ne voulez pas ajouter une référence à System.Windows.Forms.dll juste pour ce (comme suggéré ci-dessus), vous pouvez également appeler l'appel système sous-jacent directement via PInvoke, comme ceci:

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

l'énumération systemMetric se trouve à PInvoke.net - SystemMetric (mais vous pouvez simplement utiliser la valeur de 0x1000); tandis que la signature pour GetSystemMetrics au PInvoke.net - GetSystemMetrics.

J'ai testé cela avec RDP et VNC - fonctionne avec le premier (mode admin/console également), ne détecte pas ce dernier.

3

Tous les programmes de connexion à distance nécessitent un service ou un programme s'exécutant sur la machine locale. Le questionneur ne doit s'inquiéter de VNC et de ses clones que si ces services ou programmes sont autorisés à fonctionner sur sa machine locale. Ils ne sont pas nécessaires pour l'utilisation de Remote Desktop et il existe des clients Remote Desktop pour tous les systèmes d'exploitation. Un serveur VNC est inutile si Remote Desktop fonctionne. En outre, les clones VNC ne peuvent pas vous connecter à moins que vous ne les installiez en tant qu'administrateur sur la machine serveur. Tant que vous ne laissez pas les utilisateurs exécuter des processus comme les autres utilisateurs, la seule préoccupation est de savoir si l'un de vos autres employés se connecte comme étant problématique. Et si c'est le cas, aucune solution technique ne sera suffisante. Même si vous avez des cartes individuelles pour chaque employé qui doit être utilisé pour vous connecter, l'employé problématique pourrait simplement donner sa carte à son ami.

4

Eh bien, j'ai eu un problème similaire il y a quelques jours. Ce que je l'ai fait pour le résoudre a profité du fait que certains application Remote Desktop utiliser un connu port par défaut, au moins VNC et/ou Microsoft Remote Desktop Connection. J'ai donc créé une méthode qui indique si le port est utilisé, comme suit:

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

Rappelez-vous de mettre les déclarations à l'aide avec les bibliothèques au début du fichier dans lequel la méthode est.

Il vous suffit de passer par exemple un paramètre comme le 3389 le port qui est le port par défaut pour Remote Desktop Connection ou le 5900 le port qui est le port par défaut pour Connexions VNC.

La méthode est créée avec C# 4.0 caractéristiques, mais il peut parfaitement être fait avec et ancienne version de C# .Net ou Visual Basic.

Cela a fonctionné pour moi puisque j'avais seulement besoin de vérifier les deux applications que j'ai mentionnées auparavant.

J'espère que cela peut aider.

7

Pour les applications Windows Store, vous pouvez utiliser ceci:

Windows.System.RemoteDesktop.InteractiveSession.IsRemote 
+0

Fonctionne aussi avec les applications UWP (Universal Windows Platform). Merci! –

Questions connexes