用于Windows 365 Link (预览版) 的安全进程外插件

简介

什么是远程桌面插件?

远程桌面插件是一种扩展或加载项,可增强Microsoft 远程桌面 (RDP) 客户端(通常在第三方应用程序中)的功能。 例如 ,Teams VDI 插件 ,旨在优化在虚拟化环境中运行时 Teams 的性能。 对于Windows 365 Link,这些插件必须符合本文档中详述的新体系结构。 如果表示需要远程桌面插件才能使用 Link 的 ISV,请 填写并提交此表单

此功能目前提供 公共预览版

什么是进程外远程桌面插件?

将传统 RDP 插件加载到与 RDP 客户端相同的进程中。 如下图所示,加载 RDPClientProcess.exe 不同的 RDP 插件 dll。 加载完成后,插件将成为 的一 RDPClientProcess.exe部分。 in process plugin model

在进程外模型中,

  1. RDP 客户端进程在进程外加载 RDP 插件,即作为独立于 RDP 客户端的独立进程和
  2. 通过使用 AppContainers 强制实施进程隔离,限制插件对更广泛的 Windows作系统的访问。

进程外插件加载体系结构

下图显示了 RDP 客户端如何与进程外模型中的 RDP 插件交互的高级说明。

进程外插件模型

  1. 可将 RDP 插件视为 COM 服务器,RDP 客户端是 COM 客户端。
  2. RDP 插件现在是在应用隔离中运行的独立进程。 RDPClientProcess.exe 使用 COM 的 CoCreateInstance API 加载插件。
  3. RDP 插件作者不必更改 dll 中存在的核心业务逻辑。 他们只需将插件打包为 MSIX。 因此,插件作者必须对 RDP 插件代码进行最少的更改。

实现详细信息

在 RDP 连接中使用插件时,涉及三方。

  1. 例如,RDP 客户端 (Windows App) 。
  2. RDP 插件。
  3. 为其编写插件的应用程序 (例如 Teams 应用程序) 。

例如,请考虑以下情况:用户使用 Azure 虚拟桌面连接到虚拟桌面并使用虚拟桌面中运行的 Teams 应用程序。 此处,Azure 虚拟桌面是 RDP 客户端 (客户端应用程序 ) ,Teams VDI 插件 是 RDP 插件,Teams 是虚拟桌面中运行的远程应用程序是服务器应用程序。

此处提供了一个完整的工作示例。 在此示例中,我们使用示例 RDP 客户端、RDP 插件和在远程虚拟机中运行的示例应用程序来详细介绍实现。

插件作者必须执行哪些作?

所有 RDP 插件都通过 COM 通信工作。 RDP 插件是 COM 服务器,RDP 客户端是 COM 客户端 (有关详细信息,请参阅 COM 客户端和 COM 服务器) 。 COM 客户端 (RDP 客户端) 和 COM 服务器 (RDP 插件) 都位于客户端计算机中。 插件作者需要完成两个main任务:

  1. 定义 在 tsvirtualchannels 文档中声明的接口的函数。 插件作者不需要定义每个单个函数,而只需定义正在使用的函数。
  2. 将 RDP 插件打包/分发为 MSIX。 目前,MSIX 是打包支持 应用隔离COM包标识的应用程序的唯一方法。 打包应用时,需要记住一些重要的详细信息。 此处的示例介绍了这些详细信息。

RDP 客户端必须执行哪些作?

在高级别上,RDP 客户端负责

  1. 发现 RDP 插件并将其加载到内存中。
  2. 实现客户端接口,例如 IWTSWindowInfoService

启动 RDP 客户端进程后,它应具有以下代码:

  1. 使用 AppExtensionCatalog::Open("com.microsoft.rdp.plugin.wtsplugin")发现插件。 有关详细信息,请参阅 应用扩展文档
  2. 获取发现的插件的 COM 类 ID。
  3. 使用 CoCreateInstance 创建插件工厂的 COM 对象,使用 RDP 插件本身) 中定义的插件工厂 CreatePluginAPI (创建实际插件。

RDP 服务器应用程序必须执行哪些作才能发送/接收数据?

服务器应用程序可以使用 WTSVirtualChannelOpenEx API 通过传递 WTS_CHANNEL_OPTION_DYNAMIC 标志,打开在客户端计算机中运行的 RDP 插件的动态虚拟通道。 此 API 在 RDP 客户端和服务器应用程序之间打开一个双工通道。

然后,它可以使用 WTSVirtualChannelWrite API 将数据写入虚拟通道,并同样使用 WTSVirtualChannelRead API 从通道读取数据。 打开此动态虚拟通道的先决条件是:

  1. RDP 客户端和服务器之间必须存在 RDP 连接
  2. RDP 插件必须已加载到客户端计算机中

使用/好了解的技术

由于以进程外方式创建和使用 RDP 插件需要了解多种技术,因此最好在继续实际 RDP 插件开发和使用之前对这些技术有一些基本的了解。

MSIX

MSIX 是 Microsoft 引入的新式 Windows 应用程序打包格式,用于取代传统的 EXE、MSI 和 AppX 安装程序。

AppContainer

运行时安全沙盒,它将其中正在运行的应用程序与系统的其余部分隔离开来,防止对资源、敏感数据和其他进程进行未经授权的访问。

包标识

分配给 AppContainer 应用程序的唯一标识符,它允许 Windows 强制实施安全策略、资源访问控制和应用程序隔离。 Windows 容器技术使用此标识作为主键来标识哪个应用程序具有哪些资源访问权限。

应用隔离

  1. 允许轻松开发的 AppContainers + 工具。 Windows 提供 应用程序功能探查器 等工具,可自动告知 应用程序的功能, 而不是通过查看代码手动查找它们。
  2. 在应用程序中提供 COM 功能,使应用程序作者可以声明其 COM 类供提供无缝互作的其他应用程序使用。

应用扩展

应用扩展类似于允许开发人员扩展现有应用程序功能的插件。

组件对象模型

应用程序能够以独立于平台的方式公开接口,而无需公开功能的“作方式”。 RDP 插件通过公开接口使用此模型与 RDP 客户端交互。

RDP 通道

RDP 通道是 RDP 插件与 RDP 服务器 ((如远程桌面服务主机) )之间的逻辑通信流。 它允许与常规 RDP 会话一起来回发送自定义数据(独立于屏幕、键盘或鼠标数据)。

动态虚拟通道

静态 (传统) 虚拟通道允许客户端和服务器组件之间通过main RDP 数据连接进行无损通信。 动态虚拟通道是一个改进的版本,但核心功能是相同的。

快速运行

COM 快速运行是 COM 服务器注册中的一项设置, (在此处搜索 COMGLB_FAST_RUNDOWN) 告知 Windows 如何处理进程外 COM 服务器的生存期。 具体而言,它允许 COM 运行时在没有更多客户端连接时主动终止服务器,从而加快 COM 关闭行为。 它最多可能需要 10 秒。

封送/取消封送

一种机制,用于在 COM 客户端和 COM 服务器之间跨地址空间(例如不同进程之间的)进程外通信期间传输数据/COM 对象。