La détection de connexion bureau à distance
y a-t-il de toute façon, dans un programme, pour détecter si un programme est exécuté depuis une session de bureau à distance ou si le programme est exécuté normalement dans .NET 2.0? Ce que j'essaie de faire, j'ai créer une pointeuse application horloge d'une personne et de sortir et de garder trace. Mais cette personne en particulier, je soupçonne, est remoting dans leur ordinateur au travail, de la maison, et le clocking dedans et dehors.
toutes les idées comment je peux résoudre ce problème (et de prendre bureau à distance l'accès 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 l'implémenter dans le progam et les empêcher de se connecter à distance.
8 réponses
soi-disant,
System.Windows.Forms.SystemInformation.TerminalServerSession
sera vrai pour une session de bureau à distance (ou session VNC)
mais j'aimerais le tester pour en être sûr ;-)
si vous ne voulez pas ajouter de référence au système.Windows.Forme.dll juste pour cela (comme suggéré ci-dessus), alors 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);
le dénombrement systématique se trouve à PInvoke.net -SystemMetric (mais vous pouvez juste utiliser la valeur de 0x1000); tandis que la signature pour GetSystemMetrics à PInvoke.net -GetSystemMetrics .
j'ai testé cela avec RDP et VNC - fonctionne avec le premier (mode admin/console également), ne détecte pas le second.
http://www.appdeploy.com/messageboards/tm.asp?m=21420&mpage=1&key=厬
la variable système %sessionname% retournera la Console si elle est locale ou RDP* si elle est distante.
isRDP = [System.Environment]
.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")
pour les applications Windows Store, vous pouvez utiliser ceci:
Windows.System.RemoteDesktop.InteractiveSession.IsRemote
J'ai eu un problème similaire il y a quelques jours. Ce que j'ai fait pour résoudre il a été tiré profit du fait que certains application De Bureau À Distance utiliser un connu port par défaut , au moins VNC et/ou Microsoft connexion de Bureau À Distance . 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 mettre les instructions d'utilisation avec les bibliothèques au début du fichier dans lequel la méthode est.
vous avez juste à passer par exemple un paramètre comme le 3389 port qui est le port par défaut pour Connexion Bureau À Distance , ou le 5900 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 plus ancienne version de C#.Net ou visuellement Basique.
cela a fonctionné pour moi puisque j'avais seulement besoin de vérifier pour les deux applications que j'ai mentionnées avant.
j'espère que ça peut aider.
tous les programmes de connexion à distance nécessitent un service ou un programme tournant sur la machine locale. L'auteur de la question n'a qu'à s'inquiéter de la VNC et de ses clones si ces services ou programmes sont autorisés à fonctionner sur sa machine locale. Ils ne sont pas nécessaires pour L'utilisation de Bureau À Distance, et il existe des clients de bureau à distance pour tous les systèmes d'exploitation. Un serveur VNC est inutile si le bureau distant fonctionne.
de plus, les clones VNC ne peuvent pas se connecter pour vous si vous ne les installez pas 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 si l'un de vos autres employés se connecte en tant que problème. 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 se connecter, l'employé problématique pourrait tout simplement donner à son ami la carte.
si vous êtes préoccupé par VNC, il semble qu'il soit 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"établi". Bien sûr, 5900 est le port de connexion par défaut, donc il dépend du port qui est défini.
de là, j'ai trouvé ce post à 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, ...)
}