2011/06/13

リモート デスクトップ セッションの RDP バージョンを調べる方法 by PowerShell

リモート デスクトップ サービスやリモート デスクトップ接続、Microsoft VDI において、Remote Desktop Protocol (RDP) のバージョンは、機能やセキュリティの強度に関係してくるので重要です。Windows 標準の「リモート デスクトップ接続」(%Windir%\system32\mstsc.exe) の場合は、プログラムのバージョン情報やファイル バージョンを見れば、簡単に識別できます。Windows XP SP2 以降であれば、RDP 5.1 ~ 最新の RDP 7.1 (Windows 7 SP1 など) のいずれかのバージョンになります。

Linux で一般的な rdesktop など、RDP 互換ソフトウェアの場合、ソフトウェアのバージョンはわかっても、対応する RDP のバージョンはよくわかりません。そんなときは RDP セッションの接続を受けた側で確認することができます。 コマンドラインから確認できないものか悩んでいたのですが、PowerShell を使った方法を見つけました。


リモート デスクトップ サービスやターミナル サービスのコンポーネントがインストールされているサーバーや、RSAT for Windows 7 が利用可能であれば、「リモート デスクトップ サービス マネージャー」(%Windir%\system32\tsadmin.msc) を使用して、RDP-Tcp セッションの状態を参照することで、接続元の情報を参照できます。「クライアント ビルド番号」を見れば、RDP のバージョンがわかります。

RDP Ver  ビルド番号 (OS の例)
RDP 5.1   2600 (Windows XP SP2)
RDP 5.2   3790 (Windows Server 2003 SP1/sp2)
RDP 6.0   6000 (Windows Vista RTM、Windows XP+RDP 6.0)
RDP 6.1   6001 (Windows Vista SP1、Windows XP+RDP 6.1)
RDP 7.0   7600 (Windows 7、Windows Vista SP1+RDP 7.0、Windows XP+RDP 7.0)
RDP 7.1   7601 (Windows 7 SP1)


 「リモート デスクトップ サービス マネージャー」で参照できるクライアント情報を、WMI から取得できないか調べてみましたが、どうやらできないようです。リモート デスクトップ サービスのコマンドライン ツールとして QUERY SESSION や QUERY USER コマンドもありますが、ぼんやりとした情報しか提供してくれません。クライアントのビルド番号を含むクライアントの情報を取得するためには、WTSQuerySessionInformation というプログラミング用の API を利用するしかないようです。つまり、プログラミングなしで、コマンドラインやスクリプトからクライアント情報を取得するというのはできそうにないということです。私はプログラマーではないので、ちょっとしたことのために、そこまで手を出したくはありません。面倒です。

と思っていたところ、マイクロソフトの CodePlex に次の PowerShell モジュールを発見しました。

Terminal Services PowerShell Module 
http://psterminalservices.codeplex.com/

このモジュールをインストールして、PowerShell 環境にインポートすれば、目的を達成できます。例えば、クライアントのビルド番号は次のコマンドラインで取得できます。

PS> Import-Module PSTerminalServices
PS> $mysession = Get-TSCurrentSession
PS> $mysession.ClientBuildNumber
(その他のプロパティについては Get-TSCurrentSession | Get-Member で確認できます)

右のスクリーンショットは、Ubuntu 11.04 からの RDP セッションを調べたものです。ビルド番号が 2600 なので、RDP 5.1 相当だとわかります。なお、私の環境では Import-Module PSTerminalServices でエラーが出ましたが、無視しても使えています。

Terminal Services PowerShell Module は、Cassia.dll (Cassia は Terminal Services API にアクセスする .NET Library のオープンソース プロジェクト) を利用しています。Cassia.dll のソースコードも付いています。ちゃんと WTSQuerySessionInformation が使われていました。

2015/03/05 追記)
freerdp (RDP 7.1 RemoteFX vGPU 対応) のビルド番号は 2600、Remote Desktop client for Mac 2.1.1 は 0、Remote Desktop for Android 8.0.x/8.1.x は 0、Remote Desktop for Mac 8.0.13 は 25377 (アプリのビルド番号) だったので、Windows 以外はクライアント ビルド番号から調べるこの方法は NG でした。

1 件のコメント:

山市 良 さんのコメント...

Android/iOS/Mac 向けの Microsoft Remote Desktop アプリはクライアント ビルド番号が 0 なので、この方法では識別できませんでした。