リモートデスクトッププロトコル(RDP)最新事情[その2]その知識、ホントに正しい? Windowsにまつわる都市伝説(29)

前回は、マイクロソフトがAndroidやiOS、Mac向けに提供している「Microsoft Remote Desktop」アプリが、RDP 8.0(の一部)に対応しているらしいという話をしました。今回は、RDPのバージョンなんて“あってないようなもの”というお話です。

» 2015年04月13日 05時00分 公開
[山市良テクニカルライター]
「Windowsにまつわる都市伝説」のインデックス

連載目次

Windowsでは対応しているRDPバージョンが明確に分かります

 「リモートデスクトッププロトコル(RDP)」の最初のバージョンは、Windows NT Server 4.0, Terminal Server Editionに搭載された「RDP 4.0」でした。この機能はWindows 2000以降、「ターミナルサービス」(現在のリモートデスクトップサービス)として、Windowsに統合されました。

 Windowsのバージョンによって、対応するRDPのバージョンは明確に決まっています。RDP 5.0以降は、以下の表1のWindowsに標準搭載されました。Windowsのバージョンの横にあるカッコ内の数字は、ビルド番号を含む詳細なバージョン番号になります。

Windowsのバージョン 搭載されたRDPのバージョン
Windows 2000(5.00.2195) RDP 5.0
Windows XP(5.1.2600) RDP 5.1
Windows Server 2003(5.2.3790) RDP 5.2
Windows Vista(6.0.6000) RDP 6.0
Windows Vista SP2/Server 2008 SP2(6.0.6002) RDP 6.1
Windows 7/Server 2008 R2(6.1.7600) RDP 7.0
Windows 7 SP1/Server 2008 R2 SP1(6.1.7601) RDP 7.1
Windows 8/Server 2012(6.2.9200) RDP 8.0
Windows 8.1/Server 2012 R2(6.3.9600) RDP 8.1
表1 Windowsのバージョンと搭載されたRDPのバージョン

 Windows 2000にはRDP 5.1、Windows XP/VistaにはRDP 7.0、Windows 7にはRDP 8.0およびRDP 8.1対応の「リモートデスクトップ接続クライアント」が更新プログラムによって提供されています。また、Windows 7に関しては、サーバー機能のRDP 8.0対応の更新が提供されています。更新された「リモートデスクトップ接続クライアント」(Mstsc.exe)の場合でも、そのバージョン情報を見れば、どのバージョンのRDPに対応しているかどうかが分かります(画面1)。

画面1 画面1 クライアントのRDPバージョンは、「リモートデスクトップ接続クライアント」(Mstsc.exe)のバージョン情報で確認できる

 Windowsだけであれば、対応しているRDPのバージョンで悩むことはありません。しかし、RDP対応クライアントはWindows以外にもあります。マイクロソフトが古いMac向けに提供していた「Remote Desktop Connection for Mac」(画面2)、古いLinuxに標準搭載されていたオープンソースの「rdesktop」(画面3)などがありました。先に言っておくと、Remote Desktop Connection for MacはRDP 6互換、rdesktopはRDP 5互換クライアントです。

画面2 画面2 「Remote Desktop Connection for Mac」は、Mac OS 10.6以前に対してマイクロソフトが提供していたRDP 6互換クライアント

画面3 画面3 Ubuntu 9.10に搭載されていた、RDP 5互換のrdesktopベースの「ターミナルサーバクライアント」。最近のUbuntuは、freerdp(xrdp)ベースの「Remminaリモートデスクトップクライアント」を搭載している

以前はクライアントのRDPバージョンを識別するこんな方法が使えました

 筆者は以前から、Windows以外を含むさまざまなクライアントのRDPバージョンを、リモートデスクトップ接続を受けるサーバー側から知る方法がないかを考えていました。そこで考え付いたのが、クライアントビルド番号による識別方法です。

 Windows Server 2008 R2 Service Pack(SP)1までは、リモートデスクトップサービスの管理ツールとして「リモートデスクトップサービスマネージャー」(旧称、ターミナルサービスマネージャー)というものがあり、リモートから接続中のユーザーセッションの詳細情報を表示することができました。この詳細情報に含まれる「クライアントビルド番号」の情報を、先ほど列挙したRDPバージョンに対応するビルド番号と付き合わせることで、WindowsのRDPバージョンを特定できると考えたのです。

 この方法は、Windows標準の「リモートデスクトップ接続クライアント」(Mstsc.exe)では有効です。次の画面4は、RDP 8.1にクライアントを更新したWindows 7 SP1から、Windows Server 2008 R2 SP1のリモートデスクトップセッションホストに接続した様子です。Windows 7 SP1のビルド番号「7601」ではなく、RDP 8.1に対応するWindows 8.1のビルド番号「9600」を示しています(画面4)。

画面4 画面4 Windows 7 SP1からのリモートデスクトップ接続の詳細情報。クライアントビルド番号が「9600」であることから、RDP 8.1であると推定

 筆者はこの方法を、Windows以外にも使える識別方法であるとずっと思っていました。なぜなら、RDP 5互換の「rdesktop」からの接続は、RDP 5.1のWindows XPと同じクライアントビルド番号「2600」を示したからです。しかし、さまざまなクライアントで調べてみると、筆者の法則はWindows以外には適用できないことが分かりました。

 例えば、RDP 7.1互換の「Remminaリモートデスクトップクライアント」は、クライアントビルド番号「2600」でした。RDP 6互換の「Remote Desktop Connection for Mac」はクライアントビルド番号「0」でした。RDP 8.0に対応していると思われるAndroid版の「Microsoft Remote Desktop」アプリは、クライアントビルド番号「0」でした。Mac版の「Microsoft Remote Desktop」アプリは、アプリのビルド番号(25377など)を示しました(画面5)。

画面5 画面5 Mac版の「Microsoft Remote Desktop」アプリのクライアントビルド番号は、アプリのビルド番号「25377」を示した。Android版のアプリのクライアントビルド番号は「0」

 なお、Windows Server 2012以降、管理ツールの「リモートデスクトップサービスマネージャー」スナップインは提供されなくなり、標準の方法でクライアントビルド番号を参照することはできなくなりました。セッション情報を取得するコマンドラインとして「query session」というものもありますが、詳細情報までは提供してくれません。

 筆者は「リモートデスクトップサービスマネージャー」スナップインの代替として、以下のサイトで公開されているWindows PowerShell用モジュールを利用しています。詳しい使用方法は説明しませんが、接続中のセッションのクライアントビルド番号を含む詳細情報を取得することができます。

サーバー機能のRDPバージョンの情報には誤りがあることも……

 ここでいったんクライアント側のRDPバージョンの話は置いておいて、サーバー側がサポートするRDPバージョンについて見てみましょう。サーバー側のRDPバージョンを識別できるツールとして、Windows Server 2008 R2 SP1以前は「リモートデスクトップセッションホストの構成」スナップインがありました。このスナップインを使用すると、接続名「RDP-Tcp」の「接続の種類」として、RDPのバージョン情報を知ることができます(画面6)。

画面6 画面6 「リモートデスクトップセッションホストの構成」スナップインが示すサーバー機能のRDPバージョン。実は、この情報、信頼できるものではない

 この情報は、レジストリの「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-TCP」キーにある値エントリ「WdName」のデータを表示しています。クライアントOSやWindows Server 2012以降は「リモートデスクトップセッションホストの構成」スナップインが提供されませんが、レジストリを参照することで情報を入手できます。

 しかし、この「Microsoft RDP X.X」の情報は信頼できるものではないようです。Windows 2000以降のOSでレジストリ値を調べてみると、以下の表2のようになります。

Windowsのバージョン RDPのバージョン
Windows 2000 Microsoft RDP 5.0
Windows XP Microsoft RDP 5.1
Windows Server 2003 Microsoft RDP 5.2
Windows Vista Microsoft RDP 6.0
Windows Vista SP2/Server 2008 SP2 Microsoft RDP 6.1
Windows 7/Server 2008 R2 Microsoft RDP 6.1(7.0であるべき)
Windows 7 SP1/Server 2008 R2 SP1 Microsoft RDP 7.1
Windows 8/Server 2012 Microsoft RDP 8.0
Windows 8.1/Server 2012 R2 Microsoft RDP 8.0(8.1であるべき)
表2 レジストリ値を基にしたWindowsのバージョンと対応するRDPのバージョン

 Windows 7/Server 2008 R2とWindows 8.1/Server 2012 R2は、明らかにバージョン情報が誤っています(画面7)。また、Windows 7 SP1は更新プログラムの適用とポリシーの設定により、サーバー機能をRDP 7.1からRDP 8.0に切り替えることができますが、RDP 8.0に切り替えたとしても「WdName」のデータは「Microsoft RDP 7.1」のままです。

画面7 画面7 「WdName」のデータは、実際のRDPバージョンを反映していない場合もある

[結論]RDPのバージョンはリモートデスクトップ接続では重要な情報ではない

 さて、長々と書いてきましたが、筆者が過去に考えたクライアントおよびサーバーのRDPバージョンの識別方法は、クライアントとサーバーの両方とも、信頼できる情報は得られないという結論に至りました。

 さらに調べを進めると、RDPのセッションはSMB(Server Message Block)とは異なり、バージョン情報をネゴシエートしないことが判明しました。RDPのネゴシエーションに関するプロトコル仕様は、以下のサイトにありました。

 このプロトコル仕様によると、RDPのバージョン番号はRDP接続のシーケンスで交換されてはいるようですが、それが「RDPのどのバージョンを使用するのかを決定するわけではない」とのことです。

 また、RDP接続のシーケンスで交換される情報の中にクライアントビルド番号も含まれますが、それは必須の情報ではなく、実装するベンダーが自由に設定しても構わないようです。RDP接続を確立するためのシーケンスでは、RDPバージョンではなく、使用可能なRDPの機能をネゴシエートしているのだそうです。

 世の中に存在するRDP対応クライアントの大部分がWindowsであった時代には、対応しているRDPバージョンで機能が利用できる/できないを判断できました。RDPクライアントがさまざまなプラットフォームに提供されるようになった今は、どの機能(例えば、「RemoteFX仮想GPU」や「デバイスリダイレクト」)を利用できるかどうか分かれば、それでいいのでしょうね。

「その知識、ホントに正しい? Windowsにまつわる都市伝説」バックナンバー

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。Microsoft MVP:Hyper-V(Oct 2008 - Sep 2015)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。