ここでは、アプリケーションがRemote Desktop Protocol(RDP)を使用したリモートデスクトップサービス(ターミナルサービス)接続のクライアントセッションで実行されているか調べる方法を幾つか紹介します。
ここで紹介する方法は、基本的には、リモートセッションの場合に有効です。コンソールセッション(「/console」や「/admin」をオプションに指定してmstscを起動)の場合は、OS(mstscのバージョン)等によっては、正しく判断できないこともあるようです。(情報が不足していますので、情報をお持ちの方はコメントで報告していただけると助かります。)
なおここで紹介している内容は、「Detecting remote desktop connection」を参考にして書かせていただきました。
.NET Framework 2.0以降では、SystemInformation.TerminalServerSessionプロパティを使って判断することができます。
補足:SystemInformation.TerminalServerSessionプロパティは、後述するGetSystemMetricsを内部で使用しています。
If System.Windows.Forms.SystemInformation.TerminalServerSession Then Console.WriteLine("リモートデスクトップ経由で実行されています") Else Console.WriteLine("リモートデスクトップではありません") End If
if (System.Windows.Forms.SystemInformation.TerminalServerSession) { Console.WriteLine("リモートデスクトップ経由で実行されています"); } else { Console.WriteLine("リモートデスクトップではありません"); }
SystemInformation.TerminalServerSessionプロパティが使用できない時は、GetSystemMetrics functionを使用しても同じことができます。
<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
[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」は、リモートデスクトップクライアントセッションの時、「RDP-」で始まる文字列を返します。ただしコンソールセッションでは「Console」という文字列を返します。
'環境変数「SESSIONNAME」の値を取得する Dim sessionName As String = _ System.Environment.GetEnvironmentVariable("SESSIONNAME") If sessionName.StartsWith("RDP-") Then Console.WriteLine("リモートデスクトップ経由で実行されています") Else Console.WriteLine( _ "リモートデスクトップではないか、コンソールセッションです") End If
//環境変数「SESSIONNAME」の値を取得する string sessionName = System.Environment.GetEnvironmentVariable("SESSIONNAME"); if (sessionName.StartsWith("RDP-")) { Console.WriteLine("リモートデスクトップ経由で実行されています"); } else { Console.WriteLine( "リモートデスクトップではないか、コンソールセッションです"); }
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。