DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

リモートデスクトップのクライアントセッションで実行されているか調べる

ここでは、アプリケーションがRemote Desktop Protocol(RDP)を使用したリモートデスクトップサービス(ターミナルサービス)接続のクライアントセッションで実行されているか調べる方法を幾つか紹介します。

ここで紹介する方法は、基本的には、リモートセッションの場合に有効です。コンソールセッション(「/console」や「/admin」をオプションに指定してmstscを起動)の場合は、OS(mstscのバージョン)等によっては、正しく判断できないこともあるようです。(情報が不足していますので、情報をお持ちの方はコメントで報告していただけると助かります。)

なおここで紹介している内容は、「Detecting remote desktop connection」を参考にして書かせていただきました。

SystemInformation.TerminalServerSessionプロパティを使用する方法

.NET Framework 2.0以降では、SystemInformation.TerminalServerSessionプロパティを使って判断することができます。

補足:SystemInformation.TerminalServerSessionプロパティは、後述するGetSystemMetricsを内部で使用しています。
VB.NET
コードを隠すコードを選択
If System.Windows.Forms.SystemInformation.TerminalServerSession Then
    Console.WriteLine("リモートデスクトップ経由で実行されています")
Else
    Console.WriteLine("リモートデスクトップではありません")
End If
C#
コードを隠すコードを選択
if (System.Windows.Forms.SystemInformation.TerminalServerSession)
{
    Console.WriteLine("リモートデスクトップ経由で実行されています");
}
else
{
    Console.WriteLine("リモートデスクトップではありません");
}

GetSystemMetricsを使用する方法

SystemInformation.TerminalServerSessionプロパティが使用できない時は、GetSystemMetrics functionを使用しても同じことができます。

VB.NET
コードを隠すコードを選択
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function GetSystemMetrics(smIndex As Integer) As Integer
End Function
Private Shared SM_REMOTESESSION As Integer = &H1000

''' <summary>
''' リモートデスクトップクライアントセッションで実行されているか調べる
''' </summary>
''' <returns>
''' リモートデスクトップクライアントセッションで実行されている場合は、True。
''' それ以外の場合は、False。
''' </returns>
Public Shared Function IsRemoteSession() As Boolean
    Return GetSystemMetrics(SM_REMOTESESSION) <> 0
End Function
C#
コードを隠すコードを選択
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int GetSystemMetrics(int smIndex);
private static int SM_REMOTESESSION = 0x1000;

/// <summary>
/// リモートデスクトップクライアントセッションで実行されているか調べる
/// </summary>
/// <returns>
/// リモートデスクトップクライアントセッションで実行されている場合は、True。
/// それ以外の場合は、False。
/// </returns>
public static bool IsRemoteSession()
{
    return GetSystemMetrics(SM_REMOTESESSION) != 0;
}
補足:IsOS functionのパラメータにOS_TERMINALCLIENT(14)を指定しても同じことができます。

環境変数「SESSIONNAME」を使用する方法

環境変数「SESSIONNAME」は、リモートデスクトップクライアントセッションの時、「RDP-」で始まる文字列を返します。ただしコンソールセッションでは「Console」という文字列を返します。

VB.NET
コードを隠すコードを選択
'環境変数「SESSIONNAME」の値を取得する
Dim sessionName As String = _
    System.Environment.GetEnvironmentVariable("SESSIONNAME")
If sessionName.StartsWith("RDP-") Then
    Console.WriteLine("リモートデスクトップ経由で実行されています")
Else
    Console.WriteLine( _
        "リモートデスクトップではないか、コンソールセッションです")
End If
C#
コードを隠すコードを選択
//環境変数「SESSIONNAME」の値を取得する
string sessionName = System.Environment.GetEnvironmentVariable("SESSIONNAME");
if (sessionName.StartsWith("RDP-"))
{
    Console.WriteLine("リモートデスクトップ経由で実行されています");
}
else
{
    Console.WriteLine(
        "リモートデスクトップではないか、コンソールセッションです");
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。