57 votes

Détection de la connexion au bureau à distance

Existe-t-il un moyen, dans un programme, de détecter si un programme est exécuté à partir d'une session de bureau à distance ou si le programme est exécuté normalement en .NET 2.0 ? Ce que j'essaie de faire, c'est de créer une application de chronométrage qui enregistre les entrées et sorties d'une personne et en garde la trace. Mais je soupçonne cette personne de se connecter à distance à son ordinateur au travail, depuis son domicile, et de pointer ses entrées et sorties.

Avez-vous une idée de la façon dont je peux résoudre ce problème (et la suppression de l'accès au bureau à distance n'est pas une option) ? S'il existe un moyen de détecter les sessions de bureau à distance, je vais simplement l'intégrer dans le programme et les empêcher de pointer à distance.

1 votes

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

4 votes

L'un des problèmes qui se posent ici est l'éventail des différents outils de télétravail : MSTSC et VNC seront de gros concurrents, mais qu'en est-il de PCAnywhere, Live Mesh, GoToMyPC, etc., sans parler de Live Meeting et d'Adobe Connect Pro, qui peuvent tous deux faire du télétravail de bureau. Cela pourrait être très difficile à réaliser de manière robuste.

0 votes

Désolé de demander... je sais que c'est hors sujet. Mais un client à un autre connecté à travers différents réseaux en utilisant RDP est-il polyvalent ?

57voto

Steven A. Lowe Points 40596

Prétendument,

System.Windows.Forms.SystemInformation.TerminalServerSession

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

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

6 votes

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

1 votes

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

0 votes

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

19voto

kicsit Points 118

Si vous ne voulez pas ajouter une référence à System.Windows.Forms.dll juste pour cela (comme suggéré ci-dessus), alors vous pouvez aussi 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 à l'adresse suivante PInvoke.net - SystemMetric (mais vous pouvez simplement utiliser la valeur 0x1000) ; alors que la signature de GetSystemMetrics à PInvoke.net - Obtenir des paramètres système .

J'ai testé cela avec RDP et VNC - cela fonctionne avec le premier (en mode administrateur/console également), mais ne détecte pas le second.

13voto

Thomas Levesque Points 141081

Pour les applications du Windows Store, vous pouvez utiliser ceci :

Windows.System.RemoteDesktop.InteractiveSession.IsRemote

0 votes

Fonctionne également avec les applications de la plateforme universelle Windows (UWP). Merci !

9voto

John Gietzen Points 23645

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

La variable système %sessionname% renverra Console si elle est locale ou RDP* si elle est distante.

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

7 votes

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

0 votes

System.Environment..GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-") ; Cela a fonctionné pour moi.

0 votes

C'est la console de retour sur RDP pour moi.

2voto

Jared Harley Points 4729

Si vous êtes concerné 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 "ESTABLISHED". Bien sûr, 5900 est le port de connexion par défaut, donc cela dépend du port défini.

A partir de là, j'ai trouvé ce billet chez CodeGuru qui explique comment utiliser netstat dans votre programme 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, ...)
}

1 votes

Une petite note : il semble que le code posté sur CodeGuru comporte une petite erreur d'orthographe. StandardOutput est mal orthographié StandartOutput

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X