Windows 管理

使用终端服务部署应用程序

Greg Shields

 

概览:

  • RemoteApps 的优势
  • 使应用程序能够为用户所用
  • 评估终端服务实现
  • 确保积极的用户体验

目录

告别桌面,迎来 RemoteApps
从 Web 启动应用程序
从桌面启动应用程序
用户体验
RemoteApps = 可预测的性能
由您自行选择

您可以在 Internet 上以及当地书店里找到许多有关如何安装和使用终端服务的说明。但是它们中的大部分都对远程应用程序能够为用户带来哪些益处语焉不详。只需很少的操作,您就可以在您的环境中快速部署一台托管所需应用程序的终端服务器。但是要满足用户的期望,还必须要考虑一些其他情况。

如果您是终端服务器管理员,则需要撇开远程应用程序基础结构来考虑以下几点:打算如何部署应用程序?是否要为用户提供远程桌面或 TS RemoteApps?用户如何访问其应用程序,是通过静态远程桌面协议 (RDP) 文件、Web 页面还是桌面快捷方式?

最后,如何评估用户使用终端服务应用程序时的体验?由于在 Windows Server 2008 中对终端服务做了改进,所以现在有关这些重要问题的最佳答案可能会令您大吃一惊。

告别桌面,迎来 RemoteApps

Windows Server 2008 借助一组重要的服务和功能扩展,解决了终端服务管理中存在的诸多难题。在 2008 年 11 月的《TechNet 杂志》中,曾就其新增功能和改进功能进行过讨论,当时 Joshua Schnoll 详细介绍了改用 Windows Server 2008 所能获得的各种新功能(“通过增强的终端服务进行演示虚拟化”)。在这些功能中,最重要的可能是终端服务器不必再为用户部署完整桌面,现在可以部署单个应用程序。

这些单个应用程序被称为 TS RemoteApps,对于用户而言,这些应用程序就如同直接安装到用户本地桌面一样。当用户单击启动某个 RemoteApp 时,他在本地计算机上只能看到该应用程序本身。没有多余的“开始”菜单栏,也没有双重桌面,从而使您能够轻松与非本地系统进行交互。从实施和用户的期望判断,TS RemoteApp 可能要比部署一个完整桌面更具优势,原因很简单,就是它可以使这些应用程序看起来像是正常的本地桌面体验的一部分。

在 Windows Server 2008 中,使用“Administrative Tools”(管理工具)中的“TS RemoteApp Manager”(TS RemoteApp 管理器)控制台创建新 TS RemoteApp 的过程非常简单。单击“Actions”(操作)窗格中的“Add RemoteApp Programs”(添加 RemoteApp 程序)链接启动“RemoteApp Wizard”(RemoteApp 向导),此向导可查询终端服务器的 Windows Management Instrumentation (WMI) 存储区,以确定该服务器上已安装的潜在应用程序的列表。此列表的一个示例如图 1 所示。

图 1**“RemoteApp 向导”枚举终端服务器上已安装的应用程序**

从列表中选择希望创建为 RemoteApps 的应用程序,然后单击“Next”(下一步)。如果其中未包含所需的应用程序,可单击“Browse”(浏览)按钮定位其主 EXE 文件。这里所说的主 EXE 文件通常是指用来启动该应用程序的文件。完成向导后,即可开始部署您的远程应用程序。

如果右键单击查看新 RemoteApp 的属性,您就会发现有几个选项可以进行调整。除能够修改名称、位置、图标和别名信息以外,您还可以输入命令行参数。这对于那些启动时需要一组参数才能正常运行的应用程序来说非常方便,此外它还可以与某些应用程序结合使用来创建到远程内容的链接。

许多管理员可能没有立刻意识到,转移到 TS RemoteApps 并不仅仅意味着可以使应用程序呈现在用户的屏幕上。通过某些小技巧,您还可以使用 RemoteApps 自动启动预配置的内容。

例如,假设您希望为用户部署的不是应用程序,而是特定的文档。您可能不希望创建将用户链接到空白应用程序(例如 Microsoft Office Word 或 Access)的 RemoteApp,例如,您想将其链接到特定的 Word 文档或 Access 数据库。在这种情况下,您可以通过在应用程序的主 EXE 后面输入该文档的名称作为参数来达到此目的。因此,如果希望创建一个到基于 Access 2007 的 PTO(带薪休假)数据库的连接(该数据库存储在 \\fileServer\fileShare\CompanyPTO.accdb 下),只需创建一个名为 "PTO Database" 的新 RemoteApp 并输入该文档的位置作为命令行参数即可。现在,当用户双击启动 PTO Database 应用程序时,会自动连接到 Access 并已预加载了正确的数据库。

如您所见,创建到远程内容的连接是扩展 RemoteApps 实用性的另一种方式。但对于所有 RemoteApps 而言,您的用户仍然必须通过连接到图标的链接才能开始操作。在后续部分中,我将讨论在 Windows Server 2008 中使用终端服务完成这些工作的几种方法。

从 Web 启动应用程序

新的 TS Web Access 角色服务允许在预配置的网页中托管应用程序快捷方式。此角色服务将与环境中的终端服务器相集成,为用户提供一个可以查找并启动其应用程序的位置。图 2 显示了此网页呈现给用户的外观。

fig02.gif

图 2 TS Web Access 网页枚举已部署的 RemoteApps

要创建此类网页,可在现有 IIS 服务器上安装 TS Web Access 角色,然后将 TS Web Access 服务器的计算机帐户添加到域中的“TS Web Access Computers Global Group”(TS Web Access 计算机全局组)。请注意,对于一些小型环境,可以将 TS Web Access 安装到现有终端服务器上以实现单服务器解决方案。

完成 RemoteApp 安装后,可以在“TS RemoteApp Manager”(TS RemoteApp 管理器)中右键单击已配置的 RemoteApp,然后在 TS Web Access 中选择“Show”(显示)将其启用。使用远程桌面客户端 6.1 或更高版本的用户可以随后导航至 https://serverName/ts,以查看应用程序快捷方式的列表。单击任何出现的快捷方式都将自动启动 RemoteApp。

TS Web Access 是一种非常简单的方法,它可以为查找和启动应用程序提供友好的界面。如果应用程序或版本定期更改,这将会非常有用;更新网站仅涉及在 TS Web Access 中隐藏到旧有应用程序或版本的链接,然后在安装新应用程序或版本后显示其新链接。

但是,此工具也存在一些限制。首先,没有内置的机制来限制用户可以访问的应用程序。每个通过身份验证的用户都可以看到所有在终端服务器上创建的且在 TS Web Access 中设为可见的 RemoteApp。

第二个问题与用户通常采用的对应用程序的处理方式有关。在启动某个应用程序(例如 Word)时,您是否会经常通过单击该应用程序的快捷方式来启动?我敢打赌次数肯定不会太多。比较可能的方式是双击一个现有的 Word 文档来启动应用程序并预加载该文档。

遗憾的是,TS Web Access 并不支持这种启动应用程序的方式。对于那些习惯于双击文档来启动关联应用程序的用户而言,TS Web Access 可能不算是一种令人满意的解决方案。不过请不要担心,我们接下来将针对这种情况讨论另外一种更加有用的选项。

从桌面启动应用程序

对于那些希望通过双击文档来启动应用程序的用户,现在终端服务提供了将远程应用程序的链接“安装”到桌面的功能。此过程可将 RemoteApp 的 RDP 文件有效地封装到 Windows Installer 程序包(一个 MSI 文件)中,随后可将其安装到环境中的桌面上。

同时,安装的 MSI 可以修改桌面上的文件扩展名关联,以将双击的文件重新路由到终端服务器上与其关联的 RemoteApp。图 3 显示了在客户端系统上安装 Word RemoteApp 后,对文件扩展名关联所做的修改。此时,双击任何常见的 Word 文件扩展名都将会通过“远程桌面连接”启动 Word。

fig03.gif

图 3 修改为启动“远程桌面连接”的文件扩展名关联

要从现有的 RemoteApp 创建 Windows Installer 程序包,首先导航至“TS RemoteApp Manager”(TS RemoteApp 管理器)。右键单击所关注的 RemoteApp 并选择“Create Windows Installer Package”(创建 Windows Installer 程序包)。默认情况下,所有已创建的 Windows Installer 程序包都存储在 C:\Program Files\Packaged Programs 下,但可以利用 RemoteApp 向导来更改此位置。在向导中还可以配置将要托管 RemoteApp 的服务器的名称和端口以及服务器身份验证、证书设置和 TS 网关设置等。

安装到候选桌面后与应用程序位置相关的设置如图 4 所示。如您所见,快捷方式不但可以在桌面上创建,还可以在“开始”菜单文件夹中的某个位置创建。此屏幕中最重要的复选框是屏幕最下方的复选框。此复选框用于“取代”客户端设置,它会将与 RemoteApp 的所有文件扩展名关联从本地桌面重新关联到终端服务器。如果希望使用户能够通过双击文档来启动其 TS 托管的应用程序,必须选中此复选框。单击“Next”(下一步)和“Finish”(完成),结束此向导。

图 4 创建 Windows Installer 程序包可启用客户端文件扩展名的关联

很明显,使用桌面安装将用户连接到应用程序的优势在于它不需要改变用户的行为。应用程序安装完毕后,用户可以像以前一样通过双击文档来启动应用程序。

但是这种方法本身也存在着弊端,那就是需要执行额外的桌面管理工作。以这种方式使用的每个 RemoteApp 在每个需要访问的桌面上都必须执行安装。虽然此过程可通过“组策略软件安装”(稍后会进行讨论)加以简化,但它仍然增加了管理负担。而且,当应用程序更改时,很可能每个桌面上安装的 RemoteApps 也需要更新。

创建了 Windows Installer 程序包后,通过“组策略软件安装”来安装此程序包的过程并不复杂。首先,创建一个可供组策略访问的文件共享。在单一终端服务器方案中用于此文件共享的理想位置可能当属终端服务器上默认的 C:\Program Files\Packaged Programs 文件夹。确保已为该文件夹和共享分配了适当的权限,以便客户端能够在“组策略”处理过程中访问该共享。然后,创建新的组策略对象 (GPO) 并导航至“Computer Configuration”(计算机配置) | “Policies”(策略) | “Software Settings”(软件设置) | “Software installation”(软件安装)。右键单击“Software installation”(软件安装),选择“New”(新建) | “Package”(程序包)。在出现的对话框中,定位针对 RemoteApp 创建的 MSI 文件。在询问部署方法时,选择“Advanced”(高级)。

此时您可以进行选择。RemoteApps 的安装程序非常小,只会在 C:\Program Files\RemotePackages 文件夹中安装 RDP 文件和图标,因此您可能希望选择此选项以便在超出管理范围时“卸载”此应用程序。选择此选项后,每次删除 GPO 时或计算机被移动到 GPO 不再适用的新 OU 时,RemoteApp 都会自动从计算机中移除。启用此选项可以在计算机和应用程序移入或移出管理范围时简化 RemoteApp 的移除过程。

用户体验

通过这些机制中的任意一种来部署应用程序都非常出色,但终端服务管理毕竟不仅仅局限于创建和部署应用程序。确保您的实现能够满足用户需求也同样重要。在任何有关应用程序交付的讨论中,考虑主观性能指标以捕捉用户体验的质量都至关重要。尽管很难使用硬性指标进行量化,但有效的终端服务部署必须考虑将用户的总体满意度作为定义成功的量度。

例如,在某些情况下用户可能会觉得很麻烦,特别是当多人共享同一服务器上的资源时。使用终端服务时,多个用户需要挤在单一服务器上共享该服务器中安装的应用程序。将大量用户汇集到少数几台服务器上可以减少应用程序的数量,从而简化应用程序的管理。需要管理的应用程序越少,意味着所需的修补程序越少、环境更容易控制,而且管理难点也会更少。

这种对用户的整合需要终端服务器管理员担当起系统维护者的角色。经验丰富的管理员可以通过观察用户在系统中的行为并主动制定应对措施来管理终端服务器场。通过进行重新配置和锁定防范等更改,可确保单个用户的不当行为不会影响其他用户的体验。

例如,有经验的终端服务器管理员会配置性能警报,以便在处理器利用率向上攀升并维持在非常高的水平时得到通知。这种行为通常表明某个进程独占了处理器,或者某个用户启动的操作占用了共享系统中过多的资源。跟踪并结束这种恶意进程只是解决此类事件的第一步。找出此类进程出现的原因才是根治这种问题的长期解决方案。

在这种情况下,应该要确保远程应用程序至少能够像在本地桌面上执行一样。侧栏“重要的终端服务性能计数器”显示了一些可帮助您了解性能情况的 PerfMon 指标。

RemoteApps = 可预测的性能

RemoteApp 是有效的终端服务会话,其中会话的宽度和高度均与待启动应用程序的完全相同。其结果是远程应用程序看起来像本地应用程序一样,因为会话的边界永远不会扩展到应用程序自身的边界以外。

Microsoft 实现的 RemoteApps 实际上要比前面所述智能得多。从启动和运行时所需资源的角度来看,部署的 RemoteApp 与部署的完整桌面并不相同。启动远程桌面需要使用 explorer.exe 的实例来操作桌面外壳程序以及所有配置为与 explorer.exe 一同启动的进程,例如系统托盘应用程序、帮助应用程序或者随标准桌面启动的任何服务或进程。

相比而言,RemoteApp 的启动不需要完整的 explorer.exe 外壳或所有加载项。事实上,RemoteApp 使用另外两个进程(rdpshell.exe 和 rdpinit.exe)取代了 explorer.exe。这两个简化的进程将作为替代外壳和外壳登录应用程序运行,用于启动 RemoteApp。

图 5 显示了终端服务器的简化示例,其中有两位用户连接并启动了计算器应用程序。User1 通过完整桌面登录,而 User2 连接到预先创建的 RemoteApp 实例 calc.exe。尽管您会发现 User2 启动 calc RemoteApp 所需运行的进程数相比要多一些,但这些进程所使用的内存总量却要比 User1 的资源管理器外壳所使用的内存少,如图 6 所示。

fig05.gif

图 5 任务管理器显示桌面和 RemoteApps 所用资源的差别

图 6 内存使用情况示例
运行的进程 User1–完整桌面 User2–RemoteApp
Explorer.exe 7064KB 不适用
Tasking.exe 1792KB 1704KB
Dwm.exe 588KB 516KB
Rdpclip.exe 1032KB 908KB
Calc.exe 648KB 716KB
Rdpinit.exe 不适用 860KB
Rdpshell.exe 不适用 828KB
总计 11124K 5532KB

这种减少的 RAM 消耗只是性能讨论的一部分。此外还必须考虑用户行为对处理器使用的影响。在为某个用户部署了完整桌面后,他将会获得运行终端服务器上所有已安装应用程序的能力。

如果没有适当的锁定防范,利用终端服务在 Word 中编写文档的轻量级用户可以随时通过启动另一个功能更为强大且需要更多资源的应用程序而变为重量级用户。这种行为的不可预见性使得为每位用户规划资源的工作变得极具挑战性。它还会使终端服务器的管理变得更加复杂,从而增大了因单个用户的行为而影响其他用户体验的可能性。

Internet Explorer 可能就是这种不可预见性的最好示例。在 Windows Server 的每个实例上都安装有此应用程序,而且运行它通常不需要太多资源。但是,当使用 Internet Explorer 来呈现一个需要很多插件且编写得非常糟糕的网站时,其资源使用会大幅增加。如果某个用户在桌面会话中不小心运行了 Internet Explorer,可能会意外耗尽终端服务器上的可用资源,从而导致其他用户程序性能降低。

与完整桌面相比,RemoteApps 的结构在资源使用方面更具可预测性。启动 RemoteApp 的用户只能使用特定的应用程序以及初始应用程序关联的其他应用程序。因此,从性能方面对用户的行为更容易预测。

由您自行选择

本文的最终目标是使您能够了解为用户部署远程应用程序时可以选择的选项。在 Windows Server 2008 中,其终端服务所具有的新功能可以为用户连接到应用程序提供多种途径。桌面托管的与 Web 托管的某种组合加上完整桌面与 RemoteApp 的对比将能够为您的特殊环境提供正确的配置。

重要的终端服务性能计数器

尽管衡量用户体验通常是一种主观性的活动,它涉及的主要是个人感觉而非客观指标,但也有一些非常有用的性能计数器,其测量指标可以帮助您确定终端服务器的性能,而这些性能将会影响到用户的满意度。您应考虑在终端服务器上测量以下计数器:

Memory\Available MBytes 如果此计数器减小到很小的值,则表示终端服务器上的进程正在消耗大部分可用物理内存。虽然较低的数值不一定不好,但当其与较高的线程数和较高的 pages/sec 一同出现时,较低的数值可能表示有过多的用户正试图在一台服务器上执行过多的任务。

Memory\Pages/Sec 此计数器与磁盘从内存读取数据或从内存向磁盘写入数据的速率相关。如果此处的计数值较高且与较低的 Available MBytes 计数值同时出现,则可能表示可用内存不足,无法承担服务器上加载的任务,并因而导致用户体验不佳。

Processor\% Processor Time 此计数器可明确地显示出生产性工作正在使用的处理器数量。您应当密切关注此指标,尤其是在多处理器系统中,因为它可以指出处于挂起或峰值状态的处理器。

System\Threads 服务器运行的每个进程都由多个线程组成。Threads 计数器是一个整数,表示系统上所有进程的总和。终端服务器通常具有较高的线程和进程计数,因为会有许多用户同时使用系统资源。当此计数值很高时,有理由假定有大量活动正试图同时在服务器上执行。较高的线程计数通常会导致较高的 Context Switches 计数,因为服务器会尝试处理每个进程的需求。

System\Context Switches/Sec “Context Switch”(上下文切换)发生在处理器每次更改其当前处理的线程时。每次上下文切换都会产生轻微的负荷,所以此处较高的计数(伴随较高的线程计数)可能表示许多用户正试图同时执行大量任务。

System\Processor Queue Length 当处理器无法承担所有负荷时,请求将开始排队。用于该队列的计数器称为 Processor Queue Length。当此计数器的值很高时,可以假定服务器的处理器无法处理所有请求,这可能同时也表明会对用户体验的影响。

Terminal Services\Active Sessions 和 Terminal Services\Total Sessions 这两项指标有助于高效评估相对于终端服务器上正在工作的用户数量而言资源的使用情况。第一个计数器衡量正在处理会话的用户,而第二个计数器则包括处于空闲状态或已经断开连接的用户。这两个计数器与其他计数器相结合将有助于确定您的服务器在超负荷运行并导致用户体验受到影响之前,能够处理的最大用户数量。

您看到的实际数量将取决于您的硬件组成、所安装的应用程序以及系统中用户的数量和类型。因此,如果提供精确的数值作为阈值可能会让人产生误解。相反,当您的指标与正常操作时的指标相差很大时,您应查看您自己的数量或时间的变化,并将其作为确定用户体验何时变差的第一手资料。

Greg Shields 是一名 MVP,他同时还是 Concentrated Technology 公司的共同创始人和 IT 专家。他的新书《Windows Server 2008: What's New/What's Changed》(Windows Server 2008:新增功能和改进功能)由 SAPIEN 出版社出版。您可以通过 www.ConcentratedTech.com 与 Greg 取得联系。