web-dev-qa-db-ja.com

リモートデスクトップ接続の検出

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

この問題を解決する方法はありますか(リモートデスクトップアクセスを奪うことは選択肢ではありません)?私の考えは、リモートデスクトップセッションを検出する方法があれば、これをプログラムに実装し、リモートでセッションが開始されないようにすることです。

48
Alan

伝えられるところでは、

System.Windows.Forms.SystemInformation.TerminalServerSession

リモートデスクトップセッション(またはVNCセッション)に当てはまります

しかし、私はそれを確認するためにテストしたい;-)

48
Steven A. Lowe

これだけのためにSystem.Windows.Forms.dllへの参照を追加したくない場合(上記のように)、次のようにPInvokeを介して直接、基になるシステムコールを呼び出すこともできます。

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

SystemMetric列挙は PInvoke.net-SystemMetric で見つけることができます(ただし、0x1000の値を使用するだけです)。一方、 PInvoke.net-GetSystemMetrics のGetSystemMetricsの署名。

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

16
kicsit

Windowsストアアプリの場合、これを使用できます。

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

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

システム変数%sessionname%は、ローカルの場合はConsoleを返し、リモートの場合はRDP *を返します。

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

まあ、数日前に同様の問題がありました。私がそれを解決するためにやったことは、いくつかのリモートデスクトップアプリケーション既知のデフォルトポートを使用し、少なくとも[〜#〜] vnc [ 〜#〜]および/またはMicrosoft Remote Desktop Connection。そこで、次のように、ポートが使用されているかどうかを通知するメソッドを作成しました。

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

メソッドが存在するファイルの先頭に、ライブラリとともにusingステートメントを配置することを忘れないでください。

たとえば、89ポートのようなパラメーターを渡す必要があります。これはリモートデスクトップ接続のデフォルトポート、または5900ポートVNC接続のデフォルトポート。

このメソッドはC#4.機能で作成されますが、C#.NetまたはVisual Basic。の以前のバージョンで完全に実行できます

以前に言及した2つのアプリケーションのみをチェックする必要があるため、これは私にとってはうまくいきました。

私はそれが役立つことを願っています。

3
JhordyRosario

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

さらに、サーバーマシンに管理者としてインストールしない限り、VNCクローンはログインできません。ユーザーに他のユーザーとしてプロセスを実行させない限り、唯一の懸念は、他の従業員の1人が問題のある従業員としてログインしているかどうかです。その場合、技術的な解決策では十分ではありません。ログインに使用しなければならない従業員ごとに個別のカードがある場合でも、問題のある従業員は友人にカードを渡すだけです。

3
trlkly

VNCに不安がある場合は、open TCP netstatとの接続を確認することができるようです。コマンドプロンプトで、次のように入力します。

netstat -n -a -p tcp

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

そこから、私は CodeGuruのこの投稿 を見つけました。これは、C#プログラムでnetstatを使用する方法を説明しています。

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

WPFアプリケーションの場合 あるSystem.Windows.SystemParameters.IsRemoteSessionおよびSystem.Windows.SystemParameters.IsRemotelyControlled

1
Peter

セッションがGPUのRemoteFX仮想化を使用している場合、Windows 8/Server 2012以降では、GetSystemMetrics(SystemMetric.SM_REMOTESESSION)を単独で使用することの信頼性がなくなりました。

RDSを検出する「公式の」方法については、Microsoftがここで説明しています。 リモートデスクトップサービス環境の検出 (最終更新日:18 5月31日)。

SystemMetrics呼び出しおよびのレジストリチェックを使用して構成されます。

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

その記事のコードサンプルはC++のみですが、それが単なるレジストリルックアップであることを考えると、他の言語で複製するにはあまりにも巧妙すぎるとは思わないでしょう。

Upthreadに言及されている.Net組み込み関数の少なくとも一部がこれを完全にフォローしていることを望みますが、

  • SystemParameters.IsRemoteSessionは ここに記載 「SM_REMOTESESSIONへのマップ。GetSystemMetrics」を参照してください。

  • SystemParameters.IsRemotelyControlledは ここに記載 と同じですが、

だから私は楽観的ではありません。

すぐにいくつかの詳細なチェックを行い、結果を投稿しようとします。

0
PolicyWatcher