web-dev-qa-db-fra.com

Détecter la connexion au bureau à distance

Existe-t-il de toute façon, dans un programme, pour détecter si un programme est exécuté à partir d'une session de bureau à distance ou s'il est exécuté normalement dans .NET 2.0? Ce que j'essaie de faire, c'est de créer une application de minuterie qui permet à une personne d'entrer et de sortir et de garder une trace. Je suppose que cette personne s’installe dans son ordinateur au travail, à la maison, et effectue des pointages. 

Des idées sur la façon dont je peux résoudre ce problème (et supprimer l'accès au bureau à distance n'est pas une option)? Mon idée est la suivante: s’il existe un moyen de détecter les sessions de bureau à distance, je vais tout simplement l’incorporer dans le programme et les empêcher de se synchroniser à distance.

47
Alan

prétendument 

System.Windows.Forms.SystemInformation.TerminalServerSession

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

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

47
Steven A. Lowe

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

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

L'énumération SystemMetric est disponible sur PInvoke.net - SystemMetric (mais vous pouvez simplement utiliser la valeur 0x1000). pendant la signature de GetSystemMetrics sur PInvoke.net - GetSystemMetrics .

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

15
kicsit

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

Windows.System.RemoteDesktop.InteractiveSession.IsRemote
8
Thomas Levesque

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

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

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

Eh bien, j'ai eu un problème similaire il y a quelques jours. Ce que j’ai fait pour résoudre ce problème a été mis à profit sur le fait que certaines Remote Desktop Application utilisent un port default connu, 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
                       );
}

N'oubliez pas de placer les instructions using avec les bibliothèques au début du fichier où se trouve la méthode.

Vous devez simplement transmettre, par exemple, un paramètre tel que le port 3389, qui est le port par défaut pour Remote Desktop Connection, ou le port 5900, qui est le port par défaut pour VNC Connections.

La méthode est créée avec les fonctionnalités C # 4.0 mais elle peut parfaitement être réalisée avec une version antérieure de C # .Net ou Visual Basic.

Cela a fonctionné pour moi car je n'avais besoin que de vérifier les deux applications mentionnées précédemment.

J'espère que ça peut aider.

3
JhordyRosario

Tous les programmes de connexion à distance nécessitent un service ou un programme s'exécutant sur la machine locale. Le questionneur n'a besoin de s'inquiéter de VNC et de ses clones que si ces services ou programmes sont autorisés à s'exécuter sur sa machine locale. Ils ne sont pas nécessaires à l'utilisation de Remote Desktop. Il existe des clients Remote Desktop pour tous les systèmes d'exploitation. Un serveur VNC n'est pas nécessaire si Remote Desktop fonctionne.

De plus, les clones VNC ne peuvent pas se connecter pour vous sauf si vous les installez en tant qu'administrateur sur le serveur. Tant que vous ne laissez pas les utilisateurs exécuter les processus comme les autres utilisateurs, le seul problème est que l'un de vos autres employés se connecte en tant que celui qui pose problème. Et si tel est le cas, aucune solution technique ne suffira. Même si vous avez des cartes individuelles pour chaque employé que vous devez utiliser pour vous connecter, l’employé problématique peut simplement donner la carte à son ami.

3
trlkly

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

netstat -n -a -p tcp

et vérifiez si le port 5900 est "ESTABLISHED". Bien entendu, le port de connexion par défaut est 5900. Il dépend donc du port défini.

À partir de là, j'ai trouvé ce message sur 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, ...)
}
2
Jared Harley

Pour les applications WPF , il existeSystem.Windows.SystemParameters.IsRemoteSessionetSystem.Windows.SystemParameters.IsRemotelyControlled.

1
Peter

Juste une remarque pour dire que l'utilisation de GetSystemMetrics (SystemMetric.SM_REMOTESESSION) n'est plus fiable pour Windows 8/Server 2012 à partir du moment où la session utilise la virtualisation RemoteFX du GPU.

La méthode "officielle" de détection de RDS est décrite par Microsoft ici: Détection de l'environnement des services de bureau à distance (Dernière mise à jour le 31 mai 18).

Il consiste à utiliser l’appel SystemMetrics et une vérification du registre à 

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId

Les exemples de code de cet article sont uniquement en C++, mais étant donné qu'il ne s'agit que d'une recherche dans le registre, je ne pense pas que les gens trouveront qu'il est trop rusé de le répliquer dans d'autres langues.

J'aimerais espérer qu'au moins certaines des fonctions intégrées .Net mentionnées plus haut suivent cela de près, mais:

  • SystemParameters.IsRemoteSession est indiqué ici en tant que "Mappe à SM_REMOTESESSION. Voir GetSystemMetrics", et 

  • SystemParameters.IsRemotelyControlled est noté ici identique, 

donc je ne suis pas optimiste.

Je vais essayer de faire des vérifications détaillées sous peu et poster les résultats.

0
PolicyWatcher