前回は、マイクロソフトがAndroidやiOS、Mac向けに提供している「Microsoft Remote Desktop」アプリが、RDP 8.0(の一部)に対応しているらしいという話をしました。今回は、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)。
Windowsだけであれば、対応しているRDPのバージョンで悩むことはありません。しかし、RDP対応クライアントはWindows以外にもあります。マイクロソフトが古いMac向けに提供していた「Remote Desktop Connection for Mac」(画面2)、古いLinuxに標準搭載されていたオープンソースの「rdesktop」(画面3)などがありました。先に言っておくと、Remote Desktop Connection for MacはRDP 6互換、rdesktopはRDP 5互換クライアントです。
筆者は以前から、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)。
筆者はこの方法を、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)。
なお、Windows Server 2012以降、管理ツールの「リモートデスクトップサービスマネージャー」スナップインは提供されなくなり、標準の方法でクライアントビルド番号を参照することはできなくなりました。セッション情報を取得するコマンドラインとして「query session」というものもありますが、詳細情報までは提供してくれません。
筆者は「リモートデスクトップサービスマネージャー」スナップインの代替として、以下のサイトで公開されているWindows PowerShell用モジュールを利用しています。詳しい使用方法は説明しませんが、接続中のセッションのクライアントビルド番号を含む詳細情報を取得することができます。
ここでいったんクライアント側のRDPバージョンの話は置いておいて、サーバー側がサポートするRDPバージョンについて見てみましょう。サーバー側のRDPバージョンを識別できるツールとして、Windows Server 2008 R2 SP1以前は「リモートデスクトップセッションホストの構成」スナップインがありました。このスナップインを使用すると、接続名「RDP-Tcp」の「接続の種類」として、RDPのバージョン情報を知ることができます(画面6)。
この情報は、レジストリの「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」のままです。
さて、長々と書いてきましたが、筆者が過去に考えたクライアントおよびサーバーのRDPバージョンの識別方法は、クライアントとサーバーの両方とも、信頼できる情報は得られないという結論に至りました。
さらに調べを進めると、RDPのセッションはSMB(Server Message Block)とは異なり、バージョン情報をネゴシエートしないことが判明しました。RDPのネゴシエーションに関するプロトコル仕様は、以下のサイトにありました。
このプロトコル仕様によると、RDPのバージョン番号はRDP接続のシーケンスで交換されてはいるようですが、それが「RDPのどのバージョンを使用するのかを決定するわけではない」とのことです。
また、RDP接続のシーケンスで交換される情報の中にクライアントビルド番号も含まれますが、それは必須の情報ではなく、実装するベンダーが自由に設定しても構わないようです。RDP接続を確立するためのシーケンスでは、RDPバージョンではなく、使用可能なRDPの機能をネゴシエートしているのだそうです。
世の中に存在するRDP対応クライアントの大部分がWindowsであった時代には、対応しているRDPバージョンで機能が利用できる/できないを判断できました。RDPクライアントがさまざまなプラットフォームに提供されるようになった今は、どの機能(例えば、「RemoteFX仮想GPU」や「デバイスリダイレクト」)を利用できるかどうか分かれば、それでいいのでしょうね。
岩手県花巻市在住。Microsoft MVP:Hyper-V(Oct 2008 - Sep 2015)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。
Copyright © ITmedia, Inc. All Rights Reserved.