RemoteApp の動作について

こんにちは。Windows テクノロジー サポートの大羽です。

Windows Server 2008 および Windows Server 2008 R2 に導入されている RemoteApp は

すでにお馴染みのことと思いますが、この RemoteApp の内部動作は意外と知られていません。

※別途設定が必要になりますが、実は Windows XP、Windows Vista、Windows 7 なども

  RemoteApp サーバーとして構築可能です。このあたりはまたいずれご紹介します。

今回は RemoteApp の内部動作に少しだけ触れてみたいと思います。

トラブル発生時など、詳細な調査を行う際に役立てていただければ幸いです。

RemoteApp は、リモート デスクトップ サービス コンポーネントの一つになりますので、

基本部分の動作はリモートデスクトップと同じです。

従いまして、ユーザー認証単位でセッションが管理され、アプリケーションの実体はサーバー側で

動作して、画像情報がクライアント側に送られます。

そのため、さもクライアント上で動作しているようにアプリケーションが動作するということになりますが、

このあたりの動作は基本的にリモートデスクトップと一緒です。

ただし、大きく異なっている点があります。それは「シェル」です。

Windows のシェルと言えば、勿論エクスプローラ (explorer.exe)ですが、RemoteApp では

エクスプローラが使われていません。

代わりに「RDPShell」というシェルが動作しています。

RemoteApp などのアプリケーションは、デスクトップ操作として比較して必要な処理は

限られているため、エクスプローラシェルのフル機能は必要ありません。

リソース面でもアプリケーション毎にエクスプローラを起動するのでは効率が良くありません。

実際、タスクマネージャでみると、explorer.exe は rdpshell.exe の 10 倍ほどの

リソースを使っています。

イメージ名                     PID メモリ使用量

========================= ======== ============

explorer.exe 852 45,460 K

rdpshell.exe 3704 4,880 K

※テスト環境での参考値

以上のようなことから、RemoteApp では RDPShell が採用されているわけですが、

実際にどのような動作となるのか、具体的に解説していきたいと思います。

RemoteApp にて、アプリケーションが起動される際の内部動作は、概ね以下のような動作となります。

1. クライアントより、mstsc.exe を経由して RemoteApp サーバーへ接続要求を行い

   TS RemoteApp セッションを確立します。

2. セッション作成後、サーバー上にて userinit.exe プロセスおよび RDPInit.exe

   プロセスが起動します。

   これらのプロセスは RemoteApp のシェルである RDPShelll.exe プロセスを

   管理するプロセスになります。

3. バーチャル チャンネルを介して RemoteApp のコミュニケーションが開始します。

4. RDPInit.exe プロセスがアプリケーションへのアクセス許可リストを確認し、

   許可リスト内にアプリケーションが存在している場合は、アプリケーションを

   起動します。

5. アプリケーションが起動し、アプリケーション ウインドウを作成します。

6. RDPShell プロセスは、そのアプリケーション ウインドウのオープン処理を

   フックして、ウインドウの情報をクライアントに送信します。

7. クライアントは受信したウインドウを表示します。

上記プロセス以外にも、バーチャルチャンネルを管理する rdpwd.sys やディスプレイ

ドライバである rdpdd.dll などのカーネル モード モジュールも動作しています。

RDPInit.exe プロセスは RDPShell.exe プロセスの起動や終了、異常終了時の再起動

などを管理して、常に RDPShell.exe プロセスの動作を監視するプロセスになります。

RDPShell.exe は VC (Virtual Channel)を RemoteApp クライアントと結び、

クライアント上で操作された各種イベントをフックして、アプリケーションに

伝達します。

簡単に説明しますとこのような動作となりますが、ポイントはアプリケーションや

アプリケーションを管理するプロセスは全て RemoteApp サーバー上で動作している

ということです。

クライアント上では、mstsc.exe プロセスが動作して、クライアントの操作をサーバーに

送ったり、サーバーからの画像情報をクライアント上に伝達する役割を担っています。

例えば、アプリケーションが異常終了した、といったときは、RemoteApp サーバー側で

アプリケーション自体のプロセス、RDPShell.exe プロセス、RDPInit.exe プロセスが

正しく動作しているかを確認し、異常終了している場合はメモリ ダンプなどから

調査を行います。

勿論、クライアント上の mstsc.exe プロセスに異常が発生する可能性もありますので、

Mstsc.exe が異常終了していないか確認する必要もありますが、mstsc.exe プロセス上では

アプリケーションの実体を管理していないので、アプリケーションの処理結果を示す

スタックはメモリ ダンプから見えません。

いずれにしてもそれぞれのプロセスの役割を正しく理解したうえで、調査を行う必要があります。

具体的な処理状況を確認したい場合は、以前ブログでご紹介しましたプロセスモニター

というツールで詳細な動作を確認いただけますので、RemoteApp アプリケーションの

起動動作や、終了動作など、色々と確認しておくと更に理解が深まるかと思います。

ご参考)

WS2008: Terminal Services RemoteApps

https://blogs.technet.com/askperf/archive/2008/02/22/ws2008-terminal-services-remoteapps.aspx

WS2008: Terminal Services Architecture

https://blogs.technet.com/askperf/archive/2008/02/14/ws2008-terminal-services-architecture.aspx

Process Monitor についての Tips

https://blogs.technet.com/askcorejp/archive/2010/01/29/process-monitor-tips.aspx