概要
リモート デスクトップ プラグインとは
リモート デスクトップ プラグインは、Microsoft リモート デスクトップ (RDP) クライアント (通常はサード パーティ製アプリケーション) の機能を強化する拡張機能またはアドオンです。 たとえば、仮想化された環境で実行するときに Teams のパフォーマンスを最適化するように設計された Teams VDI プラグイン です。 Windows 365 Link、これらのプラグインは、このドキュメントで詳しく説明されている新しいアーキテクチャに準拠している必要があります。 Link を操作するためにリモート デスクトップ プラグインが必要な ISV を表す場合は、 このフォームに入力して送信してください。
この機能は パブリック プレビュー 段階です。
プロセス外のリモート デスクトップ プラグインとは
従来の RDP プラグインは、RDP クライアントと同じプロセスに読み込まれます。 次の図に示すように、 RDPClientProcess.exe は異なる RDP プラグイン dll を読み込みます。 読み込みが完了すると、プラグインは RDPClientProcess.exeの一部になります。
アウトプロセス モデルでは、
- RDP クライアント プロセスは、RDP プラグインをプロセス外に読み込みます。つまり、RDP クライアントとは別の独立したプロセスとして、
- AppContainers を使用してプロセスの分離を強制することで、プラグインのアクセスを広範な Windows オペレーティング システムに制限します。
プロセス外プラグインの読み込みアーキテクチャ
次の図は、RDP クライアントがアウトプロセス モデルの RDP プラグインと対話する方法の概要を示しています。
アウト
- RDP プラグインは COM サーバーと考えられ、RDP クライアントは COM クライアントと考えることができます。
- RDP プラグインは、アプリ分離で実行されている独立したプロセスになりました。 RDPClientProcess.exeloads は、COM の CoCreateInstance API を使用してプラグインを読み込みます。
- RDP プラグインの作成者は、dll に存在するコア ビジネス ロジックを変更する必要はありません。 プラグインを MSIX としてパッケージ化するだけで済みます。 そのため、プラグイン作成者は RDP プラグイン コードを最小限に変更する必要があります。
実装の詳細
RDP 接続でプラグインを使用する場合は、3 つの関係者が関与します。
- RDP クライアント (たとえば、Windows App)。
- RDP プラグイン。
- プラグインが書き込まれるアプリケーション ( Teams アプリケーションなど)。
たとえば、ユーザーが Azure Virtual Desktop を使用して仮想デスクトップに接続し、仮想デスクトップで実行されている Teams アプリケーションを使用する状況を考えてみましょう。 ここでは、Azure Virtual Desktop は RDP クライアント (クライアント アプリケーション)、 Teams VDI プラグイン は RDP プラグイン、Teams は仮想デスクトップで実行されているリモート アプリケーションがサーバー アプリケーションです。
ここでは完全な作業例 を示します。 この例では、RDP クライアントの例、RDP プラグイン、およびリモート仮想マシンで実行されているサンプル アプリケーションを使用して、実装の詳細について説明します。
プラグイン作成者は何をする必要がありますか?
すべての RDP プラグインは COM 通信を介して動作します。 RDP プラグインは COM サーバーであり、RDP クライアントは COM クライアントです (詳細については、「 COM クライアントと COM サーバー」を参照してください)。 COM クライアント (RDP クライアント) と COM サーバー (RDP プラグイン) の両方がクライアント コンピューターにあります。 プラグイン作成者が完了する必要がある主なタスクは 2 つあります。
- tsvirtualchannels ドキュメントで宣言されているインターフェイスの関数を定義します。 プラグイン作成者は、すべての関数を定義する必要はなく、使用中の関数のみを定義する必要があります。
- RDP プラグインを MSIX としてパッケージ化/配布します。 現在、MSIX は、 アプリの分離、 COM 、 パッケージ ID をサポートするアプリケーションをパッケージ化する唯一の方法です。 アプリのパッケージ化中に留意する必要がある重要な詳細がいくつかあります。 これらの詳細については、こちらの例を使用して説明 します。
RDP クライアントは何を行う必要がありますか?
大まかに言うと、RDP クライアントは
- RDP プラグインを検出してメモリに読み込みます。
-
IWTSWindowInfoServiceなどのクライアント側インターフェイスを実装します。
RDP クライアント プロセスが起動されると、次のコードが必要になります。
-
AppExtensionCatalog::Open("com.microsoft.rdp.plugin.wtsplugin")を使用してプラグインを検出します。 詳細については、 アプリ拡張機能のドキュメントを参照してください。 - 検出されたプラグインの COM クラス ID を取得します。
-
CoCreateInstance を使用してプラグイン ファクトリの COM オブジェクトを作成する プラグイン ファクトリの
CreatePluginAPI(RDP プラグイン自体で定義) を使用して実際のプラグインを作成します。
RDP サーバー アプリケーションは、データの送受信に何を行う必要がありますか?
サーバー アプリケーションは WTSVirtualChannelOpenEx API を使用して、 WTS_CHANNEL_OPTION_DYNAMIC フラグを渡すことによって、クライアント マシンで実行されている RDP プラグインに動的仮想チャネルを開くことができます。 この API は、RDP クライアントとサーバー アプリケーションの間で双方向チャネルを開きます。
その後、 WTSVirtualChannelWrite API を使用して仮想チャネルにデータを書き込み、 WTSVirtualChannelRead API を使用してチャネルから同様にデータを読み取ることができます。 この動的仮想チャネルを開く前提条件は次のとおりです。
- RDP クライアントとサーバーの間に RDP 接続が存在する必要があります
- RDP プラグインは、クライアント コンピューターに既に読み込まれている必要があります
使用されるテクノロジ/既知のテクノロジ
プロセス外の方法で RDP プラグインを作成して使用するには、いくつかのテクノロジに関する知識が必要であるため、実際の RDP プラグインの開発と使用に進む前に、これらの基本的な知識を持つ方がよいです。
MSIX
MSIX は、従来の EXE、MSI、AppX インストーラーを置き換えるために Microsoft によって導入された最新の Windows アプリケーション パッケージ形式です。
AppContainer
実行中のアプリケーションをシステムの残りの部分から分離し、リソース、機密データ、およびその他のプロセスへの未承認のアクセスを防ぐランタイム セキュリティ サンドボックス。
パッケージ ID
セキュリティ ポリシー、リソース アクセス制御、およびアプリケーションの分離を Windows が適用できるようにする AppContainer アプリケーションに割り当てられた一意の識別子。 Windows コンテナー テクノロジでは、この ID を主キーとして使用して、どのアプリケーションがどのリソース アクセスを持っているかを識別します。
アプリの分離
- AppContainers + 簡単な開発を可能にするツール。 Windows には 、アプリケーション機能プロファイラー などのツールが用意されており、コードを見て手動で見つけるのではなく 、アプリケーションの機能 を自動的に伝えます。
- アプリケーション内で COM 機能を提供します。これにより、アプリケーション作成者は、シームレスな相互運用機能を提供する他のアプリケーションによって使用される COM クラスを宣言できます。
アプリ拡張機能
アプリ拡張機能は、開発者が既存のアプリケーションの機能を拡張できるプラグインに似ています。
コンポーネント オブジェクト モデル
アプリケーションは、機能の "方法" を公開することなく、プラットフォームに依存しない方法でインターフェイスを公開できます。 RDP プラグインは、インターフェイスを公開することで、このモデルを使用して RDP クライアントと対話します。
RDP チャネル
RDP チャネルは、RDP プラグインと RDP サーバー (リモート デスクトップ サービス ホストなど) の間の論理通信ストリームです。 これにより、画面、キーボード、マウスのデータとは別に、カスタム データを通常の RDP セッションと共に送受信できます。
動的仮想チャネル
静的 (従来の) 仮想チャネルを使用すると、メインの RDP データ接続を介してクライアントコンポーネントとサーバー コンポーネント間のロスレス通信が可能になります。 動的仮想チャネルは改善されたバージョンですが、コア機能は同じです。
高速ランダウン
COM 高速実行は、プロセス外の COM サーバーの有効期間を処理する方法を Windows に指示する COM サーバー登録 ( COMGLB_FAST_RUNDOWNhere を検索) の設定です。 具体的には、クライアントが接続されなくなったときに、COM ランタイムがサーバーを積極的に終了できるようにすることで、COM シャットダウン動作を高速化できます。 それでも最大 10 秒かかる場合があります。
マーシャリング/アンマーシャリング
異なるプロセス間など、COM クライアントと COM サーバー間のプロセス外通信中にデータ/COM オブジェクトを転送するために使用されるメカニズム。