2009-06-10 24 views
46

リモートデスクトップセッション内からプログラムが実行されているかどうか、またはプログラムが.NET 2.0で正常に実行されているかどうかを検出するには、私がしようとしているのは、人を時計回りに回して追跡するタイムクロックアプリケーションを作成することです。しかし、この特定の人は、私が思うには、自宅のコンピュータ、仕事場のコンピュータにリモーティングしています。リモートデスクトップ接続の検出

どのように私はこの問題を解決することができます(と離れてリモートデスクトップアクセスを取ることはオプションではありません)?私の考えは、リモートデスクトップセッションを検出する方法があれば、これをプログラムに実装し、リモートでクロッキングするのを防ぎます。

+1

ハハ、それは興味深い問題です:) – willem

+3

一つの問題ここでは、さまざまなリモートツールの範囲になります - MSTSCとVNCは大きな競争になり、しかし、PCAnywhere、Live Mesh、GoToMyPCなどについては、Live MeetingやAdobe Connect Proのようなものはもちろん、デスクトップリモーティングを行うこともできます。ロバストにするには、これは非常に難しいかもしれません。 –

答えて

9

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

システム変数%セッション名%Consoleを返します。その場合は、ローカルまたはRDP *そのリモート場合。

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

/consoleスイッチ(または/ admin、バージョンに応じて)を使用してRDPを実行した場合、「Console」が返されます(私はちょうど-pをチェックしました) –

+0

System.Environment..GetEnvironmentVariable( "SESSIONNAME")。StartsWith (「RDP-」)。私のために働いた。 – RaoulRubin

+0

それは私のためにRDPのコンソールを返します。 –

45

容疑者は、

System.Windows.Forms.SystemInformation.TerminalServerSession 

は、リモートデスクトップセッション(またはVNCセッション)のために真となります

ものの場合、私は;-)

+6

私はこれがVNCセッションを受け取ることを非常に疑っています。おそらくRDPを検出します。 –

+1

私はチェックして、(%sessionname%とは異なり - 他の答え)これは/ consoleまたは/ adminスイッチでも正常に動作します。これはMSTSCの最善の答えのように聞こえます。 –

+0

パフォーマンスを向上させるには、VNCサーバーをグラフィックス・ドライバーに接続します。それを検出することは可能かもしれません。 –

2

確認するためにそれをテストしたいですあなたはVNCを心配しています、それはnetstatで開いているTCP接続をチェックすることが可能であるように見えます。コマンドプロンプトで「

netstat -n -a -p tcp 

と入力し、ポート5900が「ESTABLISHED」であることを確認します。もちろん、デフォルトの接続ポートは5900なので、どのポートが設定されているかに依存します。

そこから、私はあなたのC#のプログラムでnetstatを使用する方法について説明しているthis post at CodeGuruを見つけました:

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

小さな注記:CodeGuruに掲載されたコードスニペットには、「StandardOutput」のスペルミスが「StandartOutput」であるという点で、スペルミスがあります。 –

14

あなたはこのためのSystem.Windows.Forms.dllへの参照を追加したくない場合は( )上記示唆したように、あなたはまた、このように、のPInvoke経由で直接基盤となるシステムコールを呼び出すことができます。

SystemMetric列挙)が PInvoke.net - SystemMetricで見つけることができます(ただし、あなただけは0x1000の値を使用することができます
int result = GetSystemMetrics(SystemMetric.SM_REMOTESESSION); 
    bool isRemoteSession = (result != 0); 

。 GetSystemMetricsの署名はPInvoke.net - GetSystemMetricsです。

これをRDPとVNCでテストしましたが、前者(admin/consoleモードの場合も同様)で動作し、後者を検出しません。

3

すべてのリモートログインプログラムでは、ローカルマシン上で実行されているサービスまたはプログラムが必要です。質問者は、VNCとそのクローンがローカルマシン上で動作することが許可されていれば、VNCとそのクローンについて心配する必要があります。リモートデスクトップの使用には不要で、すべてのオペレーティングシステム用のリモートデスクトップクライアントがあります。リモートデスクトップが動作している場合、VNCサーバーは不要です。

さらに、サーバーマシンに管理者としてインストールしない限り、VNCクローンはあなたのためにログインできません。ユーザーが他のユーザーとしてプロセスを実行できるようにしない限り、懸念事項は、他の従業員の1人が問題のあるユーザーとしてログインしている場合のみです。その場合、技術的な解決策では十分ではありません。ログインに使用する必要がある従業員ごとに個別のカードを持っていても、問題のある従業員は自分の友人にカードを渡すことができます。

4

まあ、数日前に同様の問題がありました。私はそれを解決するためにやったことは、いくつかのリモートデスクトップアプリケーションが知られているデフォルトポート、少なくともVNCおよび/またはMicrosoftリモートデスクトップ接続を使用しているという事実を利用したました。

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

は方法があり、ファイルの先頭にライブラリを使用してステートメントを置くことを忘れないでください:だから私は、次のようにポートが、使用されている場合伝える方法を作成しました。

あなただけ例えばリモートデスクトップ接続、またはVNC接続のデフォルトポートである5900ポートのデフォルトポートである3389ポートなどのパラメータを渡す必要があります。

このメソッドはC#4.0の機能で作成されますが、それは完全に古いバージョンのC#.NetまたはVisual Basicで行うことができます。

私が前に述べた2つのアプリケーションを確認する必要があるので、これは私のために働いた。

私はそれが助けてくれることを願っています。 Windowsストアアプリの

7

、あなたがこれを使用することができますする:

Windows.System.RemoteDesktop.InteractiveSession.IsRemote 
+0

Universal Windows Platform(UWP)アプリケーションでも動作します。ありがとう! –

関連する問題