 TechNet Magazine November 2007

TechNet Magazine November 2007

Windows 管理: Windows Vista 中脱机文件的更改

如何让用户在连接不稳定或无连接时使用存储在网络上的文件，同时又避免版本控制问题？这是一个常见问题。这种连续性是提供无缝体验的基础。了解 Windows Vista 中的改进功能如何提供使用脱机文件的更好方法。

Jeremy Moskowitz 桌面部署: 使用 BDD 2007 进行简单的可伸缩部署

尚未安装 SMS 2003？不用担心，有另外一种创建简单桌面部署的解决方案。本文是一个深入指南，介绍如何使用 BDD 2007 和 SQL Server 创建只需极少或根本不需要手动输入的可伸缩部署。

Adam Shepherd 通信: Microsoft 的 Exchange 边缘传输服务器：第二部分

Exchange 边缘传输服务器可以帮助您创建更可靠和更安全的邮件环境。在第一部分中我们向您展示了如何配置这些服务器，现在我们将向您介绍主要功能如何帮助改进邮件环境的一些详细示例。

Kay Unkroth 联网: 使用 ISA Server 2006 配置 VPN 远程访问

虚拟专用网络可以改进连接性并提高工作效率，而且实施和管理起来也很容易。了解如何使用 ISA Server 2006 来提供两种常见 VPN 方案。

Alan Maddison SQL Server: 优化 SQL Server 查询性能

优化数据库性能时，优化个人查询与优化服务器硬件和软件配置同等重要。只要一个查询失控，就可能使数据库失败。这里提供了一个生成、分析和调整执行计划以优化 SQL Server 查询性能的指南。

Maciej Pilecki 编辑视角: 为您增添能源

Joshua Hoffman 工具箱: 面向 IT 专业人员的新产品

Greg Steen Exchange Queue & A: 保护电子邮件协议的安全、神秘垃圾邮件及更多内容

在本月的内容中，Exchange 团队将讨论 SMTP 的传输层安全性、防止欺骗性 NDR 阻塞队列的方法和解决各种安装难题的方法。

Nino Bilic and Scott Landry 实用工具特别推荐: 适用于 Windows PowerShell 的 SMS Cmdlet

了解您如何着手使用 Windows PowerShell cmdlet 从命令行管理 SMS 2003 客户端。

Don Brown 网络专家: 无线单一登录

单一登录为最终用户和管理员带来了很多好处。下面将介绍单一登录如何简化网络无线身份验证的实施。

Joseph Davies 研究说明: 使用高性能计算与 HIV 对抗

看一看 Microsoft Research 的 eScience 团队如何与医学研究人员合作，使用高性能计算来帮助寻求 HIV 的治疗方法。

Kristin Firth and Mia Matusow Windows PowerShell: 编写正则表达式

使用正确编写的正则表达式，Windows PowerShell 脚本可确定数据是否符合有效格式。大致了解如何在 Windows PowerShell 中使用正则表达式。

Don Jones 您好，脚本专家！: 来自 Grave 之外的桌面管理

脚本专家演示如何使用 Windows 远程管理检索远程计算机上类的属性和实例。噢，还有一个有趣的迷题。

The Microsoft Scripting Guys 安全观察: 安全的随处访问技术

探索使用终端服务组件的随处访问解决方案的网络和安全设计注意事项，并了解使用 Windows Server 2008 创建解决方案的一些实用方法和最佳实践。

John Morello 桌面文件: 碎片整理原理

由于对碎片整理缺陷存在误解，许多管理员并不执行这项重要的维护任务。了解哪些问题真实存在，哪些不可能发生，以及如何避免这些问题。

Wes Miller 现场注意事项: 行为鳕鱼

当社区成员开始活动时，您所需的也许仅是“一条大鱼”。让我们来了解一下社会管理如何帮助维护 Live QnA。

Betsy Aoki Windows 机密: 文件系统 Paradox

您是否曾想过为什么要为那些关键启动文件构建小型文件系统驱动程序？

Raymond Chen


 Windows 管理: Windows Vista 中脱机文件的更改
Windows 管理 Jeremy Moskowitz

Windows Vista 中脱机文件的更改
概览:
  • 联机和脱机连续性
  • 文件可用性
  • 脱机文件夹的演变过程

桌面管理的一个难题是使脱机用户像处于联机状态时一样工作。该需求的重要性远超出您的想象 — 即使仅与五年前相比，用户现在具有的移动能力也还是要强很多倍。尽管在很多情况下还是需要脱机工作，
但是最常见的三种情况是：当便携式计算机与办公室网络断开并准备在路上使用时；当连接到慢速或断续链路时；以及当分支机构和总部断开连接时。
在这些情况下，如何在将原始文件保留在主服务器上的同时在脱机计算机上保留文件的副本？更为重要的是，如果办公室中的某人更改了服务器上的文件，而其他人在路途上也对此文件做了更改，如何处理冲突？幸运的是，内置于 Windows® 2000、Windows XP 和 Windows Vista® 中的脱机文件引擎可以处理这些问题。

答案是缓存
脱机文件引擎确实是强大的缓存机器。实际上，在私下里（和 Microsoft 内部），它被称为“客户端缓存”(CSC)。脱机文件引擎具有足够的可配置性和灵活性，以便允许用户决定缓存哪些内容，还可以帮助用户让系统缓存所需的内容。它允许在脱机时访问与联机时相同的文件，并且不更改命名空间。也就是说，无论联机工作还是脱机工作，访问文件时使用的是相同的 UNC 路径或驱动器号。
可以将文件设置为手动缓存或自动缓存。如果知道经常要在路上使用特定的文件或文件夹，则可以仅指定某个文件或文件夹与您一起旅行。为此，Windows XP 用户可右键单击存储在本地或网络共享上的文件，然后选择使文件可以脱机使用的选项（请参见图 1）。在 Windows Vista 中，该选项称为“始终脱机可用”。手动使文件脱机时可用有时可称为“固定文件”。
图 1 使文件脱机时可用
图 1 使文件脱机时可用
图 1a 脱机文件文件夹
图 1a 脱机文件文件夹
可通过 UNC 路径连接正在使用的共享或者使用驱动器号映射它。实际上，文件甚至不一定是存储在运行 Windows Server® 的计算机上的文件。它可以位于任何执行 SMB（服务器消息块）协议的计算机上，如遵守 SMB 协议的 Samba 服务器或 NAS 设备（有极少的例外）。
首次选择固定文件时，Windows XP 将显示一系列向导屏幕，询问何时同步。如果在每个屏幕上单击“下一步”并采用默认值，则会在每次登录或注销时进行同步以及在空闲状态下后台进行同步。向导完成后，会出现一个图标更改，指示文件现在可脱机使用。
一旦与网络断开连接，除了已选择脱机使用的文件之外，在共享上的所有其他文件都将不可用。但是，有时也会出现问题：该图标显示哪些文件始终脱机可用，但要到断开连接之后才会清楚并非其他所有文件都可用。下文将对此进行详细讨论。
手动使文件在脱机时可用有其优点，但有时以较为自动的方式使文件脱机时可用更有意义。接下来，我将探讨此情况，使用通常所称的“自动缓存”。

自动缓存优于手动缓存的情况
自动缓存是在服务器上对逐个共享进行设置的。所以，如果您有一个称为 Sales 的共享，并希望销售人员在旅行时携带文件，则可以指示 CSC 引擎执行这样的操作。图 2 显示了在 Windows Server 2003 中单击“缓存”选项卡后出现的“脱机设置”对话框。图 3 对设置进行了说明。
Figure 3 自动缓存设置 (Close Figure 3)

设置 | 说明
只有用户指定的文件和程序才能在脱机状态下可用。 | 允许用户手动指定在脱机状态下可用的文件。该选项是默认选项。
用户从该共享打开的所有文件和程序将自动在脱机状态下可用。 | 允许自动缓存 Windows 资源管理器打开的所有文件和程序。缓存程序而非文档时，会使用优化性能设置，但通常这对性能不起作用，大多数情况下可以放心地将其忽略。Windows Vista 已完全将其忽略。
共享上的文件或程序将在脱机状态下不可用。 | 在 Windows 2000、Windows XP 或 Windows Vista 客户端上使用时，阻止用户访问脱机时可用的项目。
图 2 Windows Server 2003 中的“脱机设置”对话框
图 2 Windows Server 2003 中的“脱机设置”对话框
若要了解自动缓存的工作原理，让我们假设您有一个包含 10 个文件（Sales01.txt 到 Sales10.txt）的 Sales 共享，并且已启用了“用户从该共享打开的所有文件和程序将自动在脱机状态下可用”设置。不会立即显示结果。对于用户来说，更多的文件突然可以在脱机时可用没有外部标志。另外，只有 Windows 打开过（之后发生缓存）的文件才可在以后脱机时可用。简言之，在与网络断开连接之前，必须在联机时实际打开过要在脱机时使用的文件。否则，在脱机状态下无法使用这些文件。
此外，自动缓存的文件不一定永远存在于缓存中。Windows XP 和 Windows Vista 处理此临时空间的方式有些不同，但关键是可以根据空间限制驱逐文件。文件是按使用情况保存的。那些在一段时间内未打开的文件会被驱逐，以便为已经打开的新文件腾出空间。所以，虽然最近使用的某个文件很可能仍存在于缓存中，但不要认为自动缓存可确保文件可用。如果要确保某个文件可用，则需要固定该文件。作为管理员，您还可以使用组策略，并利用以管理方式分配的脱机文件设置来固定文件。
让我们看一个实际的工作示例。假设 Windows XP 用户 EastSalesUser1 打开了文件 Sales05.txt，并且 Windows Vista 用户 EastSalesUser2 在 \\server\sales 共享上打开了文件 Sales05.txt。
由于已经在 Sales 共享上设置了自动缓存，因此当 EastSalesUser1（在 Windows XP 上）和 EastSalesUser2（在 Windows Vista 上）脱机时，仍然可以使用这些文件。Windows 已将这些文件的副本存储在了脱机文件缓存中。但是，用户仍未使用的其他文件呢？
Windows XP 和 Windows Vista 对留在办公室的文件有不同的反应，如图 4 和 5 所示。Windows XP 甚至不指示存在没有缓存的文件。脱机时，这些文件的消失会使人非常困惑。与之相反，Windows Vista 包含图标覆盖，对未缓存的文件显示浅灰色的 X。这对于显示在脱机时可用的文件是一个巨大的飞跃。唯一的问题是仅在断开连接后才能看到它，而在联机过程中看不到。所以，使文件状态更为明确将是一项非常受欢迎的补充。
图 4 脱机后，Windows XP 仅显示可用文件
图 4 脱机后，Windows XP 仅显示可用文件
图 5 而 Windows Vista 在脱机时显示不可用的文件
图 5 而 Windows Vista 在脱机时显示不可用的文件

可用或不可用
正是由于可能出现混淆，某些管理员对利用脱机文件犹豫不决：在脱机时，哪些文件肯定可用，哪些不可用，以及如何区分。在图 5 中，出现在 sales01.txt 上的绿色圆形图标指示该文件保证可用（再说一次，文件固定后，该文件保证可以脱机使用）。
但是，如上所述，Windows XP 和 Windows Vista 通过自动缓存设置为脱机时可用的 Sales05.txt 文件不一定在脱机时可用。请记住，只有打开过的文件才会在脱机时可用。因此，如果系统指示文件临时或可能脱机可用会更好。因为没有加以区分的图标，所以确定哪些文件在脱机时可用容易把人搞糊涂。Windows Vista 的 UI 比较好，但仍需要敏锐的眼光观察。Windows Vista 中名为“脱机可用性”的 Explorer 属性提供了可用性信息。选定项目后，在预览窗格中会显示该属性。如果项目已固定，则其值为“始终可用”。如果该项目没有固定，但已缓存，则其值为“可用”。
对于 Windows XP 和 Windows Vista 来说，处理临时可用的脱机文件的思路是相似的，但实现上略有差异。图 6 显示了 Windows XP 和 Windows Vista 如何处理脱机文件。
图 6 Windows XP 和 Windows Vista 脱机文件区域
图 6 Windows XP 和 Windows Vista 脱机文件区域
简单地说，Windows XP 和 Windows Vista 都有一个存储脱机文件的位置，但是，对于这两种操作系统，始终脱机可用文件和临时脱机可用文件的存储方式存在细微差异。
对于 Windows XP 来说，始终脱机可用的文件（由图标更改指示，如图 1 中所示）放置在永远存放这些文件的位置。如果手动固定 10GB 的文件，从而使其始终脱机可用，则整个 10GB 将始终可用。不存在对用户可固定的文件数量的限制（只要不超过最大分区大小）。但是，Windows XP 最多只能有 2GB 的空间供自动缓存文件使用。这个思路是只有经常打开的文件存储在此处，必要时将除去那些已有一段时间未使用的文件。默认情况下，临时可用缓存占硬盘驱动器上可用空间的 10％，如图 7 所示。只有 Windows XP 上的管理员可以使用此设置。
图 7 在 Windows XP 中设置脱机文件的磁盘空间
图 7 在 Windows XP 中设置脱机文件的磁盘空间
Windows Vista 也可以永久或临时存储文件。不过，二者也有不同。临时文件缓存包含在整个缓存中。默认情况下，将整个缓存（临时文件和始终脱机可用文件）空间限制为硬盘驱动器上可用空间的 25％。所占空间之所以发生改变，是因为在 Windows XP 中用户可以不断手动保存缓存文件（可能数十亿字节），从而可能用尽硬盘驱动器空间。使用此新方案，管理员可留出特定磁盘空间来容纳整个缓存，从而防止此情况的发生。看图 8 时，请注意驱动器上可用空间的 25％ 显示为整个驱动器空间的 15.2％，这有点令人费解。还请注意，设置临时空间的第二个滑块的值永远不能高于设置所有脱机文件最大空间的第一个滑块的值。通过单击“更改限制”选项，可访问这些脱机文件磁盘使用量限制滑块，但请注意，执行此操作需要提供管理员凭据。
图 8 Windows Vista 中脱机文件的可用空间
图 8 Windows Vista 中脱机文件的可用空间

防止过多的缓存
文件夹重定向是 Windows 的又一功能，它确保一般位于计算机上的某些重要文件夹实际上是存储在服务器上的。也就是说本地计算机瘫痪不会影响到其中的文件，因为您已经将重要文件的副本存储在了网络共享上。
假设您已重定向“我的文档”文件夹（在 Windows XP 中）或者“文档”文件夹（在 Windows Vista 中）。在此情况下（事实上，在任何文件夹重定向后），操作系统将认为您始终希望在脱机时可以使用这些文件，并且重定向文件夹中的每个文件都会有一个图 1 中所示的符号。其缺点是，如果在连接良好、始终在线的网络上工作，要漫游到新的计算机上，即使只需要使用一段时间，也必须在新计算机上缓存整个重定向文件夹的内容。这不仅浪费了空间，处理不当还会带来安全风险。
在使用 Windows 资源管理器浏览共享上的文件时，也会发生文件的自动和无意缓存。假设仅使用资源管理器在网络共享上查看许多图形文件，并且自动缓存处于开启状态，那么这些文件很可能自动下载并置于缓存中。这是因为使用资源管理器打开文件几乎相当于将其置于临时脱机缓存中。通常，共享中的每个文件都会打开，以获取诸如文件大小或图像预览之类的元数据。如果在快速、连接良好的链接上执行此操作，这并非难事。Windows 会快速平缓地缓存文件以供以后使用。但是，如果是通过慢速链接连接到网络共享并进行自动缓存，情况就真的糟糕了。默认情况下，Windows XP 资源管理器和 Windows Vista 资源管理器都存在这种问题。但值得高兴的是，用户可以训练 Windows Vista 脱机缓存引擎，使它能更好地识别慢速链接。

具有组策略的脱机文件
对 Windows Vista 脱机文件的主要更改
脱机文件团队成员希望您了解其最得意的更改，但本文篇幅有限，无法探讨所有这些更改。所以仅在这里简单地说一下，下面的更改是脱机文件中的主要更改：
  1. 无缝的脱机到联机转换，意味着打开的句柄不再阻碍转换。
  2. 以文件为单位脱机，这样一个共享脱机时不会再使整个服务器脱机。
  3. 通过 Windows 资源管理器中的联机工作\脱机工作按钮的强制脱机模式。
  4. 按用户对缓存内容加密。
  5. 可更快检测并分析更改的新同步引擎。
  6. 与 Windows 搜索集成，以便对重定向文件夹编制索引。
  7. 本地到远程同步可使用差别位图转移功能。
  8. 通过同步中心延迟冲突解决。
  9. 通知区域气球图标消失，不再干扰用户。
  10. 提供可供管理使用的全面的新 COM API 和 WMI 支持，存档在 MSDN® 上，网址是：msdn2.microsoft.com/bb530662。
  11. 通过 WMI 提供程序的脚本支持（很快就将存档在 MSDN 上）。
  12. 新外壳项目属性：脱机状态和脱机可用性。
  13. 建立映像以在脱机时表示不可用命名空间元素。资源管理器将其显示为带有灰色 X 覆盖的灰色项目，以便在从联机转换到脱机时帮助避免外壳文件夹视图发生显著更改。
  14. 新的控制面板小程序。
如果决定要了解更多信息，请参考我的著作和 Microsoft 文档。

如上所述，每次用户（或资源管理器）打开文件时，整个文件都会进入缓存中。如果该文件是 80MB 的 Visio® 或 Word 文档，也只好如此。Windows XP 和 Windows Vista 都能识别慢速链接。实际上，默认情况下，Windows XP 认为慢速链接是 64Kbps。令用户沮丧的是，如果连接速度高于 64Kbps 且客户端为 Windows XP，文件还是会在登录时通过慢速管道下载。所以，最好对 Windows 进行配置，以更好地管理通过慢速链接执行的操作。稍后您将看到，可以通过组策略达到此目的，方法是创建链接到包含目标帐户 — Windows XP 或 Windows Vista 的组织单位的组策略对象 (GPO)。
当用户通过慢速链接进行连接时，Windows XP 首先尝试使用本地缓存的文件，之后才尝试使用网络副本。这样做很有意义。不过，Windows XP 仍会执行一些在您期待之外的操作：如果用户从网络或资源管理器打开过某些大文件，而缓存中又没有这些大文件，Windows XP 就会将其下载下来。哎，真是麻烦。而且，在我的测试中，如果将同步安排在注销时进行（默认情况），这些文件的剩余部分便会通过慢速链接下载并置于缓存中（麻烦更大了）。
Windows Vista 的行为则不是这样。默认情况下，它不识别任何慢速情况。实际上，即使连接速度为每秒 1 位，Windows Vista 也会视为快速连接并使用网络上的文件副本。但是，可以训练 Windows Vista，使其了解连接速度较慢时用户希望指定哪些共享进行转换。这样可以使上述情况有所改善。Windows Vista 的行为（使用组策略配置后）是使用普通文件和资源管理器操作无法通过慢速链接获得慢速链接定义的共享内容。
脱机文件服务执行的后台同步不会通过慢速连接发生。但是，值得注意的是，可以通过同步中心执行手动同步。
将 Windows Vista 配置为修改慢速链接处理的操作是通过组策略设置配置慢速链接模式（不要与 Windows XP 设置配置慢速链接速度相混淆）完成的。配置慢速链接模式应采用下列值：连接速度慢时，希望自动转换到脱机状态的服务器和共享的名称，以及连接速度多慢时，服务器\共享组合才会脱机。服务器\共享组合可以是任意 \\服务器\共享组合或者仅是表示所有服务器上所有共享的星号标记 (*)。第二组数值是吞吐量（以 kbps 为单位）和延迟（以毫秒为单位）的声明，只有超过延迟值，才能声明速度慢。不过，在这里告诉您：下载文件时，不会检查较为常用的配对（吞吐量）。如果重定向的文档文件夹中包含 10GB 的文件，您又位于不包含其中任何文件的便携式计算机的慢速链接上，就要准备好等待相当长的时间了。但是，如果使用延迟检查将其配对，并且设置延迟低于预定值，则该共享将转换到脱机，减少用户等待这些文件所受的煎熬。
知识库文章 934202 中提供的 Windows Vista 修补程序（此更改将包含在 Windows Vista Service Pack 1 中）应该会改善通过特定慢速 VPN 情况的性能（可通过 support.microsoft.com/kb/934202 在线获得此文章）。事实上，应用此修补程序后，应该可以在通过慢速链接进行下载时检查吞吐量值。

同步冲突
您可能想知道如果某人在脱机时（比如，在飞机上）更改了文件，而其他人在联机时对该文件做了更改（在总部办公室的网络上）会怎么样。这种情况在客户端级别处理。从脱机转换到联机后，会立即发生 Windows Vista 脱机文件后台同步。然后在任务栏通知区域显示图标后，通过同步中心的条目提示您要执行的操作。用户界面经过重新设计，以便显示看起来较新的文件并显示有关此冲突的详细信息。将文件保存回服务器时，用户可通过选择重命名当前只在自己计算机上的文件来保存冲突的文件，如图 9 所示。
图 9 Windows Vista 文件更改冲突通知
图 9 Windows Vista 文件更改冲突通知

了解更多详细内容？
脱机文件对于您及您的用户来说都是不错的功能。事实上，如果正在使用文件夹重定向，您实际上就已经在使用脱机文件了，因而使其变得更加智能才能满足您的最大需要。我已经介绍了 Windows Vista 中对脱机文件的很多更改，但这并不是全部。要了解相关的详细信息，请参阅侧栏“对 Windows Vista 脱机文件的主要更改”。
go.microsoft.com/fwlink/?LinkId=98141（对于 Windows XP）及 go.microsoft.com/fwlink/?LinkId=98138（对于 Windows Vista）上提供了有关脱机文件的更多详细信息。
在我的著作（请参阅文章末尾的个人资料介绍）中，用相当大的篇幅专门讲述了脱机文件，包括每个组策略设置的优缺点。最后，如要了解详细信息以及和他人谈论您的有关脱机文件的经验，请花一些时间加入 GPanswers.com 上的社区论坛的讨论，其中有一部分是专门探讨此主题的。

Jeremy Moskowitz是组策略方面的 MCSE 和 MVP，他管理的 GPanswers.com 是一个关于组策略的社区论坛。他还负责一系列有关组策略的深入培训研讨会。他的最新著作是《Group Policy:Management, Troubleshooting, and Security》(Sybex, 2007)。您可通过 www.GPanswers.com 与 Jeremy 联系并了解更多信息。
© 2007 Microsoft Corporation 与 CMP Media, LLC.保留所有权利；不得对全文或部分内容进行复制.


 桌面部署: 使用 BDD 2007 进行简单的可伸缩部署
桌面部署 Adam Shepherd

使用 BDD 2007 进行简单的可伸缩部署
概览:
  • BDD 2007 的核心功能
  • 与 SQL Server 集成
  • 构建可伸缩部署解决方案

参与部署 Windows 的大部分人都听说过 Microsoft 商用台式机部署解决方案加速器。它也称为 BDD，是一组最佳实践指南和工具，
旨在帮助将 Windows® 部署到客户端桌面。Windows Vista® 包含解决方案加速器的更新，此更新以 BDD 2007 的形式提供。该版本包含新的 Microsoft® 管理控制台 (MMC) 和源自 System Center Configuration Manager 2007（Systems Management Server (SMS) 2003 的后续产品）的任务定序器。
BDD 2007 不为人们熟知的功能之一是它可作为一种完整部署解决方案。在以前的版本中，BDD 通过可管理和可重复的方式帮助您创建和维护桌面映像。现在，BDD 2007 将 BDD 与 Windows 部署服务 (WDS)、SQL ServerTM 以及 Windows Server® 2003 分布式文件系统复制 (DFS-R) 结合起来，为您提供了构建可伸缩部署解决方案的新增功能。
但是等等...不使用 SMS 2003 和操作系统部署 (OSD) 功能包吗？这是全面实现 Windows 客户端部署的建议做法。
是的，如果您已具有 SMS 2003 基础结构，应该直接使用 BDD 2007、SMS 2003 和 OSD 功能包进行部署。这是当前实现零接触部署的最全面方法，它可以真正降低在组织中配置、安装和管理 Windows 的成本。
然而，许多客户并不具有 SMS 2003 或任何等效的软件部署解决方案。对于这样的客户，还有另一种选择，我将在本文中重点讲述。

BDD 2007 核心概念
BDD 2007 提供了两种主要的部署方法。第一种方法即部分接触安装，这种方法仅使用 BDD 2007 进行客户端部署。实际上这代表一组向导，用于在构建时捕获部署信息，如应该分配给客户端的计算机名称（请参阅图 1）、应该使用的键盘布局和时区等等。该方法称为“部分接触”，因为在构建过程开始之前通常需要少量手动输入来收集这些信息。
图 1 BDD 2007 部分接触部署向导
图 1 BDD 2007 部分接触部署向导
第二种方法即零接触安装，该方法通过与 BDD 2007 集成在 SMS 2003 OSD 功能包基础上构建。这种配置可提供完全自动、可伸缩、可管理以及无需人工干涉的部署解决方案。
构建时，客户端操作系统部署首先执行的一个步骤就是 BDD 2007 收集来自大量不同源的信息。这些源包括 WMI 调用和 BDD 2007 配置文件 — Bootstrap.ini 和 CustomSettings.ini。该信息作为变量进行收集和存储，用于整个部署过程。对于部分接触方案，Bootstrap.ini 和 CustomSettings.ini 文件提供预定义所有信息的功能，否则这些信息还需要通过手动输入到部署向导中进行收集。
提前指定所有信息（否则这些信息还需要部分接触向导在构建时进行捕获）的功能允许您在那些 SMS 2003 不支持的环境下自动执行整个部分接触过程，并转移至零接触解决方案。您可以选择预定义的示例信息包括 ComputerName=RDG0001VST 和 TimeZoneName=GMT Standard Time；前者用于为计算机分配名称 RDG0001VDT，后者用于确保计算机的时区设置为格林尼治标准时间。在使用 BDD 进行部署的过程中可以使用的所有属性在配置参考中都有完整记录，配置参考可从以下位置获得：technet.microsoft.com/library/bb490302.aspx。
有关设置和使用 BDD 2007 的详细信息，请参阅《TechNet 杂志》2007 年 9 月刊 (technetmagazine.com/issues/2007/09/BDD) 中的文章“使用 BDD 2007 部署 Windows Vista”。

BDD 和 SQL Server
为什么将数据库和 BDD 2007 一起使用？原因是在部署过程中需要动态提供详细信息，否则还需要通过部分接触安装向导手动输入这些信息。正如我所提到的，可使用 CustomSettings.ini 文件达到此目的。问题在于在现实部署中，这些详细信息将根据部署到的具体计算机而有所不同。同时，如果您尝试为 500 个不同的计算机定义具体选项和设置，CustomSettings.ini 文件很快就变得难以管理。通过向 BDD 控制台附加后端数据库，就可以添加一个更具可管理性的动态和可扩展的解决方案。
让我们深入了解一下 SQL Server 如何与 BDD 2007 集成。首先，应该确保在部署服务器上安装了 SQL Server（最好是 SQL Server 2005 或更高版本）。幸运的是，在 BDD 2007 中创建数据库的步骤很简单：只需右键单击 BDD 2007 部署工作台上的“数据库”节点，单击“新建”，然后按照说明操作即可（请参阅图 2）。BDD 团队已经完成了一项伟大的工作，即提供可以快速而轻松启动并运行的向导。
图 2 BDD 2007 的部署数据库配置
图 2 BDD 2007 的部署数据库配置
创建数据库后，即可探究其功能。数据库中的条目分为四个主要类别：计算机、角色、位置以及品牌和型号。每个类别都允许您定义多个条目，对于定义的每一个条目，请使用 BDD 2007 变量进行填充、分配应用程序并且提供其他关键设置（请参阅图 3）。
图 3 分配部署属性
图 3 分配部署属性
将这四个类别分成两个不同组很有意义。计算机、位置以及品牌和型号类别为在构建时标识计算机提供了不同的方法。然后，每个标识的计算机可与数据库中的特定角色相关联，所以它用于特定的目的，如销售、市场营销或财务，同时每种角色确保安装了相关业务线应用程序。
使用“计算机”部分，可以通过 MAC 地址、资产标记、通用唯一标识符 (UUID) 或者序列号来标识计算机。因为在此部分可能会创建大量的条目，每个条目对应组织中的一台计算机，所以只需在每个条目中添加特定的属性，如 ComputerName。
使用“位置”部分，可创建针对组织周围特定地理位置的条目。每个条目由该位置的默认网关标识。如果在 Active Directory® 中拥有基于位置的组织单位 (OU) 并且希望在某个位置上构建的计算机可以添加到与该位置对应的 OU 中的域，此功能很有帮助。
使用“品牌和型号”部分，可以创建针对部署必须支持的每个硬件类型的条目。BDD 2007 将这些信息与通过 WMI 调用发现的信息进行比较。在开发环境中“品牌和型号”部分的常见用途是创建一个条目，通过该条目，可以分别检查“Microsoft Corporation”和“虚拟机”品牌和型号属性来查看该计算机是否为 Virtual PC 2007 或 Virtual Server 2005 虚拟计算机。如果在构建时匹配这些属性，则只需将 Virtual Machine Additions 应用程序添加到“品牌和型号”条目中即可告知 BDD 在部署时需要安装该应用程序。
现在已经提供了标识计算机的多种方法，使用“角色”部分可以创建针对您希望提供的每个部署角色的条目。例如，通过向每个条目添加与在 BDD 中定义的 Windows XP 或 Windows Vista 版本相对应的 BuildID 属性，可以构建针对 Windows XP 角色和 Windows Vista 角色的条目。另一种方法就是指定部门角色，如会计、销售或财务。我倾向于在该部分填充 BDD 的大部分属性（时区、区域设置、组织信息等等）。由于这些条目不依赖于任何特定的计算机、硬件或位置，所以对数据库的管理也就很少。
我们需要告知 BDD 2007 应该在部署时在数据库中搜索任何与当前构建的计算机相匹配的条目。要将 BDD 配置为在部署期间使用该数据库，请右键单击部署点，并单击“配置 DB”。然后，会出现一系列向导，这些向导使用相关条目填充 CustomSettings.ini 文件，这些条目可以使部分接触安装过程查询数据库以获取信息。

使部署具可伸缩性
现在您拥有了一个部署服务器，该服务器可自动执行部分接触安装并且可动态设置每个计算机，使之充当特定的业务角色。但是该如何扩展该解决方案？
该解决方案的体系结构基于图 4 中所示的中心辐射型拓扑。所设置的第一个部署服务器将是中心和父部署服务器。每个子部署服务器将作为辐射部分运行。
图 4 中心辐射型部署体系结构
图 4 中心辐射型部署体系结构
要启用该体系结构，您需要使用 DFS-R 将分布共享复制到每个部署服务器。然后，使用 SQL Server 快照复制向每个子部署服务器提供 BDD 部署数据库副本。该解决方案的最大好处就是子部署服务器的要求很低 — 仅需要在每个计算机上安装 SQL Server Express、WDS 和 DFS-R 即可启动部署。
由于 BDD 2007 分布共享中可存储大量数据，我坚持使用 Windows Server 2003 R2 中的 DFS-R，而不是 Windows Server 早期版本中的文件复制服务。DFS-R 使用远程差分压缩 (RDC)，仅复制在复制组成员间的文件差分（增量）更改。当对自定义映像文件进行很小的更改时（如新的驱动程序），此功能对复制通信量的影响很大。使用 DFS-R，复制通信量仅相当于所做更改的大小，而不是重新分发的整个映像文件的大小。
在 Microsoft 网站上有很多关于 DFS 的信息，请首先查看 microsoft.com/windowsserver2003/technologies/storage/dfs，但是我将介绍所需的基本设置和配置步骤，以概述在基于 BDD 的部署环境中的过程。
请注意，如果服务器在安装 R2 之前一直基于所安装的 Windows Server 2003 运行 Active Directory，那么 Active Directory 架构也许需要更新以允许 DFS-R 运行，因为复制服务需要新的对象类。有关在 Windows Server 2003 R2 中扩展 Active Directory 架构的全部细节，请参阅 go.microsoft.com/fwlink/?LinkId=99936。
第一步是在 Windows Server 2003 R2 部署服务器上安装 DFS 组件。您可通过多种方法完成此步骤，最简单的方法就是使用标准的“添加/删除 Windows 组件”向导。完成后，您需要使用图 5 所示的 DFS 管理控制台设置复制组。
图 5 DFS 管理控制台
图 5 DFS 管理控制台
要扩展 BDD 2007 部署解决方案，需要复制两个特定文件夹。第一个文件夹是承载所有 BDD 源和配置文件的 BDD 2007 分布共享。每个部署服务器都要有这些文件。
要复制的第二个文件夹是 WDS 用于承载 LiteTouch_x86.wim 文件的 Boot 文件夹。这是 WDS 向桌面客户端计算机提供的用于启动部署过程的 BDD 引导环境。您需要复制该文件，这样当父部署服务器上的引导环境发生更改时，更改就会在其余部署基础结构上进行复制。
复制路径为 X:\Distribution（其中 X 为在 BDD 2007 安装时指定的驱动器号）和 Y:\RemoteInstall\boot（其中 Y 为承载 WDS RemoteInstall 共享的卷驱动器号）。
DFS-R 中的复制为多主机复制，所以无法创建单向复制拓扑。因此，为了允许对分布共享进行集中管理，请将每个子部署服务器上的分发文件夹设置为只读。这样只允许将 DFS-R 复制写入该文件夹（因为它使用备份和还原权限）。从这些子服务器构建的客户端计算机无需写入该文件夹，所以不必对任何帐户授予高于读取权限的权限。
使用 DFS-R 完成数据复制的最后一个配置步骤是在 WDS 中设置引导配置数据 (BCD) 存储刷新策略。这样可确保对引导环境所做的更改在每个子部署服务器上都可以反映出来。该配置更改必须在所有 WDS 服务器上进行设置，我建议将此配置更改安排在构建和配置过程中，以便设置部署服务器。
在每个部署服务器上，运行以下命令：
WDSUTIL /set-server /BCDRefreshPolicy /Enabled:yes /RefreshPeriod:<time in minutes>
时间刷新周期取决于在部署服务器上刷新数据的频率。如果将 DFS-R 配置为每小时进行一次复制，则将 BCD 存储刷新策略配置为每 60 分钟进行一次刷新。

SQL Server 复制
目前为止，您已经对 BDD 2007 进行了扩展，使其将 BDD 分布共享和 WDS 引导映像从主部署服务器复制到每个子部署服务器。您现在需要完成该过程并复制 BDD 2007 部署工作台数据库，以便每个部署服务器都能得到这个数据库。
SQL Server 使用产品文档描述的复制方法，该方法与出版杂志的方法相同。对于杂志，有出版杂志的出版商，为出版商发行杂志的分销商以及订阅和接收杂志的订阅者。SQL Server 对其内置复制功能使用上述相同的术语（我们这里谈的是英文版本）。
请注意：为了成为 SQL Server 数据库发布服务器，服务器不可运行 SQL Server Express Edition；它必须使用完整版的 SQL Server。对于主要的部署服务器，我使用 SQL Server 2005（虽然也支持 SQL Server 2000）。对于每个子部署服务器，您可使用 SQL Server 2005 或 SQL Server 2005 Express。
在开始配置 SQL Server 复制之前，首先应该完成几个步骤，以确保对 SQL Server 进行正确设置以支持复制。配置部署服务器时，请确保在安装 SQL Server 2005 或 SQL Server 2005 Express Edition 过程中包含了复制组件。默认情况下，SQL Server Express 不安装复制组件。
接下来，允许部分接触引导环境远程连接到 SQL Server 要求在 SQL Server 中启用远程连接。要将 SQL Server 配置为可进行远程连接，请启动 SQL Server 外围应用配置工具，选择“服务和连接的外围应用配置器”，然后将服务器配置为接受来自 TCP/IP 和指定管道的本地和远程连接。
然后，在主部署服务器上，创建共享文件夹以承载复制快照数据，每个子部署服务器上的复制代理都会从该共享文件夹中读取数据。我稍后将对该共享文件夹进行讲解。我经常将该文件夹与其余部署内容放置在同一卷上。
只有子部署服务器上安装了 SQL Server Express Edition 才要求执行最后的设置步骤。默认情况下，SQL Server 浏览器服务处于禁用状态。要允许复制，必须将该服务设置为自动启动。使用 SQL Server 配置管理器工具可以配置该服务。还需要在子服务器上创建数据库，以便将内容复制于其中。保持该数据库的名称与主部署服务器上的 BDD 2007 数据库名称相同，这样可减少其他配置要求。

设置复制
您现在已经准备好配置 SQL Server 复制。要开始设置，请在主部署服务器（应该运行完整版的 SQL Server 2005）上启动 SQL Server Management Studio。第一步是创建和配置分发。为此，请导航到图 6 中所示的管理控制台的复制文件夹。右键单击复制文件夹并选择“配置分发”以启动分发向导。
图 6 SQL Server Management Studio：复制
图 6 SQL Server Management Studio：复制
在该向导中，确认主部署服务器应该充当它自己的分发服务器。将根快照文件夹设置为先前创建的 SQL Server 复制共享的 UNC 路径。最后，设置主部署服务器，将其配置为发布服务器。
当该向导将服务器成功配置为发布服务器和分发服务器后，您需要告知 SQL Server 您要发布的数据库。为此，请右键单击复制文件夹并单击“发布服务器属性”。在属性对话框中，选择“发布数据库”，然后选择用于事务性复制的 BDD 2007 数据库，如图 7 中所示。此时并不表示您真正使用事务性复制，但是不管您希望使用快照复制还是事务性复制，均应选择该相同的选项。
图 7 发布数据库
图 7 发布数据库
您现在需要创建子部署服务器可订阅的发布。在复制文件夹中，右键单击“本地发布”，然后单击“新建发布”以启动发布向导。选择 BDD 数据库作为要发布的数据库。选择“快照复制”作为发布类型，并指定要复制的所有表格、存储程序以及视图。您应该选择立即创建初始快照。对于计划快照代理，除非预期要对该数据库进行频繁更改，否则默认情况下每天运行一次足矣。
最后一步就是将每个子部署服务器订阅到该发布。这将告知 SQL Server 以指定的时间间隔向每个子部署服务器推送该数据库的副本。在“复制”文件夹的“本地发布”子文件夹下，找到刚刚创建的发布，右键单击它，然后选择“新建订阅”以启动订阅向导。在该向导中，选择在先前步骤中创建的 BDD 发布作为所选发布。选择在该分发中运行所有代理，将复制拓扑作为推送订阅。然后将每个子部署服务器作为订阅者进行添加，并指定在每个服务器上创建的数据库接收复制数据的副本（请记住：此数据库的名称应与主部署数据库的名称相同）。最后，配置用于连接的帐户并定义用于复制的日程安排。这可反映为快照代理选择的日程安排。这就是针对 SQL Server 复制需要启动和运行的操作的简要介绍。很快您就可以查看复制的数据！

配置 BDD 2007
目前为止，您已经将 BDD 2007 配置为使用数据库，并设置了到子部署服务器的数据库和 BDD 2007 分布共享复制。要完成部署解决方案，您需要配置 BDD 2007，以便在客户端下载 BDD 引导环境时，它自动连接到其本地部署服务器。
当您启动进入部分接触 Windows PE 环境时，如果客户端已经从 WDS 服务器启动，则会在 Windows PE 中设置一个注册表值，其中存储客户端从其下载引导环境的服务器名称。初始 BDD 2007 部署脚本选择该值并且将其存储在 %WDSServer% 环境变量中。
请注意：如果使用初始 BDD 2007 版本，您可能会发现在 Windows PE 注册表中并未正确填充该值。support.microsoft.com/kb/937191 上提供了解决此问题的更新。
要配置 BDD 2007，只需编辑 BootStrap.ini 和 CustomSettings.ini 配置文件，以便用 %WDSServer% 取代对部署服务器的引用。这通常需要替换 SQL Server 实例名称的值以及 DeploymentRoot（承载分布共享的服务器）的值。示例 Bootstrap.ini 和 CustomSettings.ini 文件摘录如图 8 和图 9 所示。
Figure 9 CustomSettings.ini (Close Figure 9)
[Settings]
Priority=MMSettings, MMApps, CSettings, CRoles, RSettings, RApps, Default
Properties=Manufacturer

[Default]
OSInstall=Y
DeployRoot=\\%WDSServer%\Distribution$
UserDomain=BUILDLAB
UserID=BddAdmin
UserPassword=Password1234

[CSettings]
SQLServer=%WDSServer%
Database=BDD_DB1
Netlib=DBNMPNTW
Table=ComputerSettings
Parameters=UUID, AssetTag, SerialNumber, MacAddress
ParameterCondition=OR

[CRoles]
SQLServer=%WDSServer%
Database=BDD_DB1
Netlib=DBNMPNTW
Table=ComputerRoles
Parameters=UUID, AssetTag, SerialNumber, MacAddress
ParameterCondition=OR
Figure 8 Bootstrap.ini (Close Figure 8)
[Settings]
Priority=Default

[Default]
DeployRoot=\\%WDSServer%\Distribution$
UserDomain=BUILDLAB
UserID=BddAdmin
UserPassword=Password1234
SkipBDDWelcome=YES
请注意：该解决方案规定 WDS 位于存储 BDD 2007 复制数据库和 BDD 2007 复制分布共享的服务器上。原因很明显：这样，您可以使用 %WDSServer% 变量提供简单的故障安全方法，告知客户端计算机其本地部署服务器的位置，阻止其重新与 WAN 对话。

其他注意事项
BDD 2007 的一个好处在于它具有可扩展性，所以扩展该解决方案时可考虑许多其他方面。例如，可使用内置功能监视 SQL Server 和 DFS-R，通过设计的方法使用资产管理数据库的信息填充环境中的计算机，甚至使用 SQL 存储过程检索此类信息。很遗憾，由于篇幅所限，在此无法讲述这些内容，但是我已经简要介绍了一些在组织中利用 BDD 功能的方法，希望有所帮助。

Adam Shepherd是英国 Microsoft Consulting Services 的一位顾问。Adam 的技术领域侧重于部署、维护和管理 Windows 客户端。您可通过向 adamshep@microsoft.com 发送电子邮件与他联系。


 通信: Microsoft 的 Exchange 边缘传输服务器：第二部分
通信 Kay Unkroth

Microsoft 的 Exchange 边缘传输服务器：第二部分
概览:
  • 使用边缘传输日志和跟踪
  • 带有脚本的反垃圾邮件配置
  • 测试典型的垃圾邮件方案
下载这篇文章的代码: Edge2007_11.exe (161KB)

面对在 Internet 中肆虐的大量垃圾邮件和其他恶意内容，您如何确保将邮件可靠和安全地发送给组织内的用户？在上个月专栏中本系列的第一部分，我开始描述的一种方法是
在 Internet 和生产环境之间的外围网络中部署 Exchange Server 2007 边缘传输服务器和 Forefront Security for Exchange Server。
此系列分为两部分，这是后一部分，我将在其中介绍如何使用 Exchange Server 2007 的标准代理日志记录和跟踪功能分析运行中的边缘传输代理。我还会使用自定义方法将所有事件对象从传输管道转储到基于 XML 的文件。然后，我将以 Microsoft 在自己的企业生产环境中使用的配置为例，说明如何将反垃圾邮件设置应用到边缘传输测试实验室。最后，我将总结现实中的一些有趣测试方案以查看边缘传输代理如何针对各种垃圾邮件情形作出响应。
有关边缘传输测试实验室的安装和常规边缘传输体系结构的详细信息，请参见 2007 年 10 月的《TechNet 杂志》中本系列的第一篇文章，可在 technetmagazine.com/issues/2007/10/Edge 上获得。
我大量使用脚本和批处理文件以自动执行最重要的配置任务，您可以在本文随附的代码下载中找到这些脚本（请转到 technetmagazine.com/code07.aspx）。此外，有关边缘传输代理的 Microsoft IT 配置的更详细的背景信息，我推荐您阅读针对 Microsoft IT Showcase 编写的技术白皮书“Microsoft® Exchange Server 2007 边缘传输和邮件保护”。您可以从 microsoft.com/technet/itshowcase/content/edgetransport.mspx 下载此 IT Showcase 白皮书。

日志记录和跟踪
Exchange Server 2007 提供了许多便于诊断和解决传输代理问题的日志记录和跟踪功能，包括协议日志记录、代理日志记录和管道跟踪。尽管在本文中我没有讲述如何解决传输代理问题，但是日志记录和跟踪信息对检查边缘传输代理如何工作非常有用。
如果您希望跟踪有关 SMTP 发送和接收活动的信息，您应该对发送和接收连接器启用协议日志记录。使用在本系列的第一部分中设置的测试环境（参见图 1），我通过 New-SendConnector 和 New-ReceiveConnector cmdlet 上的以下设置启用了协议日志记录：
图 1 测试环境
图 1 测试环境
–ProtocolLoggingLevel: Verbose
默认情况下，您可以在 %ProgramFiles%\Microsoft\Exchange Server\TransportRoles\Logs\ProtocolLog 下的子文件夹中找到生成的 SMTP 日志文件。
如果您希望分析 SMTP 对话，协议日志记录会非常有用；然而，反垃圾邮件代理并不总是影响 SMTP 会话。例如，内容筛选器代理可能仅使用垃圾邮件可信度 (SCL) 值对入站邮件作出标记。只要 SCL 值低于指定的阈值（默认值为 7），内容筛选器代理就不会导致边缘传输过程拒绝邮件。因此，SMTP 对话进程不会受到影响。
要分析反垃圾邮件代理（连接筛选器、内容筛选器、边缘规则、收件人筛选器、发件人筛选器和发件人 ID）对通过传输管道的邮件所执行的操作，您需要检查代理日志而不是协议日志。通常根据 EdgeTransport.exe.config 文件中的 AgentLogEnabled 参数启用代理日志记录。默认情况下，代理日志位于 %ProgramFiles%\Microsoft\Exchange Server\TransportRoles\Logs\AgentLog 文件夹中。您可以在记事本中打开日志，不过 Get-AgentLog cmdlet 可以更直观地显示 Exchange 命令行管理程序中的代理日志信息。
另一个有用的功能是管道跟踪，当来自特定发件人的邮件通过传输管道时，您可以使用它捕获其邮件快照。其思路相当简单；在调用为 OnEndOfHeaders、OnEndofData、OnSubmittedMessage 和 OnRoutedMessage 事件注册的 SMTP 接收和路由代理前后，边缘传输过程创建每封邮件的快照。通过比较这些邮件快照，您可以看到单个代理如何修改每封邮件。当然，在测试环境中启用这一有价值的功能是必要的。
按照以下方式使用 Set-TransportServer cmdlet 可为测试用户激活管道跟踪。正如您所预料的，将 PipelineTracingEnable 参数设置为 $true 会启用管道跟踪。测试用户的电子邮件地址在 PipelineTracingSenderAddress 参数中设置：
Set-TransportServer –Identity EDGE01
–PipelineTracingEnabled $true
-PipelineTracingSenderAddress Contoso.User@contoso.com
启用管道跟踪后，您可以在 %ProgramFiles%\Microsoft\Exchange Server\TransportRoles\Logs\PipelineTracing\MessageSnapshots 文件夹中找到来自指定发件人（在本例中，其邮件地址为 Contoso.User@contoso.com）的每封邮件的邮件快照文件。这是默认文件夹。对于每封邮件，快照文件位于根据分配给该邮件的 GUID 命名的子目录中。请注意，原始邮件在名为 Original.eml 的文件中，邮件的副本在以 SmtpReceive 或 Routing 为前缀的 .eml 文件中（具体前缀取决于遇到的事件和安装的代理）。要分析为 SMTP 接收事件 OnEndofData 和 OnEndOfHeaders 注册的反垃圾邮件代理的过程，请检查 SmtpReceive*.eml 文件。要分析为路由事件 OnSubmittedMessage 和 OnRoutedMessage 注册的防病毒和其他代理的过程，则需要分析 Routing*.eml 文件。

自定义管道转储
尽管标准功能并未涵盖所有传输事件，但是 Exchange Server 2007 的标准代理日志记录和跟踪功能可满足所有故障排除的需要。例如，由于发送主机尚未传送可能要写入 %ProgramFiles%\Microsoft\Exchange Server\TransportRoles\Logs\PipelineTracing 文件夹的任何邮件，管道跟踪无法捕获有关 OnConnectEvent、OnEhloCommand、OnMailCommand、OnRcptCommand、OnDataCommand 和类似传输事件的信息。如果您希望捕获有关这些事件的详细信息，需要实施自定义代理以将事件数据转储到文件系统上的文件。
正如我以前的文章中所述，创建自定义代理并不复杂，因此我在这里构建一个 SMTP 接收代理和一个路由代理，以将所有事件对象从传输管道转储到 XML 文件中。您可以在为本文提供的下载中找到相应的 Microsoft Visual Studio® 2005 项目，名为 PipelineXMLDump。两个重要的文件是 DumpAgents.cs 和 XMLDump.cs，前者实施代理工厂和代理，后者实施帮助程序类以通过 System.Re- flection 方法将事件源和事件参数对象的字段写入 XML 文件。如果您编译源代码并将生成的 PipelineXMLDump.dll 文件复制到边缘传输测试服务器上名为 C:\PipelineXMLDump 的文件夹中，则可以使用脚本 RegisterPipelineXMLDump.ps1 和 EnableDumpAgents.ps1 注册并启用自定义代理。这些脚本包含在下载中的 PipelineXMLDump 项目文件夹中。当然，我的自定义代理仅用于说明，尚未进行充分测试，请不要安装在生产服务器上。使用这些代理的风险由您自己承担。
DumpAgents.cs 向您展示如何实施传输管道支持的所有 SMTP 接收和路由事件处理程序。如果您希望实施自己的自定义代理，这可以是一个很好的起点。我的转储代理在 %ProgramFiles%\Microsoft\Exchange Server\TransportRoles\Logs\PipelineXMLDump 下的子文件夹中写入 XML 文件，这些子文件夹对应于 SMTP 会话的标识符（SMTP 接收代理）或消息标识符（路由代理）。图 2 显示了传送到 OnConnectEvent 处理程序中 SMTP 接收代理的事件参数信息示例。该示例显示了接受传入连接请求的本地 IP 终结点（IP 地址和端口）。
图 2 OnConnect 事件期间转储的参数信息
图 2 OnConnect 事件期间转储的参数信息

准备测试运行
关于日志记录、跟踪和转储的理论已经足够了。现在我们准备一些测试运行来显示实际运行中的反垃圾邮件代理。以下是尽可能反映您的测试环境中 Microsoft IT 配置的摘要。如前所述，背景信息可在技术白皮书“Microsoft Exchange Server 2007 边缘传输和邮件保护”中获得。
首先，运行附带下载中的 EDGE01_disable_agents.ps1 脚本，以取消激活地址重写入站、附件筛选器和地址重写出站代理。由于收件人在内部和外部使用同一电子邮件地址，因此地址重写不是必需的。由于 Forefront Security 提供了取代附件筛选功能，所以我不使用附件筛选器代理。
测试环境未连接到 Internet。这就难以测试连接筛选器代理。要解决此问题，可以通过运行 INTERNET01_create_IP_block_list.bat 文件在 Internet 主机上创建 IP 阻止列表。请确保安装了 Windows® 支持工具，因为这些工具包括 DNS 命令行工具 (dnscmd.exe)。否则，您必须手动使用 DNS 控制台创建 DNS 记录，这会花费一些时间。
现在您可以通过运行 EDGE01_add_block_list_provider.ps1 脚本配置连接筛选器代理。该脚本为 ip-bl.consolidatedmessenger.com 添加 IP 阻止列表提供程序。这是 Consolidated Messenger 的 IP 阻止列表，如前所述，已在测试环境中通过在 Internet 主机上运行 INTERNET01_create_IP_block_list.bat 文件创建。Microsoft IT 还使用本地 IP 阻止列表和 IP 允许列表，但是这些功能不需要手动配置。一定要注意，Microsoft IT 不使用 IP 允许列表提供程序。
下一步，通过运行 EDGE01_recipient_filter.ps1 脚本配置收件人筛选器代理以阻止发送到不存在的收件人的邮件、发送到邮箱的邮件和仅用于内部或出站的全局通讯组列表。
发件人筛选器代理还需要配置更新。Microsoft IT 使用发件人筛选作为阻止来自特定发件人地址的大量邮件攻击的对策，并阻止特定列表服务器和认为与业务无关的类似邮件源。Microsoft IT 进一步使用发件人筛选来阻止发件人信息无效或缺少的邮件。让我们通过在边缘传输服务器上运行 EDGE01_sender_filter.ps1 脚本，将该配置应用到测试环境。
如果您希望完全反映 Microsoft IT 配置，还需要在 DNS 中配置发件方策略框架 (SPF) 记录。要为从您的域 (adventure-works.com) 发出的邮件生成宣称边缘传输服务器授权的 SPF 记录，您可以使用 Microsoft Sender ID Framework SPF Record Wizard，该向导可在 microsoft.com/mscorp/safety/content/technologies/senderid/wizard 上获得。尝试一下并指定一个现有的 Internet 域名。在测试环境中，您可以在 Internet 主机上运行 INTERNET01_create_SPF_record.bat 文件。
就是这样！由于大多数代理的默认设置比较合理，因此无需进一步配置参数。要为边缘规则、发件人 ID、协议分析和内容筛选器代理快速检查最重要的默认设置，请在边缘传输服务器上运行 EDGE01_check_defaults.ps1 脚本。

运行中的边缘传输代理
现在，我们将边缘传输代理放在一些实际的邮件方案中来工作。要将测试消息发送到边缘传输服务器，我使用 Windows Server 2003 和 Outlook® Express 中包含的 SMTP 和 POP3 服务作为邮件客户端，大部分时间使用默认设置，但确保启用了日志记录。
但是，首先要警告您：如果您的测试环境已连接到生产系统或 Internet，请不要执行本部分中描述的任何步骤或脚本。测试的风险由您自己承担。
我要测试的第一个代理是连接筛选器代理。首先测试它是因为它是边缘传输服务器上工作最繁忙的代理。在 Microsoft，连接筛选器代理阻止了所有 Internet 邮件提交的大约 88％。一个正常工作日有 1300 万个提交尝试，其中仅 150 万来自合法发件人。
因此，让我们以 Fabrikam.User@Fabrikam.com 的名义将一封电子邮件发送到 Administrator@adventure-works.com。如果一切工作正常，则管理员不应该收到邮件。相反，Fabrikam.User 应该收到传递状态通知 (DSN)，说明无法传递给收件人。Fabri- kam.User 验证该电子邮件地址是正确的，再次发送同一邮件，而 Fabrikam.User 再次收到 DSN。然后，Fabrikam.User 呼叫服务台并报告问题。她不是第一个遇到此问题的人。事实上，Fabrikam 中的任何人都无法继续与 Adventure Works 交流。发生了一些问题。情况很紧急。要尝试快速解决问题，请检查 INTERNET01 上 %systemroot%\system32\Logfiles\SMTPSVC1 文件夹中的 SMTP 日志，如图 3 中红色文本所示，就是这样！
Figure 3 SMTP 日志显示问题 (Close Figure 3)
... 220 mail.adventure-works.com Microsoft ESMTP MAIL Service ready at Thu,
31 May 2007 12:21:33 -0700,
... EHLO, -, INTERNET01,
... 250-mail.adventure-works.com Hello [192.168.1.100],
... MAIL, -, FROM:<Fabrikam.User@fabrikam.com> SIZE=840,
... 250 2.1.0 Sender OK,
... RCPT, -, TO:<Administrator@adventure-works.com>,
... 550 5.7.1 E-mail rejected because your IP address is listed by
ip-bl.consolidatedmessenger.com. Please visit
http://www.consolidatedmessenger.com/ip-bl for more information.
If you still need assistance, contact cmipbl@adventure-works.com.,
... RSET, -, -,
... 250 2.0.0 Resetting,
... QUIT, -, -,
... 221 2.0.0 Service closing transmission channel,
550 错误响应告诉您 Consolidated Messenger 将您的 Internet 主机的 IP 地址放在了 IP 阻止列表上。实现了预期效果。您联系 Consolidated Messenger 以将其从该列表中删除。事实证明，将 IP 地址放在 Consolidated Messenger 阻止列表中比从列表中删除它更容易。要清除它，即使不需要几周的时间，也要花费几天。
您需要更快地获得帮助，因此，您通过电子邮件地址 cmipbl@adventure-works.com 与 Adventure Works 联系。您以 Fabrikam.Admin@Fabrikam.com 的名义发送一封电子邮件，描述情形并要求解除对主机的 Internet IP 地址（在本例中是 192.168.1.100）的锁定。验证您的身份后，Adventure Works 使用以下命令指定一个临时例外（该例外在 30 天后自动过期），从而解除了地址锁定：
Add-IPAllowListEntry -IPAddress 192.168.1.100
-ExpirationTime (get-date).AddDays(30)
30 天应该足够让您使用 Consolidated Messenger 对事务进行分类，而 Adventure Works 不需要花费时间手动维护该例外。通过指定自过期例外，Adventure Works 在最大程度上降低了与维护 IP 允许列表相关的管理开销。

安全发件人
下一步，我们将测试内容筛选对安全发件人的识别，这是一项有趣的新功能，旨在提高垃圾邮件筛选的精确度。EdgeSync 将经过散列和加密处理的安全发件人信息从内部环境传播到边缘传输服务器。内容筛选器代理在筛选过程中使用该信息做出合理的决定。您只需将安全发件人信息（即安全发件人列表、安全收件人列表、阻止的发件人名单和外部联系人）放入 Active Directory® 中，方法是先使用 Update-SafeList cmdlet，然后使用 Start-EdgeSynchronization cmdlet 将该信息复制到边缘传输服务器。Microsoft IT 按照计划在非高峰时段运行 Update-SafeList cmdlet。在我们的测试环境中，完全可以手动运行相应的脚本 (HUB-MBX-01_update_safelist.ps1)。
首先，通过在边缘传输服务器上运行 EDGE01_clean_up.ps1 脚本清理测试环境，以删除先前创建的 IP 允许列表条目。由于内容筛选器代理不对来自该列表上的源的邮件执行操作，因此这是必要的。然后，在 Internet 主机上运行 INTERNET01_clean_up.bat 文件，从 Consolidated Messenger 阻止列表中删除与 100.1.168.192.ip-bl.consolidatedmessenger.com 对应的 IP 阻止列表条目。否则，如前所述，模拟的 Internet 主机将不能发送邮件。
最后，发送一封内容筛选器代理几乎一定会视为垃圾邮件的邮件。由于内容筛选器代理使用默认的 SCL 拒绝阈值将大多数邮件传递给用户以尽可能减少误报，因此这具有一定的欺骗意义。然而在一些测试后，我发现了一个将 SCL 分级升为拒绝级别的邮件版本。要以 Contoso.User@Contoso.com 的名义发送邮件，请在 Internet 主机上运行 INTERNET01_contoso_msg.vbs 脚本。
我的脚本使用匿名 SMTP 连接将邮件提交到 INTERNET01 上的 SMTP 服务。为了使其正常工作，您需要将 SMTP 服务配置为中继匿名用户的邮件。在 IIS 管理器中，打开默认 SMTP 虚拟服务器的属性。在“访问”选项卡上，单击“中继”按钮，然后选择“除以下列表外的所有项”。很快我将讲到该配置的含义。
当您运行脚本发送该邮件时，Contoso.User 应该收到 DSN，说明传递失败，其内容如下：Diagnostic-Code：smtp;550 5.7.1 由于内容限制而拒绝了邮件。您还可以在 Internet 主机上的 SMTP 日志中看到该响应，如果在边缘传输服务器上运行命令 Get-AgentLog | Select-Object -Last 1 来显示代理日志中的最后一个条目，您应该能够看到由于其 SCL 分级为 7 而被拒绝的邮件，如图 4 所示。
图 4 由于内容限制而被阻止的邮件
图 4 由于内容限制而被阻止的邮件
现在，Contoso.User 不是垃圾邮件发送者。遗憾的是，在这种情况下 Contoso.User 的邮件被阻止，但是她通常可与 Adventure Works 的收件人进行交流。因此，Contoso.User 在另一封电子邮件中通知管理员她的原始邮件被错误地阻止。管理员知道 Contoso.User，并且为确保垃圾邮件筛选器将来不再阻止她的邮件，管理员将 Contoso.User 添加到安全发件人列表中。要在 Office Outlook 2007 中执行此操作，请右键单击从 Contoso.User 接收的邮件，指向“垃圾邮件”，然后单击“将发件人添加到安全发件人列表”。
Update-SafeList cmdlet 按照一般的间隔运行来刷新 Active Directory 中的安全列表信息，在下一个边缘同步后，Contoso.User 将能够与管理员进行交流而不会发生误报。要模拟该过程，请运行 HUB-MBX-01_update_safelist.ps1 脚本。
现在运行 INTERNET01_contoso_msg.vbs 脚本再次发送 Contoso.User 邮件。然后使用命令 Get-AgentLog | Select-Object -Last 1 检查边缘传输服务器上的代理日志，您可以在 ReasonData 下看到现在已跳过内容筛选。不再有 Contoso.User 的误报！

垃圾邮件攻击
在测试运行即将结束时，我们尝试一种极端情况。您肯定已经注意到，我在前面的测试中将 Internet 主机配置为开放中继，这就为垃圾邮件发送者打开了大门。因此，如果 Spam.Sender@cohovineyards.com 注意到该容易利用的配置并滥用主机将成千上万封垃圾邮件发送到 Adventure Works，让我们看看将发生什么情况。INTERNET01_spam_msg.vbs 脚本仅提交一封垃圾邮件，但是您可以编辑脚本并更改 max_loop 值来生成更多的垃圾邮件。
为了模拟垃圾邮件攻击，我将 1,000 封邮件提交到受到影响的主机以中继到边缘传输服务器。SMTP 服务将每个出站连接的邮件数限制为 20，因此，在边缘传输服务器上的协议分析代理具有足够的邮件和触发事件之前，中继足够的垃圾邮件数会花费一些时间。
协议分析代理基于 SMTP 协议分析和 Microsoft Update 提供的 IP 信誉更新自动维护 IP 阻止列表条目，以帮助连接筛选器代理。在本例中，SMTP 协议分析会捕获垃圾电子邮件。协议分析代理跟踪每封邮件的 SCL 分级来计算它用来确定发件人信誉级别 (SRL) 的平均 SCL 值。在我的模拟垃圾邮件活动中，由于越来越多的不合法邮件到达，Internet 主机的 SRL 会不断增长，直到超过 SRL 阻止阈值。结果，该主机在 IP 阻止列表上停留 24 小时。该主机中不会再发出更多的垃圾邮件！它会自动发生。管理员不需要进行任何干预。
图 5 显示了最终的 IP 阻止列表条目和邮件处理中的相应更改。阻止主机之前，边缘传输服务器在 OnEndOfData 事件过程中拒绝了每封垃圾邮件，因为内容筛选器代理根据 SCL 阈值处理每封邮件（请参考图 4）。邮件已提交，尽管没有成功。阻止我的主机后，在 OnMailCommand 事件过程中，连接筛选器代理拒绝了连接。不再提交邮件。这就节省了在邮件提交之前断开垃圾邮件发送者的连接所需的网络带宽和处理资源。
图 5 阻止发送垃圾邮件的 Internet 主机
图 5 阻止发送垃圾邮件的 Internet 主机

进一步测试
当然，您可以测试更多的代理功能和方案。例如，可以通过以 Blocked.User@Contoso.com 或 Blocked.User@Fabrikam.com 名义发送邮件来测试发件人筛选，通过将邮件发送到 Blocked.User@adventure-works.com 来测试收件人筛选，还可以使用 Telnet 按不同的缓送间隔模拟目录收集攻击。Microsoft IT 在面向 Internet 的接收连接器上为 SMTP 5yz 响应使用 5 秒钟的默认间隔，这段时间足以让 Microsoft IT 呈现垃圾邮件发送者无法得逞的目录收集攻击。但是您可以使用 Set-ReceiveConnector cmdlet 应用不同的值，如 EDGE01_tarpitting.ps1 脚本中所示。
您还可以深入了解并检查管道跟踪为来自 Contoso.User@Contoso.com 的邮件创建的快照文件。检查防病毒戳记，X-MS-Exchange-Organization-AVStamp-Mailbox：MSFTFF;1;0;0 0 0，Forefront Security 使用它将邮件标记为已扫描。当集线器传输服务器上的 Forefront Security 找到带有最近版本信息的该戳记时，它无需再次扫描该邮件。如果您尝试通过将伪防病毒戳记插入测试邮件欺骗 Forefront Security，您会看到邮件头防火墙发生作用，它在 OnDataCommand 事件后立即删除这些戳记，之后很久才会触发调用 FSE 路由代理的 OnSubmittedMessage 事件。
在您查看快照文件中的邮件头时，可能希望为 Contoso.com 创建 SPF 测试记录，以将错误的 IP 地址标识为合法发件人。实现此操作的一种方法是在 Internet 主机上运行 INTERNET01_wrong_SPF_record.bat 文件。然后，您应该以 Contoso.User@Contoso.com 的名义发送测试邮件并查看 X-MS-Exchange-Organization-SenderIdResult 和 Received-SPF 邮件头：
X-MS-Exchange-Organization-SenderIdResult: SoftFail
Received-SPF: SoftFail (EDGE01.extranet.adventure-works.com: domain of transitioning
Contoso.User@Contoso.com discourages use of 192.168.1.100 as permitted sender)

总结
您在本文和我以前的文章中可以看到，Exchange Server 2007 边缘传输服务器附带一组全面的传输代理来实施可靠、高精确度的反垃圾邮件功能，包括连接筛选、协议分析和内容筛选。传输体系结构是可扩展的，并支持实施其他代理来提供附加功能。例如，FSE 路由代理就是将 Forefront Security for Exchange Server 集成到传输体系结构的附加代理。
与其他功能（如连接缓送、邮件头防火墙、TLS 和身份验证）结合使用，边缘传输服务器提供了在多层实现极高级别邮件保护的必要方法，而不会发生单点故障。通过在外围网络中部署边缘传输服务器和 Forefront Security 并与内部 Exchange Server 组织严格分离，您可以阻止大量不合法和恶意内容进入邮件环境，将合法邮件传递给用户，并且具有非常低的误报率。

Kay Unkroth是一位企业家，他曾担任支持工程师、系统开发人员、顾问、培训师和撰稿人，研究 Microsoft 服务器技术已达 15 年以上。Kay 还是 Biblioso Corporation 的共同创始人兼董事长，该公司专门从事托管文档和本地化服务。


 联网: 使用 ISA Server 2006 配置 VPN 远程访问
联网 Alan Maddison

使用 ISA Server 2006 配置 VPN 远程访问
概览:
  • VPN 协议
  • 配置点对点 VPN 连接
  • 配置远程访问 VPN 连接
  • ISA Server 2006 中的新增功能

虚拟专用网络 (VPN) 具有高级别的适应性和可伸缩性，并可以通过网络连接进行控制。除了增强安全性外，它们还可以大大节约传统的专用
点对点连接的成本。它们还非常灵活。
VPN 有多种类型。有些用于将移动用户连接到企业网络；有些用于连接两个分别位于不同地理位置的网络。不同 VPN 使用的协议以及所提供的功能各不相同。有些提供安全功能（如身份验证和加密），而其他 VPN 可能根本不提供内置安全功能。显然，有些 VPN 要比其他 VPN 更易于设置和管理。
在本文中，我将介绍如何使用 Internet Security and Acceleration (ISA) Server 2006 来实施 VPN，重点讲解如何使用 ISA VPN 功能实现两种常见的方案：一种用来为用户提供 VPN 远程访问连接，另一种用来提供点对点 VPN 连接。这两种实施方案均包括安全功能，以确保数据隐私并保护内部网络资源。
在第一种方案（即远程访问 VPN 连接）中，远程客户端通过 Internet 启动与您的 ISA 服务器的 VPN 连接。然后，ISA 服务器将远程客户端连接到您的内部网络，从而为用户提供对内部网络资源（包括数据和应用程序）的无缝访问权限。在第二种方案（即点对点 VPN 连接）中，由于要用到路由器（可能是 ISA 本身），因此略为复杂。但此连接类型提供了将不同办公室或分支机构无缝连接到另一办公室或中央办公室的功能。
使用 ISA Server 2006 实施 VPN 还可以获得多个其他好处。最显著的好处之一在于 ISA Server 的集成特性，这就意味着 VPN 功能和防火墙功能可以协同工作。此外，ISA 服务器提供了 VPN 隔离功能，该功能在远程访问计算机的配置经过服务器端脚本验证之前，利用 Windows Server® 2003 的网络访问隔离控制功能对该远程访问计算机进行隔离。通过在允许远程计算机访问您的内部网络资源之前检查该远程计算机上的防病毒定义状态和本地防火墙策略等事项，这可以增加额外的一层保护。
ISA 服务器作为 VPN 解决方案提供的主要管理优势包括可以对策略、监视、登录和报告进行集中管理。对于您的日常管理职责，这些功能无疑是无价之宝。尤其是实时监视和日志筛选功能可使您深入了解通过 ISA 服务器的网络流量和连接。

VPN 协议
ISA VPN 连接中使用的核心隧道协议提供了保护连接的第一道防线。ISA 服务器支持以下三种协议 — IPsec 上的第 2 层隧道协议 (L2TP)、点对点隧道协议 (PPTP) 和 IPsec 隧道模式。最后一种协议仅受点对点连接支持，主要用于与路由器以及其他不支持 L2TP 或 PPTP 的操作系统之间的互操作性。
由于 L2TP 自身不提供数据隐私机制，因此 L2TP 要与 IPsec 结合使用。由于 Ipsec 能够提供可靠的身份验证和加密方法，因此结合使用 L2TP 与 IPsec 可提供颇有吸引力的解决方案。PPTP 使用 Microsoft® 质询握手身份验证协议 (MS CHAP) 版本 2 或可扩展的身份验证协议-传输层安全性 (EAP-TLS) 进行身份验证，使用 Microsoft 点对点加密 (MPPE) 进行加密（如您所料）。
一个组织选择 IPsec 上的 L2TP 还是 PPTP 通常取决于该组织的具体情况。IPsec 上的 L2TP 允许您使用更复杂更先进的加密方法，并支持更多的网络类型（包括 IP、X.25、帧中继和 ATM）；而 PPTP 更易于实施，并且通常要求也更少。也就是说，在不存在组织限制的情况下，建议最好使用 Ipsec 上的 L2TP。

点对点 VPN 连接
ISA Server 2006 在简化建立点对点 VPN 连接方面取得了重大进步。在早期版本中，建立点对点 VPN 的步骤非常多。对于此示例，我将讨论使用 IPsec 上的 L2TP 连接到中央办公室的一个远程站点（在这两个位置都安装了 ISA 服务器）。此过程要求在配置远程站点之前先配置中央办公室 ISA 服务器。
此过程的第一步是配置两个 ISA 服务器都需要的本地用户帐户。此用户身份将提供安全环境，在此环境下将建立与远程 ISA 服务器或主 ISA 服务器的连接。此帐户名称应与在 ISA 管理控制台内创建的 VPN 连接的名称相匹配。例如，有效的命名约定是在位于总部（指向远程站点）的 ISA 服务器上设置用户名“Site VPN”，在远程 ISA 服务器上设置用户名“HQ VPN”。创建这些帐户后，需要访问帐户属性，打开“拨入”选项卡，确保选中了“允许访问”选项。
创建本地用户帐户后，接下来要创建公钥基础结构 (PKI) 证书，用于在两个站点之间进行身份验证。您可以选择使用预共享的密钥，但使用证书一般是首选方法。为 VPN 连接安装证书的最简单方法是通过证书服务器的网站直接连接到自己的企业证书颁发机构，然后申请一个证书。但若要执行此操作，您可能需要创建一个访问规则，以允许 ISA 服务器通过 HTTP 连接到证书服务器。
如果您非常熟悉 ISA 服务器的早期版本，则会发现 ISA Server 2006 的界面（如图 1 所示）要直观得多。在左窗格中选择 VPN 后，中间窗格和右窗格中会显示上下文相关的配置和任务选项。
图 1 ISA Server 2006 具有更直观的界面
图 1 ISA Server 2006 具有更直观的界面
单击右窗格中的“创建 VPN 点对点连接”任务启动点对点 VPN 向导。向导启动后，将要求您填写点对点网络名称；此名称应与您先前创建的用户帐户名称匹配。输入名称后，按“下一步”按钮。在接下来的屏幕（参见图 2）中，选择要使用的 VPN 协议，在本示例中为 Ipsec 上的 L2TP。按“下一步”，向导将警告您必须使用与网络名称匹配的用户帐户，如果您已非常谨慎地执行了此操作，按“确定”转到下一屏幕。
图 2 选择要使用的 VPN 协议
图 2 选择要使用的 VPN 协议
现在，您必须创建一个 IP 地址池。在此，您有两种选择：在 ISA 服务器上创建一个静态地址池，或使用现有的 DHCP 服务器进行地址分配。由于这两种方法都是可接受的，因此您的决策应符合公司的程序，因为它们与此特定选项相关。此时，屏幕要求您输入远程服务器名称。输入远程服务器的完全限定的域名 (FQDN)，然后输入该连接的用户凭据。请记住，必须输入在远程 ISA 服务器上创建的用户帐户信息。在本示例中，即用户帐户 HQ VPN，如图 3 所示。
图 3 输入远程服务器的 FQDN
图 3 输入远程服务器的 FQDN
在下一屏幕中，选择传出身份验证方法（如上所述，首选使用证书）。然后，输入在远程站点的内部网络上使用的 IP 地址范围。
执行此操作后，如果您使用的是 ISA Server 2006 Enterprise Edition，则向导允许您配置远程站点的网络负载平衡专用 IP 地址。如果使用的是 ISA Server 2006 Standard Edition，则跳过负载平衡步骤，直接转到下一屏幕（参见图 4），在此步骤中，将创建用于路由从远程站点到本地网络流量的网络规则。
图 4 创建用于路由流量的网络规则
图 4 创建用于路由流量的网络规则
此外，您还必须创建一个访问规则，这是此过程的下一步。配置访问规则时，有三种用于允许协议的选项：您可以选择允许所有出站流量，允许除某些协议以外的所有出站流量，或者仅允许某些协议。在大多数情况下，您都希望选择所有出站流量选项。
此过程即将结束。此时，向导将显示您的配置摘要，按“完成”按钮，即完成创建点对点 VPN 连接。您会看到一个对话框，指示需要启用系统策略规则以便下载证书吊销列表，按“是”启用此规则。然后，此向导提供有关可能需要的任何其他配置步骤的信息。在主站点上完成 ISA 服务器配置后，需要使用完全相同的步骤来配置远程站点。完成这两个步骤后，位于这两个站点的用户即能够通过 VPN 进行通信。

远程访问 VPN 连接
配置远程访问 VPN 连接以使客户端访问更为简单（参见图 5）。第一步，在 ISA 服务器管理控制台的左窗格中选择 VPN。然后，在右窗格中选择“启用 VPN 客户端访问”任务。将出现一条警告，指示此操作可能导致重新启动路由和远程访问服务（因为这可能会导致连接问题，您可能希望在定期维护窗口期间实施此更改）。单击“确定”跳过此警告继续执行下一步骤；ISA 服务器使允许 VPN 客户端通信的系统策略能够访问 ISA 服务器。通过在 ISA 服务器管理控制台中选择“防火墙策略”，然后选择“显示系统策略规则”任务，可查看此策略。
图 5 配置远程访问 VPN 连接
图 5 配置远程访问 VPN 连接
还会启用默认的网络规则，以允许在内部网络和两个 VPN 网络（VPN 客户端和被隔离的 VPN 客户端）之间进行路由。通过在左窗格中选择网络，然后打开中间窗格中的“网络规则”选项卡，可查看此网络规则。
现在，您必须配置 VPN 客户端访问。还需要配置另外三个参数：允许访问的 Windows 安全组、客户端可能用到的协议以及用户映射。配置这些参数的对话框如图 6 所示。
图 6 配置 VPN 客户端访问
图 6 配置 VPN 客户端访问
“组”选项卡只要求选择允许通过 VPN 进行远程访问的 Windows 组。从管理角度来看，我认为最好创建一个给定权限的单独组。这可使管理远程访问变得非常容易。
默认情况下，“协议”选项卡显示仅启用了 PPTP。如果 Ipsec 上的 L2TP 在您的环境中完全切实可用，则一定要启用它。
用户映射允许您将用户帐户从命名空间（如远程身份验证拨入用户服务 (RADIUS)）映射到 Windows 帐户，从而确保正确应用访问策略。完成这些配置选项并将更改应用到 ISA 服务器后，整个配置过程即大功告成。现在，客户端将能够使用 VPN 连接无缝访问您的内部网络数据和应用程序。

ISA Server 2006 增强功能
ISA Server 2006 引入了大量增强功能，与以前版本相比，其功能和性能都有了显著提高。这些功能（包括 HTTP 压缩、后台智能传输服务 (BITS) 支持和服务质量 (QoS)）提供了优化网络使用率的各种技术。当然，即使有了这些技术，您还是应该继续使用通用的带宽优化技术（包括缓存），此技术是 ISA 服务器的核心。
近来，Microsoft 各种产品均支持 HTTP 压缩，此功能位于自版本 4 以后的 Internet Explorer® 和自 Windows® 2000 以后的 Windows Server 中。但这是第一个支持 HTTP 压缩以及行业标准 GZIP 和 Deflate 算法的 ISA 服务器版本。
这意味着什么呢？由于支持 HTTP 压缩，符合 HTTP 1.1 标准的 Web 浏览器可以从任何网站请求压缩的内容。但请记住，只能压缩响应，而不能压缩来自客户端的初始传出连接。
HTTP 压缩是一个全局 HTTP 策略设置，适用于通过 ISA 服务器传输的所有 HTTP 通信，反之，则与特定的网络规则关联。但是，您仍然可以选择对每个侦听器实施 HTTP 压缩；这可以通过 Web 侦听器向导进行配置。
默认情况下，HTTP 压缩处于启用状态，您可以通过左窗格中的“常规”选项卡来访问它。但是，如图 7 所示，您必须配置压缩会用到的网络元素。继续来看点对点 VPN 示例，您需要选择“返回压缩的数据”选项卡，并添加先前创建的站点 VPN 网络元素。此时，您还可以配置应压缩的内容类型。ISA Server 2006 附带一个标准内容类型列表，但您可以通过“工具箱”选项卡上的“防火墙策略”任务窗格添加自定义内容类型。请记住，“返回压缩的数据”选项卡指 ISA Server 在将数据返回到客户端之前对其进行压缩。为了使 ISA 服务器可以请求 Web 服务器在将数据发送到 ISA 服务器之前处理数据压缩，需要使用“请求压缩的数据”选项卡。
图 7 配置 HTTP 压缩
图 7 配置 HTTP 压缩
后台智能传输系统是适用于 HTTP 和 HTTPS 通信的一项异步文件传输服务。Windows Server 2003 包括 BITS 版本 1.5，此版本支持下载和上传，尽管上传还需要使用 Internet Information Services (IIS) 版本 5.0 或更高版本。作为一项智能文件传输服务，BITS 能够检查网络流量，并且仅使用网络带宽的空闲部分。此外，文件传输是动态的，而且 BITS 可通过限制其网络使用率来响应普通网络流量高峰。其优点在于 BITS 可确保下载和上传大型文件不会对其他网络使用产生不良影响。从管理员的角度来看，这意味着网络性能得到提高。好消息！
BITS 还具有其他优点，可大大改进用户体验并有助于改善网络性能。例如，使用 BITS 进行的文件传输是二进制的，这意味着 BITS 能够恢复由于网络中断等因素而中断的文件传输（不必从头开始）。ISA Server 2006 包括对 Microsoft Update 缓存功能的内置支持，此功能使用 BITS 缓存来优化更新。
差分服务 (DiffServ) 协议为 HTTP 和 HTTPS 通信启用数据包优先级（或 QoS）。换句话说，将根据您的 ISA 服务器配置优先接收特定的通信。这在因流量或网络连接速度而使带宽受到限制的网络上很有用。根据 Internet 工程任务组 (IETF) 的定义，DiffServ 是一个基于类的通信管理机制。因此，DiffServ 能够区分各种类型的通信并对其进行相应管理，从而确保优先选择高优先级的通信。
要提供此功能，需要将 ISA 服务器与支持 QoS 的路由器结合使用。如果希望按相同的优先级路由数据包，则必须确保 ISA 服务器 DiffServ 位与路由器上的优先级相匹配。
与 ISA 服务器中的实现一样，此类型的数据包优先级是一个 HTTP 策略设置，此设置是全局性的，并应用于使用 DiffServ Web 筛选器通过 ISA Server 2006 进行传输的所有 HTTP 通信。这意味着 ISA 服务器不支持将 DiffServ 用于其他协议，实际上可能会将 DiffServ 位置于非 HTTP 通信中。
如图 8 所示，DiffServ 作为 Web 筛选器实现，可以通过选择左窗格中的“加载项”进行访问。由于 ISA Server 需要在处理请求/响应期间检查其大小，因此不要更改 DiffServ 筛选器的默认设置或优先级顺序，这非常重要。
图 8 查看 DiffServ Web 筛选器
图 8 查看 DiffServ Web 筛选器
仔细观察图 8，您可能会注意到 DiffServ 筛选器在默认情况下未启用。要启用此筛选器，只需从“任务”窗格中选择“启用所选筛选器”，然后配置该筛选器。由于 ISA 服务器中的 DiffServ 数据包优先级基于特定的 URL 或域，因此需要将此信息添加到 DiffServ 首选项。要执行此操作，请在管理控制台的左窗格中选择“常规”，然后在“全局 HTTP 策略设置”下，选择“指定 DiffServ 首选项”。指定这些首选项时，必须定义优先级，还应确定 URL 和域的优先顺序。ISA Server 2006 提供了强大的新功能来为 VPN 客户端设置远程访问或创建点对点 VPN。考虑要实施哪种 VPN 解决方案时，应首先考虑采用它。

Alan Maddison是 MTI 技术公司的 Microsoft 技术实践高级顾问。他重点研究 Active Directory、Exchange Server 和虚拟化。


 SQL Server: 优化 SQL Server 查询性能
SQL Server Maciej Pilecki

优化 SQL Server 查询性能
概览:
  • 分析执行计划
  • 优化查询
  • 识别要优化的查询

优化数据库服务器时，您需要优化个人查询性能。这与优化服务器安装的其他影响硬件和软件配置等性能的方面一样重要 — 甚至更为重要。
即使数据库服务器是在功能最强大的硬件上运行，它的性能还是可能会因为一些行为错误的查询而受到负面影响。实际上，只要有一个坏的查询（有时称为“失控查询”），就可能导致数据库出现严重的性能问题。
反之，通过优化一组成本最高或最常执行的查询，可以极大地提高数据库的整体性能。在本文中，我将探讨一些技术，您可使用这些技术识别并优化服务器上成本最高和性能最坏的查询。

分析执行计划
优化个人查询时，通常通过查看查询的执行计划开始。此执行计划描述 SQL ServerTM 为满足查询和生成所需结果集而执行的物理和逻辑操作的顺序。此执行计划是在查询处理的最优化阶段由称为查询优化器的数据库引擎组件生成的，这要考虑到许多不同的因素，例如，查询中使用的搜索谓词、涉及的表和其连接条件、返回的列清单，以及是否存在能用作数据的有效访问路径的有用索引。
对于复杂的查询，所有可能排列的数量可能非常大，因此查询优化器不评估所有的可能性，而是尝试查找对于给定查询“足够好”的计划。这是因为并不总能查找完美计划；即便可能，评估所有可能性以查找完美计划的开销与所获得的性能改进相比起来，也很可能会得不偿失。从 DBA 观点来看，了解其过程和局限性很重要。
有许多方法可用于检索查询的执行计划：
  • Management Studio 提供显示实际执行计划和显示估计执行计划等功能，这将用图形方式来呈现计划。这些功能为直接检查提供了最适合的解决方案，是目前最常用的显示和分析执行计划的方法（在本文中，我将使用以这种方式生成的图表计划来说明我的示例）。
  • 各种 SET 选项，例如 SHOWPLAN_XML 和 SHOWPLAN_ALL，会以 XML 文档或行集的形式返回执行计划，XML 文档使用特殊架构描述计划，行集中则包含对执行计划中的每个操作的文字说明。
  • SQL Server Profiler 事件类，例如 Showplan XML，允许您收集跟踪所收集语句的执行计划。
虽然 XML 形式的执行计划可能不是人们最容易读懂的格式，但此选项允许您编写能分析执行计划的步骤和实用程序，以查找性能问题的迹象及不够理想的计划。基于 XML 的表示也可保存到具有 .sqlplan 扩展名的文件中，然后在 Management Studio 中打开以生成图形表示形式。还可以保存这些文件以稍后供分析使用，当然，这样就不用在每次想要分析时重新生成执行计划。当您希望比较计划来查看计划随时间的变化情况时，这尤其有用。

估计的执行开销
对于执行计划，首先您需要了解它们是如何生成的。SQL Server 使用基于开销的查询优化器，也就是说，它会试图使用最低的估计开销来生成执行计划。该估计值是根据优化器评估查询所涉及的每个表时，提供给优化器的数据分发统计资料得到的。如果那些统计资料丢失或过期，查询优化器将缺少查询优化过程所需的重要信息，因而可能会得到错误的估计值。在这类情况下，优化器可能会由于高估或低估不同计划的执行开销而选择不太理想的计划。
对于估计的执行开销，有一些常见的错误假定。特别是，人们常常假设估计的执行开销能够很好地指示查询需花多长时间执行，而该估计值能让您分出好的计划和坏的计划。实际情况并不是这样。首先，表达估计开销采用什么单位以及它们是否与执行时间有直接关联都已记录得相当清楚。其次，由于这只是一个估计值，且可能并不正确，因此，在 CPU、I/O 和执行时间方面，有时候，尽管具有较高估计开销的估计值高一些，但效率反而比较高。这通常发生在涉及表变量的查询中 — 因为没有统计数据可用于表变量，即使表变量中包含许多行，查询优化器都始终假设表变量中仅包含一行。因而，查询优化器会基于不准确的估计值选择计划。因此，比较各查询的执行计划时，不应只依赖估计的查询开销，而应在分析中包含 STATISTICS I/O 和 STATISTICS TIME 选项输出结果，以了解 I/O 和 CPU 时间方面的实际执行开销。
在此，有个称为并行计划的特殊类型的执行计划值得一提。如果您在具有多个 CPU 的服务器上运行查询，并且您的查询符合并行执行的条件，则可以选择使用并行计划（通常，查询优化器只对其开销超出特定的可配置阈值的查询考虑使用并行计划）。由于管理多个并行执行的线程（指跨线程分发任务、执行同步以及收集结果）会产生开销，因此执行并行计划开销更大，这会在估计开销中有所体现。那么，为什么并行计划比较为便宜的非并行计划更受欢迎呢？这是因为多个 CPU 的处理能力发挥了威力，并行计划得出结果的速度往往比标准计划更快。根据您的特定方案，包括来自其他查询的可用资源和并行负载一类的变量，此情形可能正是您的设置所期望的。如果真是这样，您应控制哪些查询能够生成并行计划，以及每个查询有多少 CPU 可供利用。通过在服务器级别设置最大并行度选项，然后根据需要在单个查询级别使用 OPTION (MAXDOP n) 覆盖它，即可达到此目的。

分析执行计划
现在，我要让大家看一个简单的查询以及该查询的执行计划和改进其性能的一些方法。假设我使用 Management Studio 执行查询，并在 SQL Server 2005 上的 Adventure Works 示例数据库中启用了“包括实际的执行计划”选项：
SELECT c.CustomerID, SUM(LineTotal)
FROM Sales.SalesOrderDetail od
JOIN Sales.SalesOrderHeader oh
ON od.SalesOrderID=oh.SalesOrderID
JOIN Sales.Customer c ON oh.CustomerID=c.CustomerID
GROUP BY c.CustomerID
结果，我看到了图 1 中所述的执行计划。此示例查询计算每个 Adventure Works 客户发出的订单总数。看一下这个执行计划，您会看到数据库引擎是如何处理查询并生成结果的。应按从上到下、从左到右的顺序阅读图形执行计划。每个图标都代表一个执行的逻辑和物理操作，箭头指示操作之间的数据流向。箭头厚度代表操作之间传递的行数，箭头越厚，包含的行数越多。如果将指针放在其中一个运算符图标上，会在黄色的工具提示（如图 2 所示）中显示此具体操作的详细信息。
图 1 执行计划示例
图 1 执行计划示例
图 2 操作详细信息
图 2 操作详细信息
通过查看每个运算符，可以分析所执行步骤的顺序：
  1. 数据库引擎对 Sales.Customer 表执行聚集索引扫描操作，然后返回该表中所有行的 CustomerID 列。
  2. 然后它对 Sales.SalesOrderHeader 表中的一个索引执行索引扫描（指非聚集索引扫描）。这是 CustomerID 列上的一个索引，但在其中也暗含了 SalesOrderID 列（表聚集键）。扫描会同时返回这两列中的值。
  3. 来自两个扫描的输出都使用“合并联接”物理运算符联接到 CustomerID 列（这是执行逻辑联接操作的三种可用物理方法中的一种。此方法速度很快，但需要在联接的列上对这两个输入进行排序。在本例中，两个扫描操作均已返回在 CustomerID 排序的行，因此无需另外执行排序操作）。
  4. 接下来，数据库引擎对 Sales.SalesOrderDetail 表上的聚集索引执行扫描，从此表内的所有行中检索四列（SalesOrderID、OrderQty、UnitPrice 和 UnitPriceDiscount）的值（估计此操作将返回 123、317 行，而实际上也确实如此，您可以从图 2 中的“估计行数”和“实际行数”属性中看到。因此，该估计非常准确）。
  5. 聚集索引扫描生成的行将传递到第一个“计算标量”运算符，这样，根据公式中涉及的 OrderQty、UnitPrice 和 UnitPriceDiscount 列，即可计算出每行的计算列 LineTotal 的值。
  6. 根据计算列公式的需要，第二个“计算标量”运算符将对上一计算的结果应用 ISNULL 函数。这样就完成了对 LineTotal 列的计算，并将计算结果连同 SalesOrderID 列一起返回到下一运算符。
  7. 通过使用“哈希匹配”物理运算符，联接步骤 3 中“合并联接”运算符的输出内容与步骤 6 中“计算标量”运算符的输出内容。
  8. 然后，对由 CustomerID 列值和计算所得的 LineTotal 列的 SUM 合计从“合并联接”返回的行组应用另一个“哈希匹配”运算符。
  9. 最后一个节点 SELECT 既不是物理运算符也不是逻辑运算符，而是一个占位符，用以表示总计查询结果和开销。
在我的便携式计算机上，此执行计划的估计开销是 3,31365（如图 3 所示）。如果在 STATISTICS I/O 处于 ON 状态时执行此计划，查询报告对涉及的三个表执行了共计 1,388 个逻辑读取操作。每个运算符下显示的百分比表示与整个执行计划的总体估计开销相关的每个单个运算符的开销。看一下图 1 中的计划，可以看出整个执行计划的大部分总开销都与以下三个运算符相关联：Sales.SalesOrderDetail 表的聚集索引扫描以及两个哈希匹配运算符。但在对其进行优化之前，我想指出我的查询中的一个非常简单的改动，这一改动将允许我同时消除两个运算符。
图 3 查询的总估计执行开销
图 3 查询的总估计执行开销
由于我从 Sales.Customer 表中返回的只是 CustomerID 列，而此列又是 Sales.SalesOrderHeader 表中的外键，因此，我能够使用以下代码从查询中完全消除生成的 Customer 表，并且不必更改查询所生成的逻辑意义或结果：
SELECT oh.CustomerID, SUM(LineTotal)
FROM Sales.SalesOrderDetail od JOIN Sales.SalesOrderHeader oh
ON od.SalesOrderID=oh.SalesOrderID
GROUP BY oh.CustomerID
这样就产生了另一个执行计划，如图 4 所示。
图 4 从查询中去除了 Customer 表的执行计划
图 4 从查询中去除了 Customer 表的执行计划
以下两个操作被完全消除：Customer 表的聚集索引扫描以及 Customer 与 SalesOrderHeader 之间的合并联接，并且哈希匹配联接将由更高效的合并联接取代。但是，为在 SalesOrderHeader 和 SalesOrderDetail 表之间使用“合并联接”，必须返回经过联接列 SalesOrderID 排序的两个表中的所有行。为实现此目的，查询优化器决定对 SalesOrderHeader 表执行聚集索引扫描，而不使用非聚集索引扫描，这样在涉及的 I/O 方面开销较低。此示例很好地说明了查询优化器的实际工作原理：由于更改执行联接操作的物理方式所节省的开销要比聚集索引扫描生成的附加 I/O 开销多，因此，查询优化器选择得出的运算符组合，因为它产生的总估计执行开销可能会是最低的。在我的便携式计算机上，尽管逻辑读取数量上升了（已升至 1,941），但所耗费的 CPU 时间实际上却少了，并且此查询的估计执行开销也下降了大约 13％ (2,89548)。
假设我希望进一步改进此查询的性能。现在我要看一下 SalesOrderHeader 表的聚集索引扫描，此运算符已成为该执行计划中开销最大的运算符了。由于我只需要使用此表中的两列来填充查询，因此我可以创建一个只包含这两列的非聚集索引，这样，即可通过对小得多的非聚集索引进行扫描来替代对整个表的扫描。索引定义可能会如下所示：
CREATE INDEX IDX_OrderDetail_OrderID_TotalLine
ON Sales.SalesOrderDetail (SalesOrderID) INCLUDE (LineTotal)
请注意，我创建的索引包含一个计算列。并不一定总会这样，具体情况取决于对计算列的定义。
创建此索引并执行同样的查询后，我得到一个新的执行计划，如图 5 所示。
图 5 优化后的执行计划
图 5 优化后的执行计划
对 SalesOrderDetail 表进行的聚集索引扫描已被非聚集索引扫描取代，后者的 I/O 开销要小得多。我还消除了其中的一个“计算标量”运算符，因为我的索引中包含已计算出的 LineTotal 列的值。现在，估计执行计划开销是 2,28112，并会在执行查询时进行 1,125 次逻辑读取。

覆盖索引
客户订单查询练习
问：下面是客户订单查询练习：请尝试给出索引定义 — 要成为此查询的覆盖索引，应包含哪些列，以及索引定义中的列顺序是否会对性能产生不同影响。
答：我向您发出挑战，要给出为本文中的示例查询在 Sales.SalesOrderHeader 表上创建的最佳覆盖索引。为实现此目的，您需要注意的第一件事就是查询仅使用表中的两列：CustomerID 和 SalesOrderID。如果您仔细阅读了本文，就会发现在 SalesOrderHeader 表中，有一个包含此查询的现成索引，即 CustomerID 上的索引，并且此索引也暗含了 SalesOrderID 列，该列为此表的聚集键。
当然，我也已经介绍了查询优化器为什么决定不使用此索引。确实，您可以强制查询优化器使用此索引，但与使用聚集索引扫描和合并联接运算符的现有计划相比，该解决方案的效率要差一些。这是由于您将强制查询优化器在以下两者之间作出选择：执行额外的排序操作以便继续使用“合并联接”，或返回使用效率相对较低的“哈希联接”。与现有计划相比，上述两种选择的估计执行开销都比较高（进行排序操作的那一种执行起来效率尤其低），所以，除非使用强制手段，否则查询优化器不会使用它们。因此，在这种情形下，与聚集索引扫描相比，执行起来效果更好的唯一一个索引就是 SalesOrderID 和 CustomerID 上的非聚集索引。但请注意，这两列必须按以下顺序排序，这很重要：
CREATE INDEX IDX_OrderHeader_SalesOrderID_CustomerID
ON Sales.SalesOrderHeader (SalesOrderID, CustomerID)
如果创建此索引，则执行计划将包含索引扫描运算符，而不是聚集索引扫描运算符。这是一个重要区别。在此情形下，只包含两列的非聚集索引将比聚集索引形式的整个表小得多。因此，读取必要数据所需的 I/O 就更少。
此示例还显示了索引中列的顺序对于它在查询优化器中的用处有何重要影响。设计多列索引时，请务必记住这一点

我在 SalesOrderDetail 上创建的索引是所谓的“覆盖索引”的一个示例。它是一个包含填充查询所需的所有列的非聚集索引，无需使用表扫描运算符或聚集索引扫描运算符扫描整个表。此索引实际上是表的一个小型副本，包含该表中所有列的一个子集。只有需要响应查询的那些列才包含在该索引中，换句话说，该索引仅包含需要“覆盖”查询的列。
为最常执行的查询创建覆盖索引是查询优化中使用的最简单最常见的一种技术。当表中包含很多列，但查询最常引用的只有很少几列时，此类索引尤其适用。通过创建一个或多个覆盖索引，可以大大改进受影响的查询的性能，因为这些索引要访问的数据量小得多，从而使产生的 I/O 开销更少。但在执行数据修改操作（插入、更新和删除）期间，还存在维护附加索引所需的隐含开销。您应根据您的环境以及 SELECT 查询与数据修改之间的比例，仔细判断此附加索引的维护开销相对于查询性能的改进是否值得。
不必害怕创建多列索引（相对于单列索引而言）。多列索引往往比单列索引有用得多，查询优化器更有可能使用它们来覆盖查询。大多数的覆盖索引都是多列索引。
在我的示例查询中，仍然有改进的余地，将覆盖索引置于 SalesOrderHeader 表中可以进一步优化此查询。这将消除聚集索引扫描，而采用非聚集索引扫描。我将此留给您进行练习。请尝试给出索引定义 — 要成为此查询的覆盖索引，应包含哪些列，以及索引定义中的列顺序对性能是否有不同影响。要查看解答，请参见“客户订单查询练习”边栏。

索引视图
如果我的示例查询的性能非常重要，我可以多执行一个步骤来创建可实际存储查询的具体结果的索引视图。索引视图存在某些先决条件和限制，但如果能使用索引视图，可以显著改善性能。请记住，与标准索引相比，索引视图需要的维护开销较高。因此，应仔细斟酌在何时使用索引视图。在本例中，索引定义如下所示：
CREATE VIEW vTotalCustomerOrders
WITH SCHEMABINDING
AS
SELECT oh.CustomerID, SUM(LineTotal) AS OrdersTotalAmt, COUNT_BIG(*) AS TotalOrderLines
FROM Sales.SalesOrderDetail od
JOIN Sales.SalesOrderHeader oh
ON od.SalesOrderID=oh.SalesOrderID
GROUP BY oh.CustomerID
请注意 WITH SCHEMABINDING 选项，此选项是在此类视图上创建索引的先决条件；还要注意 COUNT_BIG(*) 函数，如果我们的索引定义中包含聚合函数（在此示例中是 SUM），则此函数是必需的。创建此视图后，可以在其上创建一个索引，如下所示：
CREATE UNIQUE CLUSTERED INDEX CIX_vTotalCustomerOrders_CustomerID
ON vTotalCustomerOrders(CustomerID)
创建此索引时，包含在视图定义中的查询结果已具体化，并以索引形式实际存储在磁盘中。请注意，对基础表执行的所有数据修改操作接着会根据其定义自动更新视图中的值。
如果我现在返回查询，会产生什么结果取决于我运行的 SQL Server 版本。在 Enterprise Edition 或 Developer Edition 中，查询优化器会自动将此查询与索引视图定义匹配，并使用索引视图，而不是查询所涉及的基表。图 6 显示了本示例中生成的执行计划。此计划仅由一个操作组成：对我在视图上创建的索引进行聚集索引扫描。估计执行开销仅为 0,09023，并且只执行 92 次逻辑读取。
图 6 使用索引视图时的执行计划
图 6 使用索引视图时的执行计划
在 SQL Server 的其他版本中，仍然可以创建并使用此索引视图，但为达到同样的效果，必须使用 NOEXPAND 提示将查询更改为直接参考该视图，如下所示：
SELECT CustomerID, OrdersTotalAmt
FROM vTotalCustomerOrders WITH (NOEXPAND)
您可以看到，如果使用得当，索引视图可以成为一项非常强大的功能。它们在优化对大量数据进行聚合的查询时最为有用。如果用在 Enterprise Edition 中，这些视图对许多查询都有用，并且不要求更改代码。

识别要优化的查询
我怎样识别值得优化的查询？我要查找执行得最为频繁的查询，单独执行这些查询的开销可能并不高，但执行这些查询的总计开销可能要比很少执行的大型查询的开销高得多。我并不是说您不应该优化大型查询，只是觉得应先关注最常执行的查询。那么，您如何识别这些查询呢？
遗憾的是，最可靠的方法有点复杂，涉及到跟踪对您的服务器执行的所有查询，然后根据其签名进行分组（即，带有实际参数值的查询文本将由占位符取代，以识别相同的查询类型，即便查询是使用不同的参数值执行的也一样）。这是一个复杂的过程，因为查询签名很难生成。Itzik Ben-Gan 在其《Microsoft SQL Server 2005: T-SQL Querying》一书中介绍了一种解决方案，此解决方案使用 CLR 用户定义的函数和正则表达式。
还有一种比较简单的方法，但可靠性较差。您可以依赖在执行计划缓存中为所有查询保留的统计数据，并使用动态管理视图查询这些数据。图 7 中包含一个示例查询，此示例向您显示缓存中累计逻辑读取次数最高的 20 个查询的文本和执行计划。对于快速识别会产生最高逻辑读取次数的查询而言，此查询非常便利，但也存在一些限制。即，此查询只显示在运行查询时缓存了其计划的那些查询。如果有未缓存的内容，这些内容就会丢失。
Figure 7 识别前 20 个在读取 I/O 方面开销最大的查询 (Close Figure 7)
SELECT TOP 20 SUBSTRING(qt.text, (qs.statement_start_offset/2)+1,
        ((CASE qs.statement_end_offset
          WHEN -1 THEN DATALENGTH(qt.text)
         ELSE qs.statement_end_offset
         END - qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.min_logical_reads, qs.max_logical_reads,
qs.total_elapsed_time, qs.last_elapsed_time,
qs.min_elapsed_time, qs.max_elapsed_time,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
WHERE qt.encrypted=0
ORDER BY qs.total_logical_reads DESC
识别这些拙劣的查询后，您可以查看其查询计划，并利用我在本文中介绍的一些索引技术来寻找改进其性能的方法。如果能够成功完成，表示您的时间没有白费。
快乐优化！

Maciej Pilecki是 Solid Quality Mentors 的准顾问，这是一家专门致力于培训、指导和咨询的全球性组织。他是 Microsoft 认证培训师 (MCT) 和 SQL Server 最有价值专家 (MVP)，并经常讲授关于 SQL Server 和应用程序开发的诸多方面的课程并在讨论此类内容的会议上讲话。


 编辑视角: 为您增添能源
编辑视角
为您增添能源

上月的问题 激发了我希望继续探讨绿色计算主题的欲望。确实，该主题尚未明确定义（什么是绿色？如果我的汽车每加仑行驶了 30 英里而不是 25 英里，那么这算绿色吗？提醒您一下，我并没有汽车。我住在纽约。我们步行）。
似乎每家著名的公司都努力在自己的产品或服务上贴上“绿色”标签。这就足以解释为什么此时和上月封面都出现该主题 — 发展前景无限啊。
我们都知道它不仅可以保护环境，还可以增加收益。事实上，有利于生态环境已经成为产生实际效益的卖点。（“这就是经济，傻瓜！”）如果汽车公司可以通过提高汽车的效率来销售更多的汽车，那就太好了。最后，希望我们可以在健康、可持续发展的环境的基础上发展健康的经济。
那么这对 IT 专业人员有什么影响呢？Jonathan Koomey 博士是劳伦斯伯克力国家实验室的一名科学工作者和斯坦福大学的顾问教授，他最近发布了一项评估美国以及世界各地的服务器能源消耗总量的调查。2005 年，美国的数据中心（服务器及其支持的基础结构，如散热系统）消耗的能源占美国能源总消耗量的 1.2% — 这是五个 1000 兆瓦特 (MW) 发电厂的总输出量，成本高达 27 亿美元。世界各地的总成本高达 72 亿美元（相当于 14 个 1000 MW 发电厂的总输出量）。这笔可观的财富和能源是可以节省的，大部分相关工作可以从数据中心内部开始。
如何规划数据中心资源？如何根据需求调整资源，而无需始终以 100% 状态运行（提示：虚拟化）？我们对服务器进行监视以查看网络连接、内存使用率等，但又有谁注意过能源消耗呢？旧式服务器消耗的能源是否要远远多于新型计算机？增加的成本是否超过了更换计算机的成本？
在接下来的几个月内，我们的常驻专家之一 Dave Ohara（上月文章的作者，该文章现已在 technetmagazine.com 中联机提供）将以我们自己在昆西、华盛顿和圣安东尼奥以及德克萨斯州构建的绿色数据中心为例，向您展示 Microsoft 对此展开的工作，并介绍如何回答部分上述问题。我们也希望知道您是如何处理这些问题的（如果您选择不这样做，请告诉我们原因）。可以向 tnmag@microsoft.com 发送电子邮件与我们联系，或访问我们的博客：blogs.technet.com/tnmag。 —Joshua Hoffman

向以下 Microsoft 技术专家致以衷心的感谢：Tim Carroll、Omesh Desai、Steve Jenness、Sam Kroonenburg、Mutlu Kurtoglu、KC Lemson、Tim Mintner、Jim Truher、Buck Woody 以及 Sudarshan Yadav。


 工具箱: 面向 IT 专业人员的新产品
工具箱
面向 IT 专业人员的新产品
Greg Steen

视频屏幕捕获
My Screen Recorder Pro
deskshare.com/msrpro.aspx
假定您要在 20 分钟后参加会议，但仍需要整理有关新系统配置的演示文稿。或者，您可能发觉自己几乎每天都要和不同的用户浏览相同的应用程序教程。如果经常遇到这种情况，此处将提供一个技巧：从 DeskShare 签出 My Screen Recorder Pro。
顾名思义，通过此应用程序您可以将桌面上发生的活动记录为视频，从而为客户端提供了一个整理即席演示文稿或可重用教程的最佳方法。My Screen Recorder Pro 还支持音频记录，因此，还可以在记录的同时提供旁白（提示：在开始记录前创建脚本或大纲）。
创建新的视频相当简单。选择想要记录的区域（整个桌面、可自定义的桌面区域、桌面的固定部分或者特定应用程序窗口），然后单击“记录”按钮。
该应用程序可记录到 AVI、Windows Media® Video (WMV) 或 Flash，因此您将能够相对轻松地分发结果，甚至还可以将视频嵌入到网页中或传播给公众使用。还可以为视频创建可执行文件，以便在大多数 Windows® PC 上本地播放该视频。将该视频嵌入到可执行文件中，简化了分发过程并使最终用户相当直观地观看重播。
如果教程或演示文稿分为多个部分，可以将多个段整合到一个视频中。或者，如果需要对视频进行适当编辑，可以根据需要拆分或剪切记录。
虽然通常可以使用默认配置，但该应用程序允许您调整帧速率、音频质量和压缩设置以使其最符合您的环境。这对于解决可能遇到的任何大小或带宽限制问题非常有用。还可以使用简单的慢镜头模式创建记录，这将允许您对长时间运行的记录部分进行压缩（如慢速进度条）。另一项有用功能是可更改记录的鼠标光标并添加鼠标指针效果，以便引起对在记录会话过程中所发生操作的注意。例如，在单击鼠标按钮时，可放大指针或者在其周围显示圆环。另外，可以为记录添加标题和时间戳，以便用于存档。
对于过于隐晦、警惕和谨慎的人来说，My Screen Recorder Pro 允许您计划记录，并从命令行运行该程序，从而使您可以选择紧密监视工作站上的活动。最后，该应用程序包含内置功能，可用于将视频发布到 FTP 站点。如果与计划程序结合使用，则此选项可用于审计。

价格：单个许可证 99 美元（零售价）。
通过记录桌面上发生的操作创建演示文稿

磁盘碎片整理
PerfectDisk 8
raxco.com/products/PerfectDisk2k
对于所有 Windows 系统，硬盘碎片整理都是必要的。如果您和我一样，不断添加或删除应用程序、功能和软件更新。有大量磁盘碎片整理实用工具可供选择 — 事实上，在上个月我就介绍了一种。不过，碎片整理非常重要，而且 Raxco Software 提供的 PerfectDisk 8 也非常值得讨论。虽然 Windows 的各种版本都包含碎片整理工具，但有时您需要使用一种可通过碎片整理操作提供更精确控制的实用工具。如果是这样，让我们看一看 PerfectDisk。
正如您对 Windows 碎片整理工具的期待，PerfectDisk 8 可对 FAT16、FAT32 和 NTFS 驱动器进行碎片整理，还允许您对 RAID 驱动器进行碎片整理。在桌面和服务器版本中都可以获得 PerfectDisk 8，它通过了 Windows Vista® 认证，并且支持 Windows 的其他版本，包括 Windows Server® 2003 和 Windows 2000。它甚至还支持 Exchange 版本。
公司推崇其 SMARTPlacement 技术，该技术尝试组织磁盘上的文件结构，以获得更快的访问速度。例如，在 Windows XP 系统中，SMARTPlacement 技术负责管理启动和 layout.ini 文件，按某种方法对这些文件进行排序以减少系统启动时的磁盘寻道时间。除了对整个驱动器进行碎片整理外，还可以选择对单个文件进行碎片整理，这在下载大型 ISO 文件后非常有用。
若要处理通常在操作系统运行时无法进行的棘手系统文件，该应用程序将使用能够在下次系统启动时运行的脱机模式，或者在适当的条件下，该应用程序可尝试卸载磁盘以运行碎片整理。另一个强大的功能是 PerfectDisk 的屏幕保护程序碎片整理模式，它允许您在屏幕保护程序运行时自动开始碎片整理。
PerfectDisk 还包括命令行版本，允许您通过首选任务计划程序轻松计划碎片整理，并通过可能在系统上运行的任何系统管理代理启用远程执行。对于大型部署，还应该继续操作并下载免费的 PerfectDisk Command Center，它允许您远程部署、更新、计划和配置跨企业的工作站应用程序。

价格：PerfectDisk 8 Professional（适用于桌面）的单个许可证起步价为 39.99 美元。PerfectDisk 8 Server 的单个许可证起步价为 239.99 美元。
PerfectDisk 提供了许多配置选项

书评
Network Warrior
oreilly.com
如果您的商店运行 Cisco 设备，则可能需要购买一份 Gary Donahue 编写的《Network Warrior》（网络勇士）(O'Reilly, 2007)。对于广大读者来说，无论您是刚接触网络领域、最近获得了 CCNA 证书，还是渴望提高网络技术的有经验的系统管理员，此书都是非常宝贵的资源。
我尤其喜欢此书是因为它基于网络技术的现实应用程序，并且向您提供了对网络专业人员在日常活动中遇到的许多常见任务的快速参考。此书从基础知识开始讲述，准确定义了组成网络的最基础元素。接着概述了集线器、开关、VLAN、中继和 VLAN 中继协议 (VTP)，以及具有跨树协议 (STP) 的跨树技术和 Cisco 系统的 EtherChannel 技术。
在《Network Warrior》（网络勇士）中，您将获得使用 Cisco 的 Internetwork Operating System (IOS) 和 CatOS 命令行接口 (CLI) 命令的基本示例，以及各种方法和技术的说明。我喜欢该书提供当前方法背后的一些历史背景的方法，在此过程中形成一些真知灼见（如为什么仍然存在 CatOS，而不是仅有 IOS）。
本书包含对路由器和常规路由的介绍，您可以了解从指标路由到不同路由协议的管理距离的基本知识。还可以获得有关协议的概述，如开放最短路径优先 (OSPF)、边界网关协议 (BGP) 和路由信息协议 (RIP)。
在 Cisco 的热备用路由协议 (HSRP) 部分中，作者深入介绍了可用性，并提供了一些基本配置以避免在网络基础结构中出现故障。接着，作者回顾了某些 Cisco 多层开关（包括 Cisco 6500 和 Catalyst 3750）的特性和功能并讨论了您可能遇到的某些基本配置。
我发现与电信领域有关的信息很有用。本书教给您一些术语，以避免下次遇到它们时，感到困惑。您将了解有关以下方面的充足信息：信道服务单元/数据服务单元 (CSU/DSU)，配置 DS3 连接以及可实际使用电信技术转化的多节点帧中继。
还有一部分对安全性和防火墙进行了详细介绍，显示了如何设计和配置文件访问控制列表 (ACL)，并提供了身份验证、DMZ 和特定 PIX 防火墙配置选项。我喜欢对防火墙理论的简要概述，强调根据“否定一切，允许所需”和“安全是便利与妄想之间的平衡”使用网络。
《网络战士》的最后一部分提供了对网络设计的深入见解，介绍了常见网络基础结构设计（如三层电子商务配置和没有分发层的折叠核心网络）的基础，并简要强调了文档和命名约定的重要性。

价格：订价 44.99 美元。

管理文件锁
WhoLockMe
dr-hoiby.com/WhoLockMe
如果每个应用程序都能正确关闭文件，那该有多好啊。但是，遗憾的是，事实并非如此。共享冲突可能真的很麻烦，而且要找出当前锁定某个文件的进程会更加麻烦。我不知道您是不是也这样认为，但是我恨透了只为控制某个文件，就得一个一个地关闭应用程序。幸运的是，名为 WhoLockMe 的免费且简单的 Windows 资源管理器扩展可提供帮助。
Windows NT®、Windows 2000、Windows Server 2003 和 Windows XP 提供此应用程序，它可使您找出当前锁定所需文件的进程。只需右键单击并在 Windows 资源管理器上下文菜单中进行选择即可。
WhoLockMe 会向您显示锁定文件的进程的名称、进程标识符 (PID)、已打开文件的路径、进程执行上下文的域和用户以及指向错误因素的完整路径。如果敢于铤而走险的话，则可选择直接从用户界面关闭该进程。
遗憾的是，WhoLockMe 尚未得到更新，因此不能用于 Windows Vista。但是，如果您运行的是早期版本的 Windows，此应用程序会是一种便捷而有效的工具，可用于查找对您需要移动、删除或编辑的文件进行了锁定的用户或程序。

价格：免费

DNS 工具
DNSStuff.com
www.dnsstuff.com
如果处理面向 Internet 的应用程序或网络，则必然需要依赖 DNS 帮助您对其进行管理，以保持一切顺利运行，并允许外部人员了解您以及您的应用程序所在的位置。在 DNSstuff.com 出现 DNS 问题时，我依赖一个来自 DNSstuff.com 的工具集。此基于 Web 的工具集合是用于排除故障和验证基础结构配置的宝贵资源。
该站点针对域、IP、主机名、电子邮件、网站和常见网络问题提供了 45 种以上不同的查询工具，可帮助您完成从验证邮件服务器配置到检查 DNS 托管速度的所有操作。当然，您可能会发现基础结构中已经存在与大多数工具具有等效功能的工具，但是外部验证可提供用于故障排除的重要信息。并且您不必麻烦公司同事为您执行反向 DNS 检查。
该站点上最强大、最全面的工具之一是 DNSreport。只需输入域名、单击按钮，就可以检索到有关设置的丰富信息。每个测试行条目将显示彩色编码状态，这有助于对测试结果进行快速扫描，以检查是否存在潜在问题。该报告将检查域的父区域，向您显示名称服务器 (NS) 记录以及是否发送 IP 地址和主机名等详细信息。该报告还会检查潜在的安全漏洞，验证 DNS 服务器并非开放式服务器、它们都具有相同的 NS 记录并且没有在非 NS 请求中泄漏任何“隐蔽的”NS 记录。
还可以深入了解设置的可用性，如适用于多个名称服务器的 DNSreport 测试、公共 IP 绑定以及检查单点故障时缺失的名称服务器。此外，DNSreport 将检查授权起始点 (SOA) 详细信息，返回 SOA 序列号、刷新、过期、重试和最短生存时间 (TTL) 值并对 MNAME 和 RNAME 记录执行检查。
该报告的邮件交换 (MX) 记录检查将对反向 DNS 条目进行验证，并确保不存在任何重复记录且记录具有有效的主机名。此外，该工具可尝试连接到邮件服务器并验证诸如以下内容的项目：邮件服务器的主机名是否合适、它是否接受 abuse@yourdomain 邮件（如在各种 RFC 中指定），以及 SMTP 服务器当前是否配置为开放中继（全球各地垃圾邮件的“青睐对象”）。最后，DNSreport 将返回 www A 记录，确认所有 IP 都是公共的，并确定 CNAME 配置是否会导致额外的 DNS 查询。
如果 DNSreport 不能满足您的需要，该站点还允许您使用一个查询工具来检查邮件服务器是否在一系列众所周知的垃圾邮件数据库中列出，并且可使用另一个工具查找域的非法联系人。可以执行 IP Whois 查询、traceroute 和 ping 操作，也可以在主要 ISP 中执行常规 DNS 查询和缓存 DNS 查询。甚至可以执行 NETGEO IP 查询、MAC 地址检查并在订阅时完成区域文件转储。总而言之，这是一组十分有价值的工具。

价格：对于单个用户成员来说，每月 3 美元（完全访问和无限查询权限）。
DNSstuff.com 提供了一整套便利的监控工具

Greg Steen是一位专业技术人员，他酷爱钻研技术。他总是在寻找各种新工具，以帮助 IT 专业人员更轻松地进行操作、问答和开发。


 Exchange Queue &amp; A: 保护电子邮件协议的安全、神秘垃圾邮件及更多内容
Exchange Queue & A
保护电子邮件协议的安全、神秘垃圾邮件及更多内容
Nino Bilic and Scott Landry
本专栏的部分内容讨论了 Windows Server 2008 的预发布版本，其中的具体信息可能会有所更改。

问：我想使用安全的 SMTP — 如何使 Exchange Server 在端口 465 上侦听 SMTP？
答：很遗憾，您的目的无法实现。您的确可以使 SMTP 虚拟服务器或接收连接器在端口 465 上进行侦听，但这也不能保证使用安全的 SMTP (SMTPS)。
为什么？让我们来解释一下。SSL 分为两种类型：显式和隐式。最初，大部分 SSL 是隐式的，意味着使用了 SSL 的专用端口。例如，默认情况下 HTTP 位于端口 80 上，而 HTTPS（带有 SSL 的 HTTP）位于端口 443 上。几年前，Internet 社区决定不再将专用端口用于 SSL。因此，显式 SSL 应运而生。
虽然 Netscape 已将 465 选作 SMTPS 端口，但 Exchange Server 在 SMTP 中不提供 SSL 功能。不过，Exchange 团队看到了显式 SSL 的优点（客户端和服务器都可以使用它），因此他们支持 SMTP 使用显式 SSL。
对于 SMTP，显式 SSL 使用 STARTTLS ESMTP 命令指示现有套接字将受到保护。大部分其他 SMTP 服务器和客户端供应商也已实施了 STARTTLS 命令，所以已经没有太大必要支持端口 465，况且这也不是官方 Internet 标准。
迄今为止，还没有一个 Exchange Server 版本支持 SMTP 使用隐式 SSL。让 Exchange 接收连接器或 SMTP 虚拟服务器在端口 465 上进行侦听也无法改变这个事实。因此，您需要使用在端口 25 上支持 STARTTLS 的客户端。如果无法使用端口 25，则逻辑上也可选择 587，它是客户端 SMTP 提交的标准端口。现在客户端一般在端口 25 上均支持 STARTTLS，所以已无需添加对隐式 SSL 的支持。
顺便说一下，Exchange POP3 和 IMAP4 协议通常支持隐式 SSL。但在 Exchange Server 2007 中，现已为这两个协议添加了对显式 SSL 的支持。但由于支持此较新标准的客户端还不多，隐式 SSL 将继续存在一段时间。

问：我们向许多域发送了大量邮件，它们却处于排队状态 — 我的所有用户都无法发送任何一封邮件。这是怎么回事？如何防止这种情况？
答：此问题不只您一个人遇到。在 Internet 上拥有服务器的任何人都可能遇到此问题。一般有两个原因。第一个原因是您不小心对自己开放了中继功能（请参阅 support.microsoft.com/kb/304897）。但是，您当然不愿意这么做，对吧？（从 Exchange Server 2000 开始，默认情况下已禁用开放中继）。所以您很可能收到未送达报告 (NDR) 垃圾邮件。在发送未经请求的商业电子邮件 (UCE) 的过程中，垃圾邮件发送者经常将其发送到您的域中并不存在的地址。您的服务器尝试使垃圾邮件发送者知道他发送到的用户不存在，当然，这样垃圾邮件发送者便已骗到返回地址。垃圾邮件发送者可能骗到无效地址（在这种情况下，NDR 将挂起一段时间直到过期），或者他可能试图使您的服务器代表他将垃圾邮件作为您的服务器生成的 NDR 附件发送到另一个域。
您可以禁用 NDR，但如果此后合法用户不小心键入了错误地址，您的服务器将使其永远不知道该邮件未送达，并可能会遗失重要邮件。这里有一个比较好的解决方案。
首先，请确保您未开放中继（我只是必须这么说）。然后，启用某种反垃圾邮件筛选功能，例如智能邮件筛选器 (IMF)、Exchange Server 2007 内容筛选器或实时阻止列表 (RBL)。这些操作可以在边缘传输角色或集线器传输角色中进行，但由于 90% 以上的邮件可能是垃圾邮件而且您也不希望服务器忙于处理这些垃圾，所以应在第一个跃点执行这些操作。
最后，在将邮件接收到您的环境中的第一个 Exchange Server 上启用收件人筛选功能。这样，您的服务器就能够在邮件进入您的网络之前拒绝它。键入错误地址的合法用户仍可以收到 NDR，但此 NDR 将由发件人的服务器生成。

问：我有一台运行 Exchange Server 2000 的服务器和一台运行 Exchange Server 2003 的服务器，它们都可以将邮件成功发送到 Internet。后来，我在两台服务器上安装了 Exchange Server 2007，但现在每台服务器的邮箱都不能发送邮件。
答：如果以前只有一个 Exchange Server，则您可能对连接器的概念不太熟悉。Exchange 连接器是通知 Exchange 将电子邮件发送到何处的逻辑路由配置对象。在将 Exchange Server 2007 引入现有组织后，您必须配备路由组连接器和 SMTP 连接器才能路由邮件。
您需要两个路由组连接器，一个从 Exchange Server 2007 路由组到 Exchange Server 2003 路由组，另一个正好相反。您可以在安装过程中做此设置，但如果忘记了对其进行设置或不确定是否已设置，可以使用 Exchange 命令行管理程序进行检查并纠正此问题。否则，您将无法在服务器间发送邮件。邮件会停滞在无法送达的目标队列中。
若要路由 Internet 邮件，您只需一个 SMTP 连接器，在 Exchange Server 2007 中也称为发送连接器。您应该在 Exchange Server 2000 和 Exchange Server 2003 上安装一个 SMTP 连接器，但您可能已拥有未安装该连接器的版本。对于所有域，地址空间均应为 SMTP:*，并且您可以指定使用智能主机还是 DNS 来传送邮件。选择使用 Exchange Server 2007 服务器还是更早版本的服务器来处理传出的 Internet 邮件；如果您希望每台服务器处理各自的传出 Internet 邮件，也可以在两个路由组中各创建一个连接器。如果已安装边缘传输服务器角色，还可以在 Edgesync 过程中创建其中一个连接器。
如果您以前曾在 SMTP 虚拟服务器上放置了一台智能主机，现在可以将其删除。智能主机只应放在 SMTP 连接器上，绝不应该放在虚拟服务器上，否则会破坏路由组连接器。
此外，还应注意入站电子邮件由 MX 记录或防火墙转发到达的 IP 控制。在 Exchange 端不需要进行很多配置，但如果您仍遇到问题，以下文件可能会有所帮助：msexchangeteam.com/archive/2006/11/17/431555.aspx。

问：为什么我在 Exchange Server 2007 中会收到针对同一邮件的多个日志报告？
答：Exchange Server 2007 传输日志代理会记录经过分类的邮件日志。分类程序使邮件出现分支重复（即复制邮件正文并在不同副本上放置不同的信封收件人）的原因有很多。示例如下：由于现在您能够参考日志来确定邮件发送时通讯组的成员关系，所以获得多个报告的一种可能情况是存在嵌套的通讯组。
报告功能中新增这一内容后,您可能获得同一邮件的多个副本，每个单独的报告一份副本。无法保证获知邮件的所有报告是否都已送达，但如果您正在存档，您会希望与存档供应商合作以确保档案已对其做了更改。

问：为什么在 Exchange Server 2007 中找不到将无法解析的邮件转发到主机的功能？现在我该怎么办？
答：此功能已取消。
实际上，此特定功能在具有多个 Exchange Server 的情况下一直不能正常运行。Exchange 已找到另一种方法来完成同样的工作，而且该方法的功能更加强大。尤其是，您能够与其他系统共享单个 SMTP 域。所以“转发无法解析的邮件”功能被取消，而引入了共享域的概念且执行起来很简单。在 Exchange Server 2007 中，只需转到“组织”|“集线器传输”|“接受域”并将域类型从“授权”改为“内部中继”即可。对于某些环境，实际情况可能要比这些略为复杂，我们正在努力更新部分文档。但同时，它应该也会有所帮助。

问：我正在尝试为 Exchange Server 2007 的安装准备根域。尝试运行 Exchange Server 2007 安装程序的服务器已安装了 Exchange Server 2003 Exchange 系统管理器 (ESM)，但安装却失败了。问题在哪儿？
答：简言之，不支持在安装了 Exchange Server 2000 或 2003 组件的计算机上运行 Exchange Server 2007 安装程序的任何部分。因为如果安装了 Exchange Server 2003 ESM，Exchange Server 2007 安装程序就会发现它，安装程序先决条件检查将失败并通知您“此计算机上已安装了 Exchange Server 的早期版本。请在其他计算机上运行 Exchange Server 2007 安装程序或删除 Exchange Server 早期版本”。
解决此问题的最简单方法是在根域的另一服务器上只运行 Exchange Server 2007 安装程序，并以该方法准备域。如果不可行，则必须在继续运行 Exchange Server 2007 安装程序前卸载 Exchange Server 2003 组件。
请记住，您可以使用 32 位版本的 Exchange Server 2007 准备域，所以根域中的所有 32 位服务器通常都可用。有关此主题的详细信息，请参阅 technet.microsoft.com/library/bb232170.aspx。
顺便说一下，不支持在同一台计算机上同时存在 Exchange Server 2003 和 Exchange Server 2007 管理工具，这意味着您不能将 Exchange Server 2003 ESM 和 Exchange Server 2007 Exchange 管理控制台安装在同一台计算机上。如果试图在已安装 Exchange Server 2000 或 Exchange Server 2003 组件的计算机上进行安装，Exchange Server 2007 将阻止安装程序的运行。
最后，请注意不应试图在同一台计算机上先安装 Exchange Server 2007 管理工具，然后安装 Exchange Server 2003 工具。这种做法导致的配置未经过测试，在您尝试管理服务器时可能出现意外结果。如果您需要在一台计算机上管理两种服务器版本，可以使用远程桌面连接一个版本，或使用虚拟机在隔离的环境中承载不同版本的管理工具。

问：那么，我到底何时才能在我的 Windows Vista® 工作站中运行 Exchange Server 2007 管理工具？
答：Exchange Server 2007 SP1 会在 Windows Vista 中提供对 Exchange Server 2007 管理工具的官方支持。一旦 Exchange Server 2007 SP1 发布，即可下载包含 Exchange Server 2007 SP1 管理工具的程序包。

问：那么，何时才可以在 Windows Vista 或 Windows Server 2008 中运行 Exchange Server 2003 ESM？我是否也可以这样运行？
答：不可以，很遗憾无法这样运行。早于 Exchange Server 2007 SP1 的任何 Exchange Server 版本的管理工具在 Windows Vista 或 Windows Server 2008 中都不受支持。这意味着即使发布 Windows Server 2008 后，也不支持在其上安装 Exchange Server 2003 ESM。Exchange Server 2003 服务器的管理必须在 Windows Server 2003 或 Windows XP 工作站上执行；此外，也可以从任何操作系统使用远程桌面连接。

问：我的域中运行着多个 Exchange Server 2003 服务器。我能否将域控制器升级为 Windows Server 2008 域控制器？
答：当然可以，支持在具有 Windows Server 2008 域控制器的域中运行 Exchange Server 2003 SP2。请注意，Exchange Server 不能使用 Windows Server 2008 只读域控制器 (RODC) 或只读全局编录服务器 (ROGC)。将 Exchange Server 手动指定（硬编码）为使用 Windows Server 2008 RODC/ROGC 可能会导致意外行为。

Nino Bilic是 Exchange Server 的可支持性项目经理，他利用晚上临睡前的空闲时间阅读大量 Netmon 记录，研究服务器到服务器通信的优点。
Scott Landry是 Exchange Server 的支持升级工程师，他总是随身携带毛巾、指南及他信赖的 Windows Mobile 手机。


 实用工具特别推荐: 适用于 Windows PowerShell 的 SMS Cmdlet
实用工具特别推荐
适用于 Windows PowerShell 的 SMS Cmdlet
Don Brown
下载这篇文章的代码: Utility2007_11.exe (1211KB)

过去，无法从命令行对 Microsoft System Management Server (SMS) 2003 客户端进行管理。幸运的是，最近出现了许多可帮助管理员管理复杂性、更改和配置的优良技术，其中的 Windows PowerShell 可以帮助解决此问题。
为了利用这项技术，我编写了一个小“实用程序”— SMS2003PowerShellSnapinSample（您可以在本专栏附带的代码下载中找到它，可从 technetmagazine.com/code07.aspx 上在线获得代码下载）。该实用程序实际是组合成一个 Windows PowerShellTM 管理单元的六个 cmdlet 的集合。使用这些 cmdlet，您可以从 Windows PowerShell 为本地计算机或远程计算机组配置 SMS 客户端本地策略。
对 SMS 客户端本地策略研究的越多，发挥的作用越大。额外的好处是，我还逐渐了解到有关 SMS 如何工作的更多内容。我了解到，通过谨慎应用 SMS 客户端本地策略，可以用全新方式控制 SMS 客户端：报告到相同站点的计算机无需都具有相同的配置。各种想法开始在脑海中出现 — 从设置特定计算机以便不需要权限来远程控制计算机，到更改客户端检查新策略的频率，再到在一天中的不同时间禁用特定的组件 — 您会发现使用 SMS 客户端本地策略没什么限制。让我们进一步了解一下。

关于 SMS 高级客户端本地策略
编程资源
  • Windows PowerShell 简介适合 Windows PowerShell 新手的很好的入门文章
  • TechNet 论坛：使用本地策略自定义 SMS SMS 高级客户端本地策略的基于 MOF 的应用程序
  • 创建您的第一个 Cmdlet
  • 如何创建 Windows PowerShell 管理单元
  • Windows Server 2008 的网络访问保护 (NAP)
  • Windows PowerShell 程序员指南适用于那些希望获得有关 Windows PowerShell 的编写 cmdlet、管理单元、主机和其他编程帮助的详细信息的人员
  • Windows Server 2008 Beta 3 分步指南

所有功能 SMS 2003 高级客户端都有一个配置策略，它本质上是驱动其各种组件的设置列表。所有客户端、清单收集和软件分发设置（还有其他设置）都包含在这些配置策略中。策略本身是在站点服务器上创建的，并通过 SMS 管理点传到高级客户端。
SMS 策略的实际主体类似于托管对象格式 (MOF) 文件，因为它包含将要编译到高级客户端上的 \\.\root\CCM WMI（Windows® 管理规范）命名空间的一组实例。然后，各种其他代理将读取位于 \\.\root\ccm\policy\machine\requestedconfig 命名空间中的这些设置。但是，当通过 MOF 应用本地策略时，您仅可以在一台计算机上编译 MOF 并且它必须本地运行（确切地说，是当您直接登录计算机时）。但是由于其分布式特征，WMI 既可以本地访问又可以远程访问，因而产生了更多可以协助 SMS 管理员的方式。这意味着只要授予适当的管理权限，您就可以像连接到本地计算机上的 WMI 一样轻松连接到远程计算机上的 WMI。
SMS 客户端策略由各种客户端组件的配置设置组成，但是它还可能包括执行软件数据包内容的说明。像 Active Directory® 组策略一样，从 SMS 管理点获得的 SMS 2003 高级客户端策略可能会被 SMS 客户端本地策略覆盖。您不能覆盖策略的所有部分，但是可以覆盖某些确实值得注意的属性。这就赋予了 SMS 管理员对 SMS 客户端配置和操作进行更大程度的控制，因为它允许 SMS 站点上所应用的标准配置出现异常。
以一个安全稳固的环境为例，在此环境中，SMS 管理员将服务器和工作站作为单一 SMS 主站点的客户端来管理。在此虚构的环境中，安全策略可能声明，在技术支持专家可以对其计算机进行远程控制之前，必须提示用户输入权限。但如果技术支持专家希望使用远程控制来连接到服务器，那将明显成问题了：因为在通常情况下，没有用户登录到服务器，也不会有任何人授予远程控制权限。虽然应用本地策略时非常谨慎，但仍可能会在特定客户端覆盖用户权限的要求。您可能还可以想到许多其他情况，其中，SMS 本地策略可能在许可特殊的 SMS 客户端代理配置异常方面很有用。

Windows PowerShell 管理单元内幕
您对 Windows PowerShell 的基本知识有一些了解后，就可以添加到本专栏提供的示例源代码，以扩展您可以从命令行对 SMS 客户端本地策略执行的操作。在将类展现给 Windows PowerShell 之前，应该将一些特定的属性应用到该类。您需要确定该 cmdlet 的使用目的和应该执行什么操作。这就是所谓的“动词-名词”配对。在 Windows PowerShell 中，您会看到的一些常见动词有 Add、Get 和 Set。名词部分描述了您要对其执行操作的对象。Cmdlet 通常有一些在 Cmdlet 类中声明为各种类型公共属性的参数。最后，您需要使用 ProcessRecord 函数完成大部分工作。图 1 显示了您可用于自己的 cmdlet 的通用模板。
Figure 1 Cmdlet 模板 (Close Figure 1)
[Cmdlet( "Verb", "Noun", SupportsShouldProcess = true )]
public class Verb_Noun : PSCmdlet
{
    [Parameter( ValueFromPipeline = true, ValueFromPipelineByPropertyName = true,
        HelpMessage = "Parameter" )]
    [ValidateNotNullOrEmpty]
    [Alias( "param" )]
    public string Parameter
    {
        get { return MyParameter; }
        set { MyParameter = value; }
    }
    private string MyParameter;

    protected override void ProcessRecord( )
    {
        //Do your stuff here!
    }
}
编译完您的管理单元以后，您可以在定义了 RunInstaller 属性集和一些特定属性的项目中添加一个类别，向 Windows PowerShell 注册该管理单元。请参见本文附带的源代码以获得详细信息。要注册管理单元，您需要使用 Microsoft® .NET Framework 附带的 InstallUtil.exe 工具。图 2 显示了注册管理单元所要使用的语法。请注意，在 Windows Vista® 中，这是一项需要提升权限的操作，因此，您可能希望使用“以管理员身份打开”选项或使用 Windows Vista 的脚本提升 PowerToy（可从 technetmagazine.com/issues/2007/06/UtilitySpotlight 下载）来打开 Windows PowerShell。
Figure 2 安装 Windows PowerShell 管理单元 (Close Figure 2)
PS> set-alias installutil $env:windir\Microsoft.NET\Framework\v2.0.50727\installutil
PS> installutil C:\MySMSTools\SMS2003PowerShellSnapinSample.dll
Microsoft (R) .NET Framework Installation utility Version 2.0.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.
Running a transacted installation.
...
The transacted install has completed.
下一步是查看管理单元是否已经过 Windows PowerShell 确认。使用带有 Registered 参数的 Get-PSsnapin cmdlet，Windows PowerShell 会汇总列出当前加载的管理单元，后面附有将添加的已注册管理单元的列表。您的管理单元应可以在以下列表中找到：
PS> Get-PSsnapin -registered
现在可以使用 Add-PSsnapin cmdlet 将 Windows PowerShell 管理单元添加到外壳，如下所示：
PS> add-pssnapin SMS2003PowerShellSnapinSample
如果操作成功，您应能够在 Windows PowerShell 管理单元中执行 cmdlet。
要查看在任何 Windows PowerShell 管理单元中都可用的所有 cmdlet，只需使用 Get-Command cmdlet 指定特定的管理单元即可，这样就会将管理单元的名称作为 PSsnapin 参数的值传递。本专栏附带的示例管理单元显示了六个 cmdlet，包括 Verb-Noun Cmdlet 模板，如图 3 所示。
图 3 显示管理单元中的 cmdlet
图 3 显示管理单元中的 cmdlet
在示例源代码中，我仅为 Get-SMSServerConnection cmdlet 编写了帮助来说明它是如何构建的。如果您希望扩展帮助，可以在 XML 文件中找到范例。图 4 显示了帮助输出。
Figure 4 Get-Help 输出示例 (Close Figure 4)
PS > get-help Get-SMSServerConnection

NAME
    Get-SMSServerConnection

SYNOPSIS
    This cmdlet establishes a connection to the specified SMS primary site server using your current credentials. An object of type "SMSProvider" is returned through the pipeline.

SYNTAX
    Get-SMSServerConnection [-SMSServerName] [<string>] [<CommonParameters>]

DETAILED DESCRIPTION
    This Cmdlet makes a connection to the specified SMS primary site server.  An object of type "SMSProvider" is returned. The "SMSProvider" object is not serializable and is used only to forward on through the pipeline to other cmdlets.

RELATED LINKS
现在，您已了解如何安装 Windows PowerShell 管理单元、如何查看管理单元中有哪些命令以及如何获得有关典型 cmdlet 的帮助，让我们开始使用这些 cmdlet 吧。要在 SMS 主站点服务器上显示所有集合的列表，可使用以下命令：
PS > Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | Format-Table Name
请注意使用管道。这是 Windows PowerShell 工作原理的核心部分，是一种功能非常强大的工具。只需一行就有可能在 Windows PowerShell 中做任何事情。Get-SMSServerConnection cmdlet 建立了与 SMS 服务器的连接。由于 Get-Collections cmdlet 具有由 Get-SMSServerConnection 返回的类型的单一输入参数，因此，您可以直接将输出从 Get-SMSServerConnection cmdlet 传递到 Get-Collections cmdlet。这就是管道工作的原理，也是您如何在 cmdlet 之间传递复杂对象的极好示例。您还可以在变量中存储对象，如果您正在 Windows PowerShell 脚本中执行此操作，它可能会如下所示：
$SMS = Get-SMSServerConnection
     -server MYSMSSERVER
Get-Collections -SMSServerProvider $SMS
如果不对输出进行一番精心的格式设置，输出阅读起来可能有些困难，这是因为 Get-Collections 返回 SMSCollection 类型的对象（它本质上是 SMSCollection 类型的对象的一个数组）。简言之，除非筛选出您没有兴趣查看的集合，或者对只包含您所关心的属性的表的显示进行格式设置，否则，显示不会很好看。您可以通过使输出经过管道从 Get-Collections cmdlet 传递到 Format-Table cmdlet 实现此操作，这样可以仅显示您指定的那些属性。例如，您可以附加 | Format-Table Name, Members。
但是，有一种更好的显示特定集合的所有成员的方法，在本示例中为 Get-CollectionMembers。该 cmdlet 返回一个字符串数组，代表集合每个成员的名称。正如您可能已经猜到的，这是将管道传递给下一个 cmdlet 的良好选择。
到现在为止，还没有涉及到 SMS 高级客户端本地策略 — 只是连接到 SMS 主站点服务器以及列举集合和集合成员。该示例 Windows PowerShell 管理单元中包含的最后两个 cmdlet，分别为 Enable-SoftwareDistribution 和 Disable-SoftwareDistribution。SMS 客户端本地策略会在这里派上用场。最后的这两个 cmdlet 为 SMS 高级客户端上的软件分发客户端代理组件操作 SMS 客户端本地策略。正如您可能已经通过 cmdlet 的动词部分猜到的，Disable 将添加一个指定软件分发客户端代理应被禁用的客户端本地策略覆盖。同样，动词 Enable 将删除所有客户端本地策略覆盖，使软件分发客户端代理返回其正常状态，这是由 SMS 管理点交付的 SMS 策略定义的。图 5 显示了一个 Windows PowerShell 单行指令示例，该示例将 SMS 客户端本地策略覆盖添加到软件分发客户端代理上，从而强制 Windows Server 2003 系统自定义集合的所有成员都禁用它。此外，还列出了用于删除同一集合上软件分发客户端代理的所有 SMS 客户端本地策略覆盖的单行指令。如果您只希望在几台计算机上操作 SMS 客户端本地策略，也可以单独使用 Disable-SoftwareDistribution 和 Enable-SoftwareDistribution cmdlet。
Figure 5 组建 cmdlet — 示例 (Close Figure 5)
PS >Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | where-object {$_.Name -eq "Windows Server 2003 Systems"} | Get-CollectionMembers | Disable-SoftwareDistribution
PS >
PS > Get-SMSServerConnection -server MYSMSSERVER | Get-Collections | where-object {$_.Name -eq "Windows Server 2003 Systems"} | Get-CollectionMembers | Enable-SoftwareDistribution
PS >
PS >Disable-SoftwareDistribution –hosts SMSCLIENT1, SMSCLIENT2, SMSCLIENT3
PS >
PS >Enable-SoftwareDistribution –hosts SMSCLIENT1, SMSCLIENT2, SMSCLIENT3

后续步骤
本文附带的示例源代码可以为您学习将 SMS 客户端本地策略覆盖应用到计算机组提供了很好的起点。此处的示例仅涉及 SMS 软件分发客户端代理，而且只涉及 Enabled 属性。其他客户端代理有更多属性，您可以用同样的方式应用覆盖。现在您已有了初步的了解，按逻辑下一步是查看 SMS 客户端本地策略的其他部分。您可以考虑一下，哪些托管系统组可以成为 SMS 客户端本地策略覆盖的候选者，以及使用哪些本地策略覆盖对您而言比较有意义。最后需要注意的一点是：最好事先了解您可能会遇到的情况，因此要在实验室环境中全面测试一切内容。

Don Brown是 Microsoft 的一位高级现场解决方案工程师，从很久以前他就一直在研究和支持 SMS（啊嗨，就是 SCCM）。请通过 donbrown@microsoft.com 与他联系。


 网络专家: 无线单一登录
网络专家
无线单一登录
Joseph Davies

建立的无线连接必须通过专用网络进行身份验证，这为用户和管理员等带来另一层次的难题。基于 Windows 的无线客户端是 Active Directory 域的组成部分，它必须执行基于 IEEE 802.1X 的身份验证才能获得受保护的
无线连接和域登录。因为身份验证涉及到用户凭据或计算机凭据，而且域登录依赖于网络连接，所以在配置身份验证的执行顺序和指定使用的凭据时，将会出现问题。所有这些都会影响域登录并使用户多次收到提供凭据的提示。
幸运的是，Windows Vista® 中的无线单一登录允许在用户登录前指定对 Wi-Fi 安全访问 2 (WPA2)-企业和 WPA-企业进行 IEEE 802.1X 身份验证，对无线对等保密 (WEP) 进行 802.1X 身份验证。这将使您可以在特定配置中解决域登录问题。无线单一登录还可以实现无线身份验证与 Windows® 登录体验的无缝集成，从而使用户更乐于接受。鉴于以上原因，本月我将介绍一下无线单一登录的功能、配置方法以及用户登录过程中的操作方法。

单一登录基础知识
Windows 无线客户端只需使用计算机凭据或用户凭据或两者就可以对无线网络执行身份验证。仅使用计算机凭据时，在显示 Windows 登录屏幕前，Windows 将执行 802.1X 身份验证。这可使无线客户端计算机较早访问网络资源（如 Active Directory® 域控制器）。
仅使用用户凭据时，未进行单一登录的 Windows 在完成用户登录过程后执行 802.1X 身份验证。图 1 显示了此种情况的启动和登录时间线。
图 1 仅使用用户凭据进行无线身份验证的时间线
图 1 仅使用用户凭据进行无线身份验证的时间线
由于不存在本地缓存的用户帐户凭据，并且无法连接到域控制器对新登录凭据进行身份验证，所以仅使用用户凭据进行无线身份验证将出现用户无法经由初始域登录到计算机的后果。另外，因为此时无法连接到 Active Directory 域的域控制器，所以一些域登录操作将会失败。登录脚本、组策略更新以及用户配置文件更新将会失败，从而导致 Windows 事件日志出现错误。
一起使用用户凭据和计算机凭据时，在显示 Windows 登录屏幕前，Windows 将使用计算机凭据执行 802.1X 身份验证。用户登录后，Windows 将使用用户凭据再执行一次 802.1X 身份验证。有些网络基础结构对使用计算机凭据和用户凭据进行身份验证的计算机分别使用不同的虚拟 LAN (VLAN)。如果在用户登录过程完成后对使用用户凭据的无线网络进行身份验证和转换到用户身份验证的 VLAN，Windows 无线客户端会在用户登录过程中无权访问用户身份验证 VLAN 上的网络资源，如 Active Directory 域控制器。同样，这将导致域登录操作失败。
如果使用用户凭据进行的无线身份验证使用不同于用户登录凭据的安全凭据，将会出现其他问题。对于这些配置，Windows 将在开始无线身份验证时提示使用其他用户凭据，这很容易引起混淆。
Windows Vista 的单一登录功能旨在解决域登录问题、隔离计算机身份验证和用户身份验证的 VLAN，并提示用户在不同时间使用不同的凭据。通过单一登录，网络管理员可指定在执行用户登录过程前使用用户凭据进行无线身份验证。当用户登录和无线身份验证所需的用户凭据不同时，Windows 登录屏幕将请求和收集所有需要的凭据。
通过单一登录，可将 Windows Vista 无线客户端配置为在用户登录前使用用户凭据执行无线网络身份验证。图 2 显示了新的启动和登录时间线。
图 2 用户登录前使用用户凭据执行的无线网络身份验证的时间线
图 2 用户登录前使用用户凭据执行的无线网络身份验证的时间线
这允许不同的 VLAN 仅使用用户凭据或使用用户凭据和计算机凭据两者的配置，而不会减少任何功能。由于无线客户端在用户开始登录前具有网络连接或到通过用户身份验证的 VLAN 的连接，所以域登录操作会成功完成。有关示例，请参阅 microsoft.com/technet/network/wifi/vista_bootstrap_wireless.mspx 中的“将 Windows Vista 无线客户端连接到域”。
基于无线配置文件的配置，单一登录合并了无线身份验证用户凭据的输入字段，并将它们添加到 Windows 登录屏幕上。因此，用户同时提供用户登录和使用用户凭据进行无线身份验证的所有用户凭据。
为 Windows Vista 中新的 EAPHost 体系结构编写的可扩展身份验证协议 (EAP) 方法可使用 EAP 登录前身份验证提供程序 (PLAP) 支持 API，以涵盖 Windows 登录屏幕上身份验证所需的输入字段。有关详细信息，请参阅 msdn2.microsoft.com/bb530584 中的 SSO 和 PLAP API。
作为单一登录会话的示例，请考虑将 Windows Vista 无线客户端配置为仅使用用户凭据、用户名和密码进行身份验证以供执行域登录和 802.1X 身份验证。当用户在初始 Windows Vista 屏幕按下 Ctrl+Alt+Del 时，单一登录则可确定必须在用户登录前进行 802.1X 身份验证。当用户键入其用户名和密码时，单一登录将首先执行基于用户的无线网络身份验证，然后将显示一条消息指示已按用户名连接到无线网络。执行无线身份验证后，Windows Vista 将执行用户登录并显示用户桌面。

配置单一登录
幕后
为了加深您对无线身份验证过程的了解，我们来更详细地看一下用户实际尝试登录后会出现什么情况。当用户按下 Ctrl+Alt+Del 以便在运行 Windows Vista 的无线客户端上进行用户登录时，将执行以下步骤：
  1. 无线自动配置确定要使用的无线网络配置文件。如果无线客户端已成功使用计算机凭据执行了身份验证，则使用当前连接的无线网络配置文件。如果确定的无线配置文件配置为仅使用计算机凭据进行身份验证，则无需使用用户凭据进行其他无线身份验证。步骤 2 到 6 假设所选的无线配置文件配置为使用用户凭据执行身份验证，启用了单一登录，并选择了“用户登录前立即执行”设置。
  2. 用户键入用户登录和无线身份验证（如果需要）所需的凭据，然后启动用户登录。
  3. Windows 将为用户显示一条消息，指示正在尝试连接到无线网络名称。
  4. Windows 将尝试使用用户凭据执行无线网络身份验证。如果启用了“在单一登录过程中允许显示辅助对话框”设置，并且 EAP 类型需要为用户显示辅助对话框，则 Windows 将显示这些对话框。如果在连接最大延迟（以秒计）期间未成功进行无线身份验证，则会放弃进行无线身份验证。如果选择了“本网络使用不同的 VLAN 对计算机凭据和用户凭据进行身份验证”设置，则在无线身份验证成功后，Windows 将对无线网络适配器的 IP 地址配置执行 DHCP 续订。
  5. Windows 将执行用户登录过程。
  6. Windows 将显示桌面。
如果选择了“用户登录后立即执行”设置，Windows 将会按以下顺序执行这些步骤：1、2、5、3、4、6。

若要启用和配置单一登录，可以使用无线网络 (IEEE 802.11) 策略组策略扩展并为 Windows Vista 策略的无线配置文件配置高级安全设置。有关详细信息，请参阅 technetmagazine.com/issues/2007/04/CableGuy 上的“Windows Vista 的无线组策略设置”。
在“高级安全设置”对话框中，可根据需要为此网络选择“启用单一登录”，并配置单一登录选项。图 3 显示了已启用且具有默认设置的单一登录示例。
图 3 默认的单一登录设置
图 3 默认的单一登录设置
单一登录可以设置为在用户登录过程前后立即执行 802.1X 无线身份验证，也可指定在开始用户登录过程前执行 802.1X 身份验证的延迟时间。您还可以指示在 Windows 登录屏幕上是否显示除输入字段合并外的对话框。例如，如果 EAP 类型希望用户确认在身份验证过程中从“远程身份验证拨入用户服务”(RADIUS) 服务器发送的证书，EAP 类型可显示该对话框。
您还可以指定在执行基于用户的身份验证后，无线客户端应对无线适配器的 TCP/IP 配置启动“动态主机配置协议”(DHCP) 续订。如果基于计算机和用户身份验证的无线客户端使用不同的 VLAN，并且这些 VLAN 属于不同的 IPv4 或 IPv6 子网，请选择此选项。
在策略中创建了包含单一登录设置的无线配置文件后，也可以通过将配置文件导出为 XML 文件，然后在 Windows Vista 无线客户端导入该 XML 文件来配置 Windows Vista 无线客户端。
若要创建单一登录的 XML 无线配置文件，请使用适当的无线单一登录设置创建无线配置文件。在 Windows Vista 无线策略的“常规”选项卡上，单击单一登录设置的无线配置文件，然后单击“导出”。出现提示后，可指定配置文件 XML 的文件名及其位置。
若要使用 XML 配置文件来配置另一 Windows Vista 无线配置客户端，请使用以下命令导入 XML 配置文件：
netsh wlan add profile filename=
    "[FileName].xml"
若要确定某个无线配置文件是否启用了单一登录，请使用：
netsh wlan show profile=[ProfileName]
单一登录设置列在 netsh wlan show profile 命令显示的“Security settings”部分和 Windows 事件日志中无线连接事件的文本中。您也可以使用事件查看器管理单元查看应用程序和服务日志的 Microsoft\Windows\WLAN-AutoConfig 文件夹中的事件，其来源为“WLAN-AutoConfig”，事件 ID 为 13001、13002、13003 和 13004。
有关详细信息，请参阅 microsoft.com/wifi 上的无线联网网页。然后查看“幕后”侧栏以获取有关单一登录过程的更多详细信息。

Joseph Davies是 Microsoft 的一位技术撰稿人，从 1992 年起一直在培训和编写 Windows 联网主题。他曾为微软出版社编写了五本著作，并且是月刊《TechNet 杂志》网络专家专栏的作者。


 研究说明: 使用高性能计算与 HIV 对抗
研究说明
使用高性能计算与 HIV 对抗
Kristin Firth 和 Mia Matusow

当想到医学研究工作者时，您是否会联想起身穿白色实验室工作服、手持试管和显微镜工作的男士和女士？或许是大学或医药公司的一组化学家？这是对医学研究的普遍印象，当然这也是真实的，但是这些只代表
该领域的一个方面。事实上，某些医学研究是在极为不同的环境下进行的。
了解到 Microsoft Research 正在开发人体免疫缺损病毒 (HIV) 疫苗的工作中起着重要的作用时，您可能会感到吃惊。而且，也没有看到 Microsoft 在进行这项工作时使用什么本生灯设备。环境看起来就像其他普通办公环境，有整齐的书桌和许多 PC。
那么 Microsoft 在所有这些研究中扮演什么角色呢？这些身穿白色实验室工作服的人 — 各所大学和研究中心（包括波士顿的麻省总医院、英国哥伦比亚大学、华盛顿大学、Fred Hutchinson 癌症研究中心和澳大利亚的默多克大学）的科学家 — 收集了大量的项目数据。Microsoft Research 的 eScience 小组由大约六个人组成，其中大部分成员居住在华盛顿州的雷蒙德（有一名成员居住在新墨西哥州），他们帮助这些研究人员处理和分析大量的数据。早在 2003 年，Microsoft Research 首次加入这一项目，现在，eScience 小组与科学家在多个项目中合作，这些项目致力于处理影响社会的一些问题。该团队与外部的科学家密切合作，为项目构建自定义解决方案，分析处理数据和分析结果。
在一个高优先级的项目中，Microsoft 正在协助分析与 HIV 变异模式有关的数据。Microsoft 的高级研究人员 David Heckerman 医学博士解释说，HIV 在受到受感染者免疫系统的攻击时会快速变异。“我们正在从事一项尝试确定 HIV 在响应宿主的免疫系统时如何变异的研究。为此，我们正在寻找个人免疫系统类型和感染他的 HIV 蛋白质序列之间的关联性。”
科学家使用来自 HIV 感染者的样本来确定免疫系统类型和 HIV 序列。分析处理数据在这时就派上了用场。该研究在几百个个体中搜索 3,000 种 HIV 氨基酸和数百种免疫系统类型之间的关联性。“我们已设计了可提供较为可靠的关联性的统计测试，能减少假阳性和假阴性数。”Microsoft 的首席研究软件开发工程师 Carl Kadie 博士说。“但是，这些测试需要大量的计算功能，而且包括的对象越多越好。我们想运行数百万次的模拟来揭示最可靠的相互关系。”

使用 HPC 与 HIV 对抗
就在几年以前，研究所做的努力还在因为处理能力的限制而受到阻碍。仅配备了六台计算机，参与此项目的 Microsoft 研究人员没有足够的处理能力在适当的时间内执行分析。哪怕仅仅 200 个对象，想了解疫苗基因组的每个位置和不同免疫类型就要花费整整一年的时间。即使研究人员拥有 20 台计算机专供分析使用，他们仍然会面临一个基本问题，即手动在 20 台独立的计算机上运行测试、接收 20 组单独的结果以及需要其他程序（以及更多时间）将单独的结果组制成表格。管理多个作业、收集部分输出和涉及的所有其他各项任务将会花费许多时间。因此，他们向 Microsoft 的高性能计算 (HPC) 小组寻求帮助。
在 2006 年，研究人员实现了 Windows® Compute Cluster Server 2003。该 HPC 解决方案为研究人员控制许多台一起工作的计算机提供了简单方法。实际上，Windows Compute Cluster Server 允许在并行运行的服务器节点之间分配工作。在节点之间分发数据、管理数据和合并结果的任务都是自动完成的。该解决方案包括安装步骤、一系列管理工具和集成的作业计划程序。
最后，使用该解决方案克服了最重要的技术障碍：计算功能不再受限制并且分配工作和管理数据的过程完全自动化。

安装
对于 Microsoft Research，计算群集方法非常合适。Windows Compute Cluster Server 2003 非常适合包括反复执行相同操作的应用程序的项目 — 例如，当并行运行任务可加速解决问题和分析时。但是，不应该轻率地部署该解决方案，因为高性能计算可能需要相当多的资金 — 尤其是在电源和冷却方面。该解决方案需要使用经常以 100％ 的 CPU 使用率连续运行几周的多台服务器。
接下来的步骤是确定组织可以提供的群集的大小以及可以存储群集的位置。如果环境已经是基于 Windows 且具备 Active Directory® 的环境，则管理员就拥有了安装、部署和支持群集所需的基础结构。在尚未使用 Active Directory 的环境中，需要一些额外的配置步骤。
您还应决定如何在计算群集中配置节点，这意味着选择使用 Windows Compute Cluster Server 2003 附带的工具还是选择使用您自己的内部部署技术。您需要部署 Windows Compute Cluster Server 2003 本身以及您希望在群集上运行的软件应用程序。还必须建立用户对群集的访问权限，以便用户能够连接到群集和提交作业，这可以通过包含的图形 UI 或通过命令行界面完成。
Windows Compute Cluster Server 2003 是 64 位操作系统（图 1 显示了 Windows Compute Cluster Server 2003 环境的典型体系结构）。编写本专栏时（2007 年 6 月），Microsoft Research 正在基于 25 台 IBM eServer 326 服务器构建的群集上运行各种不同的应用程序。上述每台服务器都配有以 2.6 GHz 运行的两个 AMD Opteron 处理器。
图 1 使用 Windows Compute Cluster Server 2003 控制计算能力
图 1 使用 Windows Compute Cluster Server 2003 控制计算能力
部署 Windows Compute Cluster Server 后，小组更新了其用于在群集上运行以执行遗传关联性的应用程序。为计算群集部署应用程序的复杂程度各不相同。应用程序本身会对编程的必要程度产生影响。
首先，小组使用 Windows Compute Cluster Server 的内置工具快速建立通用 UI。这仅仅是一个快速修补，但是，小组很快创建了自己的自定义 Web 应用程序，该应用程序可提供更好的灵活性并支持选择将某些群集节点展示给 Microsoft 以外的科学家。事实上，Microsoft 是 Open Grid Forum 的一员，并且某些 Microsoft Research 群集可供全球其他大学的用户使用，从而使研究人员可以相互合作并分担工作。
除了其图形 UI 以外，Windows Compute Cluster Server 还支持命令行操作，允许用户编写脚本。它提供可用于编写程序的丰富的 API，这些程序可直接与 Windows Compute Cluster Job Scheduler（Microsoft Research 选择采用的一种技术）进行交互。

获得结果
由于使用了高性能计算，现在，Microsoft Research 的 eScience 小组在开发 HIV 疫苗方面取得了巨大的进展。“借助于高性能计算，我们已经能够加快了解分析结果这一过程的速度，”Heckerman 说，“几个正在与我们合作的外部研究小组现在使用我们的统计技术并与我们共享他们的发现。因此，科学家已经提出新的假定供我们进行测试。以前，获得整个过程的每个步骤的结果都会花费一年的时间。现在只要用一天。”
在 Windows Compute Cluster Server 之前，Microsoft Research 使用的方法由于需要时间执行分析而不切实际。Kadie 说：“使用 Windows Compute Cluster Server，我们可以在过去运行 1 个作业的相同时间内运行包含 200,000 个工作项的 50 个作业。”
现在 eScience 小组拥有唾手可得的强大计算能力，因此可以对模拟数据运行多次作业来进行测试。对模拟数据运行的作业对于确定实际数据上的哪些结果值得关注至关重要。执行的模拟越多，结果越可信。

经验教训
很明显，Microsoft Research 从使用 Windows Compute Cluster Server 中获得了益处，但是实际上这种关系是相互的。高性能计算小组中的开发人员（正在研究 Windows Compute Cluster Server 的第二版本）继续从 eScience 研究小组提供的反馈中了解情况。
特别是，通过监视和分析 Microsoft Research 群集的行为确定在多个用户之间平衡群集资源的最好方法，HPC 研究小组已了解到了有关资源分配的大量知识。例如，关于此项目，用户通常一次创建一个作业，每个作业平均有 50 个任务与之关联。用户提交作业后，Windows Compute Cluster Job Manager 会分配足够的资源来管理所有 50 个任务。为此，它立即要求群集上所有可用的节点都来处理这些任务。该方案在单一用户环境中不会出现问题，但在多用户设置中，各项目同时进行非常重要，因而会出现问题。
当前，当作业的 50 个任务中有 10 个已完成时，并不会释放这 10 台服务器。作业管理器等到作业中的所有 50 个任务都完成后，才会释放服务器来处理另一作业。HPC 开发人员正在研究在完成每个任务（而不是整个作业）后重新分配资源的方法。
Microsoft Research 也希望 HPC 研究小组帮助解决因研究人员希望使用 Windows Compute Cluster Server 的方式而产生的特定问题。值得注意地是，研究人员希望设置安全性，以便用户凭据会自动从 Web 前端传播到计算群集。该解决方案在 Microsoft® .NET Framework 中工作并扩展 ASP.NET 窗体身份验证，以便 Web 应用程序能够在每次用户提交作业时为群集节点提供完整的用户凭据。
现在，Microsoft Research 的 eScience 团队成员及其来自世界各地的同仁可以将精力集中在其作业的最重要部分上，而将涉及处理和管理数据的所有任务留给计算机完成。“因此，我们能够作为一个团队继续前进，”Heckerman 说，“我们扩大了对 HIV 的了解范围，并在与该疾病的斗争中取得了较大的进展。”

Kristin Firth 和 Mia Matusow都在从事 Blue Line 的撰写和编辑工作，过去十年来一直致力于在三大洲内为公共部门和私营部门的企业组织创建策略内容。


 Windows PowerShell: 编写正则表达式
Windows PowerShell
编写正则表达式
Don Jones

192.168.4.5。 \\Server57\Share。johnd@contoso.com。您马上会认出这三个条目是 IP 地址、通用命名约定 (UNC) 路径以及电子邮件地址。您的大脑识别出了它们的格式。四组数字、反斜线符号、@ 符号以及其他提示都表明了
这些字符串代表的数据类型。不必深思，您可以快速识别出 192.168 本身是一个无效的 IP 地址、7\\Server2\\Share 是无效的 UNC，joe@contoso 也是无效的电子邮件地址。
遗憾的是，计算机必须经过一番努力才能“了解”诸如以上的复杂格式。正则表达式即应运而生。正则表达式是使用特殊正则表达式语言编写而成的字符串，可帮助计算机识别格式特殊的字符串，如 IP 地址、UNC 或电子邮件地址。使用正确编写的正则表达式，Windows PowerShellTM 脚本可接受有效数据或者拒绝与指定格式不符的无效数据。

进行简单匹配
Windows PowerShell –match 运算符将字符串与正则表达式或 Regex 进行比较，然后根据该字符串是否与 Regex 匹配返回 True 或者 False。简单的 regex 甚至不需要包含任何特殊语法，有文字字符即可。例如：
"Microsoft" –match "soft"
"Software" –match "soft"
"Computers" –match "soft"
在 Windows PowerShell 中运行时，前两个表达式返回 True，第三个返回 False。在每个表达式中，字符串后均跟 –match 运算符，然后是 regex。默认情况下，regex 将在字符串中浮动查找匹配项。在 Software 和 Microsoft 中均可找到“soft”字符，但位置不同。另请注意：默认情况下，regex 不区分大小写，所以在“Software”中可找到“soft”，尽管 S 为大写字母。
但如果需要，可使用另一个不同的运算符 –cmatch 进行区分大小写的 regex 比较，如下所示：
"Software" –cmatch "soft"
由于在区分大小写比较中，字符串“soft”与“Software”不匹配，所以该表达式返回 False。请注意：尽管 –match 是默认行为，但也可选择使用 –imatch 运算符显式表示不区分大小写。

通配符和重复字符
regex 可包含若干通配符字符。例如，句点可与一个任意字符实例匹配。问号可与零个或一个任意字符实例匹配。示例如下：
"Don" –match "D.n" (True)
"Dn" –match "D.n" (False)
"Don" –match "D?n" (True)
"Dn" –match "D?n" (True)
在第一个表达式中，句点正好代表一个字符，所以匹配结果为 True。在第二个表达式中，句点未找到需要包含在其中的字符，所以匹配结果为 False。第三个和第四个表达式中的问号可匹配一个未知字符或者不与任何字符匹配。最后，在第四个示例中，由于“D”和“n”均存在并且二者之间没有字符，所以该匹配结果为 True。因此，问号可视为代表可选字符，所以即使在该位置没有出现任何字符，匹配结果仍为 True。
regex 还可将 * 和 + 符号视为重复字符。这些符号需要匹配某个字符或某些字符。* 可与零个或更多指定字符匹配，+ 可与一个或多个指定字符匹配。示例如下：
follow
"DoDon" –match "Do*n" (True)
"Dn" -match "Do*n" (True)
"DoDon" -match "Do+n" (True)
"Dn" -match "Do+n" (False)
请注意：* 和 + 均可与“Do”匹配，而不只是与“o”匹配。这是因为这些重复字符被设计为可匹配一系列字符，而并不只是一个字符。
如果需要匹配句点、*、? 或 + 符号本身，应如何处理呢？可直接在它们前面加上一个反斜杠，作为 regex 转义符：
"D.n" -match "D\.n" (True)
注意：该转义符与 Windows PowerShell 转义符（反单引号）不同，但是也遵循行业标准 regex 语法。

字符类
字符类是通配符的更广泛形式，它代表整组字符。Windows PowerShell 可识别很多字符类。例如：
  • \w 可匹配任何文字字符，即字母和数字。
  • \s 可匹配任何空白字符，如制表符、空格等。
  • \d 可匹配任何数字字符。
还有否定字符类：\W 可匹配非文字字符，\S 可匹配非空白字符，\D 可匹配非数字字符。这些类可后跟 * 或 + 来表示接受多个匹配。示例如下：
"Shell" -match "\w" (True)
"Shell" -match "\w*" (True)
本月 cmdlet
使用 Write-Debug cmdlet，可以轻松地将对象（如文本字符串）写入 Debug 管道。但在外壳程序中尝试该 cmdlet 可能会有点令人失望，因为该 cmdlet 看起来不起任何作用。
问题的症结在于 Debug 管道在默认情况下处于关闭状态 — $DebugPreference 变量被设置为“SilentlyContinue”。然而，如果将其设置为“Continue”，则您使用 Write-Debug 发送的任何事物都将在控制台上以黄色文本显示。这是一种将跟踪代码添加到脚本的完美方法，通过该方法，您可完成对复杂脚本的执行。黄色有助于您分辨跟踪和脚本的正常输出，并且可随时关闭调试信息，而无需删除所有 Write-Debug 语句。只需再次设置 $DebugPreference = "SilentlyContinue"，即可禁止调试文本。

尽管两个表达式都返回 True，但它们匹配的却是明显不同的对象。幸运的是，有一种方法可查看 –match 运算符实际上需要的内容：每完成一次匹配，无论运算符与 regex 匹配出的字符串中包含什么字符，都使用匹配结果填充称为 $matches 的特殊变量。该 $matches 变量保留其结果，直到使用 –match 运算符完成另一个完全匹配。图 1 显示了我刚才为您讲述的两个表达式的不同之处。您可以看到，\w 匹配“Shell”中的“S”，而重复 \w* 匹配整个单词。
图 1 * 引起的差别
图 1 * 引起的差别

字符组、范围和大小
regex 还可包含字符组或范围（括在方括号中）。例如，[aeiou] 意味着其包含的任何字符（a、e、i 或 u）都是可接受的匹配。[a-zA-Z] 表明 a-z 或 A-Z 范围内的任何字母（即使使用的是不区分大小写的 –match 运算符，仅 a-z 或 A-Z 本身即可）都是可接受的。示例如下：
"Jeff" -match "J[aeiou]ff" (True)
"Jeeeeeeeeeeff" -match "J[aeiou]ff" (False)
您还可使用大括号指定最小和最大字符数。{3} 表明您需要 3 个指定的字符，{3,} 表明至少需要 3 个或者更多指定的字符，{3,4} 表明至少需要 3 个但不超过 4 个指定字符。以下是一种为 IP 地址创建 regex 的理想方法：
"192.168.15.20" -match "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" (True)
该 regex 需要 4 组数字，每组数字包含 1 至 3 个数字，并且数组之间用文字句点隔开。但是请考虑以下示例：
"300.168.15.20" -match "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" (True)
此示例显示了 regex 的限制。虽然该字符串的格式看起来像 IP 地址，但它显然不是一个有效的 IP 地址。regex 无法确定数据是否真正有效；它只能确定数据看起来是否正确。

停止浮动查找
排除 regex 的故障似乎很简单。例如，以下是一个 regex，用于测试格式为 \\Server2\Share 的 UNC 路径：
"\\Server2\Share" -match "\\\\\w+\\\w+" (True)
在此，由于要测试的每个文字反斜杠必须使用另一个反斜杠进行转义，所以 regex 本身很难读取。这看似很正常，但事实并非如此：
"57\\Server2\Share" -match "\\\\\w+\\\w+" (True)
第二个示例很明显（至少在你我看来）是一个无效的 UNC 路径，但 regex 却认为它是有效的 UNC 路径。为什么？请记住：默认情况下，regex 将浮动查找。此 regex 仅仅需要两个反斜杠、一个或多个字母和数字、另一个反斜杠以及更多的字母和数字。该字符串中存在这种模式，但是字符串开头还存在其他数字，这使得该字符串成为无效 UNC。解决办法是告知 regex 在字符串的开头开始匹配，而不能浮动查找。我可以按以下方法操作：
"57\\Server2\Share" -match "^\\\\\w+\\\w+" (False)
^ 字符指示字符串开始的位置。有了这个字符，该无效 UNC 路径将会失败，因为 regex 需要前两个字符为反斜杠，但这种情况并非如此。
同样，$ 符号可用于指示字符串结尾。但此符号对 UNC 路径不会起到很大作用，因为 UNC 路径可能包含其他路径段，如 \\Server2\Share\Folder\File。不过，我确定在很多情况下，您都需要指定字符串结尾。

正则表达式帮助
在 Windows PowerShell 中，about_regular_expressions 帮助主题提供了有关 regex 语言的基本语法帮助，同时在线资源提供了更多相关信息。例如，我最喜欢的网站之一 www.RegExLib.com 提供了公众出于各种目的编写的免费正则表达式库。您可根据关键字进行搜索（如“e-mail”或“UNC”）以快速查找满足需要的 regex，或至少提供一个好的参考。如果您成功创建了一个很棒的 regex，则可将其添加到该库，以便其他人使用它。
此外，我也很喜欢 RegexBuddy (www.RegexBuddy.com)。此工具物美价廉，可提供 regex 图形编辑器。使用 RegexBuddy，可以更轻松地组建复杂的 regex 和对 regex 进行测试，以确保其正确接受有效字符串和拒绝无效字符串。许多其他软件开发人员还创建了免费、共享件以及商业 regex 编辑器和测试程序，这些工具一定会受到用户的青睐。

使用正则表达式
您也许想知道为什么要在现实生活中使用 regex。假设您正在查看 CSV 文件中的信息并要使用该信息在 Active Directory® 中创建新用户。如果该 CSV 文件是由其他人员生成的，则您可能需要证实其中的数据是否正确。regex 非常适合完成此项任务。例如，诸如 \w+ 的简单 regex 可确定名字和姓氏不包含任何特殊字符或符号，而稍复杂的 regex 则可确定电子邮件地址是否符合企业标准。例如，可使用以下 regex：
"^[a-z]+\.[a-z]+@contoso.com$"
此 regex 要求使用 don.jones@contoso.com 形式的电子邮件地址，其中名字和姓氏只能包含字母，并且这些名称必须用句点隔开。顺便提一下，对电子邮件地址字符串编写 regex 最复杂。如果您可将范围缩小至特定的企业标准，编写 regex 可以更简单一些。
不要忘记还有开始和结束定位标记（^ 和 $），它们可确保 contoso.com 之后和构成用户名的字符之前不出现任何字符。
事实上，使用 Windows PowerShell 中的 regex 非常简单。假设变量 $email 包含从 CSV 文件读取的电子邮件地址，可通过以下内容检查该邮件地址是否有效：
$regex = "^[a-z]+\.[a-z]+@contoso.com$"
If ($email –notmatch $regex) {
  Write-Error "Invalid e-mail address $email"
}
在本示例中，您还认识了一个新的运算符。如果该字符串与所提供的 regex 不匹配，-notmatch 将返回 True（还有一个用于区分大小写比较的 –cnotmatch）。
除了我在此处讲述的内容外，还有许多关于正则表达式的信息，如其他字符类、更高级的操作甚至一个或者两个运算符。此外还有 Windows PowerShell 支持的 [regex] 对象类型。但是，对于入门阶段的学习来说，我在此介绍的有关 regex 语法的简要概述应该足够了。如果需要帮助来解决特别复杂的 regex，可随时通过 www.ScriptingAnswers.com 与我联系。

Don Jones是《TechNet 杂志》的特约编辑，并且是《Windows PowerShell：TFM》（SAPIEN 出版社）一书的合著者。他主要讲授 Windows PowerShell (www.ScriptingTraining.com)，可通过 ScriptingAnswers.com 网站与其联系。


 您好，脚本专家！: 来自 Grave 之外的桌面管理
您好，脚本专家！
来自 Grave 之外的桌面管理
Microsoft 脚本专家
下载这篇文章的代码: HeyScriptingGuy2007_11.exe (151KB)

应大多数用户的要求 我们认为本月最好来点变化：我们打算以讲述一个恐怖故事（插入恐怖音乐）作为开始，而不是以谈论系统管理脚本开始！
注意：是的，从技术上说，如果我们确实要在本月来点变化，应该以实际谈论更改系统管理脚本开始。但还是与我们一起开始吧，好吗？谢了！
许多年前，有位老奶奶（当然是虚构的）去世了。将这位老奶奶入土为安后，不久她的老伴 — 老爷爷就开始做可怕的恶梦，在恶梦中爱妻拼命地想从坟墓中爬出来。恶梦不断重复，哀求也在不断重复，最终老爷爷说服了当地机构开棺查看。打开棺材后，每个人震惊地看到，老奶奶的指甲已经弯曲，棺材内部有抓痕！
故事可能并非完全真实，实际上，我们越想越认为它没有一点真实性。不过，这个故事给我们上了重要的一课。有些事情尽管我们不知道，但它们的确存在着。
稍等一下，让我们做点解释。棺材最初旨在保护死者不受自然环境的影响，并防止尸体分解。遗憾的是，棺材导致了一个出乎意料的结果：理论上，它也可以埋葬一个活人并让他无法出来。这个虚构的故事给我们以启示，计划再缜密也可能会导致灾难，人们也可能被活埋（再次插入恐怖音乐）！
注意：当然，如果采用十八世纪六十年代由 Franz Vester 发明的改进的埋葬制度，就可以避免这种情况。棺材上有一个细绳，连接到地面上的响铃；如果误埋了活人，“死者”通过拉动响铃即可获得帮助。改进的埋葬制度还包括一个折叠式梯子，尽管我们并不完全清楚折叠梯子如何帮助您从深埋地下的棺材中逃脱。当然，如果您被埋在车库顶部，折叠梯子将有所帮助。否则....
Internet 防火墙也会出现这种完美计划导致灾难后果的情况（当然，是在某种程度上）。防火墙最初旨在防止破坏分子进入：这些防火墙阻止传入的网络通信，有助于计算机远离黑客和入侵者。初衷很好，但就像活埋问题一样，它同样会产生出乎意料的结果：防火墙也阻止好人进入。这个问题在使用 Windows® 管理规范 (WMI) 时尤其突出，因为 WMI 依赖 DCOM 在远程计算机上执行管理任务，而防火墙往往会阻止所有传入的 DCOM 通信，这使 WMI 很难（如果并非完全不可能）通过 Internet 以编程方式管理计算机。实际上，如果不打开防火墙上的其他端口（这又会使您更容易受到黑客和解密高手的攻击），这是完全不可能的。当然，除非您选择 WinRM：Windows 远程管理（不包含折叠梯子）。

什么是 Windows 远程管理？
根据 WinRM SDK (msdn2.microsoft.com/aa384426)，Windows 远程管理是“WS 管理协议的 Microsoft 实施，该协议是基于标准 SOAP、不受防火墙影响的协议，允许不同供应商的硬件和操作系统相互操作。”哈！印象深刻吧？我们不会讨论本月专栏中 WS 管理协议的详细信息，因此建议阅读 WinRM SDK 以获取详细信息。现在，我们关心的是 WinRM 可用于 Windows Server® 2003 R2、Windows Vista® 和 Windows Server 2008，而且 WinRM 使您可以通过 Internet 管理计算机。WinRM 使用端口 80 完成此操作，端口 80 是一种标准的 Internet 服务端口，大多数防火墙都打开此端口（不过，可根据需要更改 WinRM 和默认传输机制 HTTP 使用的端口）。
本月专栏中我们不会讨论如何安装和配置 WinRM。已有足够的信息可帮助您执行此操作 (msdn2.microsoft.com/aa384372)。但是，稍后我们将花点时间强调重要的一点：如果要使用 WinRM 从远程计算机检索信息（当然，这是首先使用 WinRM 的主要原因），那么本地计算机和远程计算机都必须运行 WinRM。
这意味着什么？这意味着如果您未将客户端计算机升级到 Windows Vista（假设没有升级！），或未将服务器升级到 Windows Server 2003 R2 或 Windows Server 2008，您不会发现 WinRM 非常有用，至少现在不会。但是，不用说将来可能不会是这种情况（当然，假定防火墙允许，您始终可以使用 WMI 和 DCOM 管理远程计算机）。

返回类的所有属性和实例
但是，谁在乎中止和拒绝呢，对吗？与其做这些无意义的操作，不如看看我们是否能够了解编写利用 WinRM 的脚本的方法。凑巧的是，我们刚好有一个使用 HTTP 协议和端口 80 的简易脚本，可以连接到名为 atl-fs-01.fabrikam.com 的计算机然后返回有关该计算机上安装的所有服务的完整信息。请参阅图 1 以查看完整的脚本。
Figure 1 Silverlight 项目组件 (Close Figure 1)

文件 | 说明
CreateSilverlight.js | 这是一个 JScript 脚本（在其最初版本中，Silverlight 仅支持 JScript 脚本编写），它用于指定最初的 Silverlight 启动设置，包括用于配置用户界面和图形对象的 XAML 文件。
SampleProject.js | 这只是一个空白文件，您可以在其中添加 JScript 函数。
Silverlight.js | 此文件用于初始化 Silverlight 控件。
SampleProject.html | 所有的乐趣都在这里了。SampleProject.html 仅仅是一个 HTML 文件，其中包含用于读入三个 .js 文件的代码。它还包括用于实例化 Silverlight 控件的代码。
SampleProject.xaml | 它有什么用途？要想找到答案，您必须返回到本专栏的主文本部分。
Figure 1 远程计算机上的列表服务 (Close Figure 1)
strComputer = "atl-fs-01.fabrikam.com"

Set objWRM = CreateObject("WSMan.Automation")
Set objSession = objWRM.CreateSession("http://" & strComputer)

strResource = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service"

Set objResponse = objSession.Enumerate(strResource)

Do Until objResponse.AtEndOfStream
    DisplayOutput(objResponse.ReadItem)
Loop

Sub DisplayOutput(strWinRMXml)
    Set xmlFile = CreateObject("MSXml2.DOMDocument.3.0")
    Set xslFile = CreateObject("MSXml2.DOMDocument.3.0")
    xmlFile.LoadXml(strWinRMXml)
    xslFile.Load("WsmTxt.xsl")
    Wscript.Echo xmlFile.TransformNode(xslFile)
End Sub
您可以看到，我们首先将计算机 (atl-fs-01.fabrikam.com) 的 DNS 名称分配给变量 strComputer。另外，我们可以使用该计算机的 IP 地址（或者 IPv6 地址）进行连接。例如：
strComputer = "192.168.1.1"
将值分配给 strComputer 之后，接下来创建 WSMan.Automation 对象的实例，然后调用 CreateSession 方法以连接到远程计算机，在这种情况下使用 HTTP 协议（按照我们的计划执行）：
Set objSession = objWRM.CreateSession _
    ("http://" & strComputer)
正如我们说过的，我们希望返回有关远程计算机上安装的服务的信息。此外，至少在第一个示例中，我们需要有关所有服务的所有属性的信息。这一切都意味着什么？意味着我们需要指定 URI 资源，将我们绑定到远程计算机上的 Win32_Service 类：
strResource = _
  "http://schemas.microsoft.com" & _
  "/wbem/wsman/1/wmi/root/cimv2" & _
  "/Win32_Service"
当然，这不是至今为止我们看到过的最好的 URI（不过，稍微想想，我们也不确信曾看到过好的 URI）。尽管如此，幸运的是大部分的 URI 是样本；您只需关心末尾的 WMI 路径：
http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service
这就相当简单了。如果要连接到 root/cimv2/Win32_Process 类，将会怎么样？接下来，只需相应地修改 URI 路径：
http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Process
您对 root/default/SystemRestore 类感兴趣吗？继续只修改 URI 类，小心地指定默认的命名空间（而不是 cimv2 命名空间）：
http://schemas.microsoft.com/wbem/wsman/1/wmi/root/default/SystemRestore
等等....不过，您需要包括 URI 的 http://schemas.microsoft.com/wbem/wsman/1/wmi 部分，但是....
此时，我们已经获取一些数据。为此，我们只需调用 Enumerate 方法，将变量 strResource 作为唯一的方法参数进行传递：
Set objResponse = _
  objSession.Enumerate(strResource)
该代码行是否会根据有关安装在 atl-fs-01 计算机上的服务的信息正确填写 objResponse？当然会。然而，与标准 WMI 脚本不同，您未获取一系列对象及其属性和属性方法。相反，您将获得一个大而旧的 XML blob，它看起来有点像您在图 2 中看到的内容。
Figure 2 漂亮的颜色 (Close Figure 2)
<Canvas
 xmlns="http://schemas.microsoft.com/client/2007"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 Width="800"
 Height="300">

 <Canvas.Background>
 <LinearGradientBrush>
 <GradientStop Color="Blue" Offset="0.0" />
 <GradientStop Color="Black" Offset="1.0" />
 </LinearGradientBrush>
 </Canvas.Background>

</Canvas>
Figure 2 大而旧的 XML blob (Close Figure 2)
<p:Win32_Service xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="
http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service" xmlns:ci
m="http://schemas.dmtf.org/wbem/wscim/1/common" xsi:type="p:Win32_Service_Type"
xml:lang="en-US"><p:AcceptPause>false</p:AcceptPause><p:AcceptStop>false</p:Acce
ptStop><p:Caption>Windows Media Center Service Launcher</p:Caption><p:CheckPoint
>0</p:CheckPoint><p:CreationClassName>Win32_Service</p:CreationClassName><p:Desc
ription>Starts Windows Media Center Scheduler and Windows Media Center Receiver
services at startup if TV is enabled within Windows Media Center.</p:Description
><p:DesktopInteract>false</p:DesktopInteract><p:DisplayName>Windows Media Center
如果您是一位 XML 高手，则没有什么大问题；任何熟悉 XML 的人都能够解析和输出此信息，而没有太多阻碍（即使按照 WinRM SDK 的说法此信息不是“人类可读的格式”）。但如果您不是 XML 高手呢？在这种情况下，您有两个选择。其一，您可以等到下个月，那时我们将为您提供一些使用 WinRM 的 XML 的技巧。其二，您可以执行我们在示例脚本中进行的操作：利用随 WinRM 一起安装的 XSL 转换。

XSL 是什么格式？
XSL 转换只是一个模板，用来描述如何显示 XML 文件。对 XSL 文件的完整讨论远远超出了本月专栏的范围，对于此问题，即使简要讨论 XSL 文件也远远超出了我们在本月专栏中应有的篇幅。因此，我们不会尝试解释 WsmTxt.xsl（内置转换的名称）的实际工作原理。相反，我们只提供如何在脚本中使用该转换。
调用 Enumerate 方法时，WinRM 发回一个 XML 数据流。使用此数据最简便的方法就是设置 Do Until 循环，在到达数据流的末尾前，它将继续运行。这就是我们要在此处执行的任务：
Do Until objResponse.AtEndOfStream
    DisplayOutput(objResponse.ReadItem)
Loop
您可以看到，我们在循环内部调用了 DisplayOutput 子例程。调用该子例程时，我们将数据流 ReadItem 方法的值作为子例程参数传递（正如整个方法所示，XML 流以单独的数据段返回，而不是以一个大型的数据 blob 返回。我们的脚本按顺序一次读取一段 XML 数据或一个项目）。
同时，DisplayOutput 子例程如下所示：
Sub DisplayOutput(strWinRMXml)
  Set xmlFile = _
    CreateObject("MSXml2.DOMDocument.3.0")
  Set xslFile = _
    CreateObject("MSXml2.DOMDocument.3.0")
  xmlFile.LoadXml(strWinRMXml)
  xslFile.Load("WsmTxt.xsl")
  Wscript.Echo xmlFile.TransformNode(xslFile)
End Sub
简而言之，我们首先创建 MSXml2.DOMDocument.3.0 对象的两个实例。我们将 XML 数据流 (strWinRMXML) 加载到一个对象中，然后将 XSL 文件 (WsmTxt.xsl) 加载到另一个对象中。此时我们调用 TransformNode 方法，使用 XSL 文件中的信息进行格式化并显示从 XML 数据流中获取的数据。
不错，还是有点乱。但是至少输出的可读性更强，虽然算不上完美（请参阅图 3）。
Figure 3 为文本着色 (Close Figure 3)
<TextBlock
 Name="Test"
 FontSize="40"
 FontFamily="Georgia"
 FontWeight="Bold"
 Canvas.Top="20"
 Canvas.Left="20"
 Text="The TechNet Script Center">

 <TextBlock.Foreground>
 <SolidColorBrush Name="test_brush" Color="red"/>
 </TextBlock.Foreground>

</TextBlock>
Figure 3 整齐的 XML 版本 (Close Figure 3)
Win32_Service
    AcceptPause = false
    AcceptStop = true
    Caption = User Profile Service
    CheckPoint = 0
    CreationClassName = Win32_Service
    Description = This service is responsible for loading and unloading user profiles. If this service is stopped or disabled, users will no longer be able to successfully logon or logoff, applications may have problems getting to users' data, and components registered to receive profile event notifications will not receive them.
如我们所述，这虽然不错，但不够理想，所以我们完全有理由在下个月进行相应调整，届时我们为您提供一些独立操作 XML 输出的方法。

返回类的所选实例和属性
不用说，这非常酷，除了一点：它可能未完全反映您通常的工作方法。是的，有时您希望返回类的所属性和实例；但是有时（可能大多时候）您希望只返回类的所选属性或实例。例如，您可能希望只返回有关正在运行的服务的信息，在常规 WMI 脚本中使用类似以下内容的代码运行的服务：
Set colItems = objWMIService.ExecQuery _
  ("Select * From Win32_Service " & _
   "Where State = 'Running'")
这很好。但是，您如何实际修改 Resource 字符串使其等效于该内容呢？
坦白地讲，您不会修改 Resource 字符串使其等效于 ExecQuery 语句。您确实需要修改 Resource 字符串，但是您同样需要完成另外一些事。
了解这一点后，请看一下图 4。这是一个 WinRM 脚本，返回有关在计算机上运行的服务的信息（相对于安装在计算机上的所有服务）。
Figure 4 TextBlock 技巧 (Close Figure 4)
<TextBlock.Triggers>
 <EventTrigger RoutedEvent=
     "TextBlock.Loaded">
 <BeginStoryboard>
 <Storyboard>
 <DoubleAnimation
 Storyboard.TargetName="Test"
 Storyboard.TargetProperty="Opacity"
 From="0.0" To="1.0"
 Duration="0:0:5" />
 </Storyboard>
 </BeginStoryboard>
 </EventTrigger>
</TextBlock.Triggers>
Figure 4 查找运行服务 (Close Figure 4)
strComputer = "atl-fs-01.fabrikam.com"

Set objWRM = CreateObject("WSMan.Automation")
Set objSession = objWRM.CreateSession("http://" & strComputer)

strResource = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/*"
strFilter = "Select * From Win32_Service Where State = 'Running'"
strDialect = "http://schemas.microsoft.com/wbem/wsman/1/WQL"

Set objResponse = objSession.Enumerate(strResource, strFilter, strDialect)

Do Until objResponse.AtEndOfStream
    DisplayOutput(objResponse.ReadItem)
Loop

Sub DisplayOutput(strWinRMXml)
    Set xmlFile = CreateObject("MSXml2.DOMDocument.3.0")
    Set xslFile = CreateObject("MSXml2.DOMDocument.3.0")
    xmlFile.LoadXml(strWinRMXml)
    xslFile.Load("WsmTxt.xsl")
    Wscript.Echo xmlFile.TransformNode(xslFile)
End Sub
乍一看，可能觉得与向您显示的第一个 WinRM 脚本一样；然而，它存在一些非常重要的差异。首先，看一下分配给 Resource 字符串的值：
strResource = _
  "http://schemas.microsoft.com" & _
  "/wbem/wsman/1/wmi/root/cimv2/*"
注意，编写筛选的查询时，我们不会为要使用的类指定实际名称 (Win32_Service)，只会连接到类所在的命名空间 (root/cimv2)。请记住将星号 (*) 添加到末尾。否则，此脚本将失败并返回消息“... 此类名称必须添加 '*'（星号）”，这只表示您需要设置类名称 *。
此外，我们需要定义 Filter 和 Dialect：
strFilter = _
  "Select * From Win32_Service " & _
  "Where State = 'Running'"
strDialect = _
  "http://schemas.microsoft.com" & _
  "/wbem/wsman/1/WQL"
Filter 应易于确定；它是我们放置 Windows Management Instrumentation 查询语言 (WQL) 查询的位置 ("Select * From Win32_Service Where State = 'Running'")。同时，Dialect 是创建 Filter 时使用的查询语言。此时，仅允许使用一种查询语言：WQL。不过，必须指定 Dialect，否则脚本将失败并警告“不支持...筛选器语言。”
注意：有趣的是，此错误消息建议您调用 Enumerate 方法时删除 Dialect。您不应听从该建议。执行筛选的查询时，必须指定 Dialect 而且必须是 WQL。没有了。
仅当我们调用 Enumerate 方法时，才需要进行另一更改。在那时，我们需要传递表示 Filter 的变量 (strFilter)、表示 Dialect 的变量 (strDialect) 以及表示 Resource 的变量 (strResource)：
Set objResponse = _
  objSession.Enumerate _
  (strResource, strFilter, strDialect)
试一试，看看会发生什么情况。
现在，只返回类的所选属性如何？例如，假设您仅需要返回在计算机上运行的所有服务的 Name 和 DisplayName。然后呢？
在这种情况下，您可以尝试操作 XML，以便只显示 Name 和 DisplayName。这可以实现，但确实有点棘手。执行此操作的较简单方法是分配 Filter 时仅指定这些属性：
strFilter = _
  "Select Name, DisplayName " & _
  "From Win32_Service " & _
  "Where State = 'Running'"
执行以上操作，您将获取每个服务的 Name 和 DisplayName，如下所示：
XmlFragment
    DisplayName = Windows Event Log
    Name = EventLog

XmlFragment
    DisplayName = COM+ Event System
    Name = EventSystem
当然，这种格式有点可笑。（如何处理 XmlFragment 内容？）这也是我们下个月进行调整的原因。

等待
幸运的是，这就足以让您探索 WinRM 的奇妙世界。当然，还没有彻底解决“防止假死”问题，我们不能结束关于 WinRM 的专栏。在实行“防止假死”的城市里，死者不会立即下葬，而是被放在暖房中，并用一些绳和线栓住了手脚。只要他们稍有移动，即会触发警报并获得帮助。对采取“防止假死”措施的尸体，没有明显希望就不会受到任何处理。
现在您注意到，“防止假死”与分配给脚本专家组非常相似，难道不是吗？当然，采取“防止假死”措施的死者还没有死而复生的，而人们将被分配给脚本专家组...

Scripto 博士的脚本求助者
2007 年 6 月，脚本专家组在佛罗里达州奥兰多市参加了 Tech•Ed 2007 会议。因为除了参加次会议没有其他工作，因此我们决定找一些乐子。不仅如此，我们还认为其他人也能享受这些乐趣。明确这一点后，我们想到了 Scripto 博士的 Fun Book，这个小册子包含与脚本相关的迷题及其他各种信息。我们和《TechNet 杂志》合作，这意味着我们劝其放弃 Expo Hall 中的一角并且将 Fun Book 分发给需要它的人。
事实证明，Fun Book 很受欢迎（可能不像 Scripto 博士的玩具那么受欢迎，但也差不太多）。《TechNet 杂志》的投机者看到了将脚本专家组的成功作为资本的更多方法（脚本专家看起来无法将其成功转化为资本），要求我们为其设置一些迷题。脚本专家 Jean Ross 刚刚转过头不久，脚本专家 Greg Stemp 说：“当然，我们会那样做！”并且我们正好在此：Scripto 博士的脚本求助者。尽情享受吧。

顺便编写脚本
在此迷题中，上半部分的字母破译后可创建脚本（在 VBScript 中）。不过不要担心，您不必猜到全部内容；您一次只需破译一列。在上半部分每列中的字母也将填写到下半部分同一列的空白处。示例如下：
您可以看到，第一列中填写了字母 S、C 和 T。那三个字母以某种未知顺序处于下面的网格中。但是当所有的字母都处于正确的顺序（向左或向右读取）时，就会形成一种逻辑。看一看解决方案：
您能看到第一列中字母 S、C 和 T 的移动顺序为 T、S 和 C。它们是“脚本中心”中每个单词的首字母。因为实际的迷题更长而最终结果是完整的脚本，所以难度更大。
提示：最终脚本以文件的完整路径开始，然后分析并显示此文件名称。
祝您好运！

Scripto 博士的脚本求助者
答案：顺便编写脚本，2007 年 11 月
在此迷题中，您需要将列内的字符放到下面的正确框中，以使底部行创建一个脚本。独立的脚本如下所示：
name = "C:\Scripts\Test.txt"
arr = Split(name, "\")
index = Ubound(arr)
Wscript.Echo "Filename: " _
& arr(index)
迷题网格如下所示：

Microsoft 脚本专家为 Microsoft 工作，也就是受雇于 Microsoft。在玩、教或看棒球（以及各种其他活动）的闲暇之余，他们还负责维护 TechNet 脚本中心。您可以光顾他们的网站 www.scriptingguys.com，看看他们在做些什么。


 安全观察: 安全的随处访问技术
安全观察
安全的随处访问技术
John Morello

目前，技术方面勿庸置疑的趋势之一是工作人员之间的联系日益加强，移动性也日益加强。很多组织的员工都在各地办事处工作或远程办公，还有的员工需要频繁出差访问客户。使这些用户可以从任何位置轻松访问应用程序和数据，从而进一步提高了他们的
工作效率。然而，直到现在，实现安全远程访问通常意味着安装客户端软件、键入晦涩难解的命令以及长时间进行连接。
在过去几年中涌现出了很多方法,它们的目的是使远程访问变得更为简单,访问性更好。例如，Outlook® Web Access (OWA) 为用户提供了一种基于浏览器的简单访问方法，用户无需借助于完整的第 3 层虚拟专用网络 (VPN) 就可以访问自己的电子邮件、日程表和联系人。尽管诸如 OWA 之类的技术可以提供重要的“随处访问”解决方案，但是大多数组织拥有的很多重要应用程序却无法提供相同类型的集成浏览器体验。在这些情况下，诸如“终端服务”的解决方案为用户提供了一种有效的方法，使用户无论位于何处都可以访问自己的应用程序。
在 Windows Server® 2008 中，Microsoft 大大增强了终端服务的“内置”功能集。目前的终端服务包括无缝窗口、名为 RemoteApp 的按应用程序发布功能、EasyPrint 中的通用打印驱动程序功能和名为 TS Web Access 的基于浏览器的门户。此外，Windows Server 2008 还包括为远程桌面协议 (RDP) 提供 SSL 封装的 TS 网关组件，它使用户可以轻松安全地穿过防火墙和网络地址转换 (NAT) 设备，这也是随处访问方案的关键技术。TS 网关功能还可与 Windows Server 2008 中的另一项新技术 — 网络访问保护 (NAP) 集成，为用户提供端点客户端运行状况检查。如果结合使用上述所有组件，组织可以构建使用户随时随地都能轻松安全访问自己的应用程序和数据的解决方案。
本专栏重点关注随处访问解决方案的网络和安全设计方面，而不提供有关管理终端服务组件的详细信息。我将会介绍基于 Windows Server 2008 中包含的技术创建此类解决方案的方法和最佳实践。

第 3 层虚拟专用网络存在什么问题吗？
在谈到任何新技术时，了解它与当前方法相比所存在的优势非常重要，这样您可以准确评估新模型的价值。对传统的第 3 层 VPN 而言，通常有两个主要问题需要解决：安全性和易于使用性。
将安全性作为现在很多第 3 层 VPN 存在的问题列出，好像有悖于常理。难道 VPN 的全部意义不就是通过 Internet 提供安全信道吗？为了了解这个问题，让我们从更高的角度来了解一下人们通常所认为的 VPN 威胁吧！我并不是说通过这些 VPN 传递的数据存在中途被拦截或恶意篡改的风险；现在大多数第 3 层 VPN 都提供了卓越的数据流加密技术。实际上，应该是由对组织网络拥有完整“所有端口、所有协议”访问权限的远程计算机带来的威胁。问题并不在于由第 3 层 VPN 加密并通过网络传输的数据流，而在于通过这些信道进行的远程客户端连接，它们会不断为内部网络带来风险。我们知道，受 Slammer 或 Blaster 等恶意软件影响的大多数组织并不是被内部网络的计算机或黑客穿越防火墙感染。而是远程工作者使用受感染的计算机通过 VPN 连接到网络造成的感染。如果上述 VPN 创建完全路由、基于第 3 层的连接，则远程计算机通常具有和数据中心层所在的计算机同样的访问权限（安全的和不安全的）。
而且，因为第 3 层 VPN 要求在不由组织 IT 小组管理的计算机上安装和配置软件，所以运行成本很高。例如，在用户的家用计算机上安装 VPN 客户端可能会涉及到创建自定义安装程序包、用户需要遵守的详细安装说明，以及排除与用户计算机上的应用程序相互冲突的问题。此外，如果需要部署新的客户端版本或更改配置数据（如添加新的 VPN 端点），管理费用也会很高。对用户来说，通过 VPN 工作并不是直观的体验。因为它只提供第 3 层连接，所以用户不能轻松地访问和查看自己的业务应用程序和数据。

解决终端服务问题
终端服务和其他所谓的第 7 层或应用层 VPN 技术能够更好地控制用户可以访问的资源和协议，并使最终用户体验比以前更简单直观，从而解决了上述两个问题。
从安全角度来看，与内部网络的连接并非完全开放的管道，这是利用终端服务和 TS 网关的方法与第 3 层 VPN 方法在功能上最关键的区别。具体而言，第 3 层方法会在本地计算机上创建具有内部网络完全路由功能的虚拟接口，而 TS 网关方法只允许基于 RDP 的数据包进入内部网络，因此，前者大大减小了总的受攻击面，也可以对 RDP 应用实施更精细地控制。例如，当 RDP 对驱动器重定向提供本地支持时，组织可以将其 TS 网关配置为与 NAP 集成，除非远程计算机能够证明自己使用的是最新的防病毒软件，否则不允许使用此功能。
对于最终用户，第 3 层 VPN 与基于终端服务的方法之间最明显的区别在于设置极其简单（通常根本不需要设置），并且可以更简单、更直观地访问应用程序和数据。因为远程桌面连接客户端基于 Windows 构建，可以随时通过普通服务技术（如 Windows® Update）进行更新，所以通常不需要安装客户端软件。而且，利用 TS Web Access，用户可以通过访问一个 URL 找到所有的应用程序和数据。只需单击相应的应用程序就可以启动 TS 网关，通过 Internet 安全建立信道连接，并且应用程序还可以无缝传送到用户桌面。换句话说，应用程序的外观和行为就像它安装在本地一样，可以复制和粘贴以及最小化工具栏。通过使应用程序和数据更容易发现，设置更即时，基于终端服务器的远程访问方法成功提升了用户的满意度，同时还降低了支持成本。

网络体系结构选择
要使 TS 网关服务器可以通过 Internet 使用，可以使用两种基本网络设计方法。第一种方法，将 TS 网关置于两个 3/4 层防火墙之间的外围网络中。第二种方法，使 TS 网关位于内部网络中，并在外围网络使用应用层防火墙（如 Microsoft® ISA 服务器、Microsoft 智能应用程序网关，或各种第三方解决方案），然后检查入站 HTTPS 帧。只有完成这些入站会话分析后，数据包才会转发到内部 TS 网关服务器。
如果组织只对两个 3/4 层防火墙进行基本状态数据包检查，则系统会将 TS 网关设备直接放在外围网络中，如图 1 所示。在这种设计中，面向 Internet 的防火墙将会限制与 TS 网关的连接，仅允许与来自 Internet 的 HTTPS 通信建立连接。不过，该防火墙不会在应用层检查此通信；它只将通信转发到 TS 网关。然后，TS 网关服务器从 HTTPS 数据包中提取 RDP 帧，并将其转发到相应的后端服务器。这些后端服务器与外围网络的连接通常被另一个防火墙隔开，该防火墙配置为仅允许来自 TS 网关的 RDP 帧转到相应的内部服务器。
图 1 在使用 3/4 层防火墙的情况下，TS 网关位于外围网络中
图 1 在使用 3/4 层防火墙的情况下，TS 网关位于外围网络中
尽管此方案完全受支持而且对许多组织都非常有用，但是它仍然存在两个主要缺点。首先，因为 TS 网关直接从 Internet 接收通信，相对来说需要承担的外部恶意方风险更高。恶意方可能会试图通过 SSL 会话攻击 TS 网关，因为前端防火墙只检查标头而不检查负载，所以这些会话可能会到达该网关。这并不代表 TS 网关是一个容易受攻击的组件，它和其他 Windows Server 2008 产品一样经过了严格的安全性设计和测试。不过，在这种情况下风险性相对较高，只因为它直接处理来自 Internet 的未经筛选的通信。第二个主要缺点在于通信量会增加，因为必须允许网关和后端防火墙进行通信。要对用户进行身份验证，TS 网关需要与 Active Directory® 通信，而要允许此通信，后端防火墙必须破例允许更大范围内的端口和协议，而不只是 HTTPS。这增加了允许通信的级别，同时也代表相对增加了设计的风险。
使 TS 网关可以与 Internet 连接的一个更好的方法是在入站 HTTPS 会话到达网关之前使用应用层（第 7 层）防火墙对其进行处理（参见图 2）。在此设计中，可能依然采用传统的 3/4 层防火墙形成外围网络，然而处于外围网络中的并不是 TS 网关，而是第 7 层防火墙。在通信到达面向外部的防火墙时，该防火墙会筛选除 HTTPS 帧之外的所有内容，然后再将所有帧转发至第 7 层防火墙。第 7 层防火墙将终止 SSL 会话、检查未加密的流内容、阻止恶意通信，然后将 RDP 帧通过后端防火墙发送至 TS 网关。请注意，如果需要，第 7 层防火墙还可以在帧发送至 TS 网关前重新对其进行加密。在组织专用网络中可能不需要这种方法，但在托管数据中心或共享网络中它却能发挥重大作用。
图 2 结合使用应用层防火墙和 TS 网关设备
图 2 结合使用应用层防火墙和 TS 网关设备
这种设计避免了前面解决方案的两个不足之处。因为 TS 网关服务器只接收通过第 7 层防火墙检查的通信，所以降低了通过 Internet 受攻击的风险。第 7 层防火墙可以对这些攻击进行筛选，然后只将安全、通过检查的通信发送回网关。
此解决方案的第二个显著优点是网关相对内部网络的位置。因为来自 Internet 的通信在到达网关之前已通过了第 7 层防火墙的检查，所以它可以留在内部网络，并可直接访问域控制器进行身份验证以及访问 RDP 主机进行用户会话。此外，后端防火墙还可使用限制更为严格的策略。它只需要允许 RDP 会话从第 7 层防火墙传送到 TS 网关，而无需同时允许 RDP 和目录身份验证通信。使用第 7 层防火墙在前端进行 TS 网关部署，可提供一种更安全且更易于管理的解决方案，而且不需要重新设计现有的外围网络。

NAP 集成
终端服务资源
  • Windows Server 2008 中的终端服务
  • Windows Server 2008 终端服务 TechNet 论坛
  • 终端服务团队博客
  • Microsoft Intelligent Application Gateway 2007
  • Windows Server 2008 的网络访问保护 (NAP)
  • 网络访问保护 (NAP) 博客
  • Windows Server 2008 Beta 3 分步指南

尽管良好的外围设计是随处访问解决方案的关键因素，但是确保端点设备的兼容性和安全性同样很重要。因为 RDP 是允许多种类型设备重定向（如 RDP 会话和打印机）的丰富协议，所以连接到解决方案的客户端符合组织的安全策略至关重要。例如，即使拥有基于诸如前面所述的最佳实践的安全网络拓扑，通过不安全计算机连接到终端服务器的最终用户仍有可能丢失机密数据或试图将恶意文件放入终端服务器上。即使与用户通过第 3 层 VPN 连接相比，连接量和潜在的破坏性要少得多，但是存在管理数据丢失的风险并确保符合 IT 策略仍然不容忽视。
网络访问保护 (NAP) 是 Windows Server 2008 的一项新技术，它使用户不仅可以控制与网络连接的对象，还可以控制连接的系统类型。例如，您可以使用 NAP 确保只有运行防火墙并且防病毒程序最新的计算机才能连接到网络。NAP 是一项可扩展的解决方案，不仅涉及组织的内部网络，还涉及远程用户，包括通过第 3 层 VPN 和 TS 网关进行连接的远程用户。通过将 NAP 与 TS 网关设计集成，用户可以确保只有符合安全策略的系统才能连接到网络。有关 NAP 的更多信息，请参阅《TechNet 杂志》2007 年 5 月刊的“安全观察”专栏，用户可以联机访问 technetmagazine.com/issues/2007/05/SecurityWatch 查看此专栏。
将 NAP 集成到 TS 网关部署是一个简单的过程，在设计中只涉及另外一个服务。此服务即网络策略服务器 (NPS)，可以安装在 TS 网关服务器本身上，也可以安装在单独的操作系统实例中。然后，可以使用 TS 网关 MMC 创建连接身份验证策略 (CAP)，定义为了实现指定的运行状况所允许的 RDP 功能。TS 网关服务器配置为每次试图建立新的连接都要经 NPS 核实，并且该连接的运行状况声明 (SoH) 会转发到 NPS。随后，网络策略服务器会将 SoH 与其策略进行比较，并根据客户端的运行状况通知 TS 网关是否允许建立连接。
如图 3 中所示，如果没有将不符合条件的系统配置为使用 Windows Update，但是组织的安全策略要求启用自动更新，那么在用户试图连接到 TS 网关时，该用户所使用的计算机会自动生成并转发 SoH。此 SoH 会显示类似于“防火墙处于开启状态，防病毒程序是最新的，但自动更新被禁用”的消息。TS 网关直接将此 SoH 转发至 NPS（TS 网关不具有自行对 SoH 解码的逻辑），NPS 随后会将 SoH 与其管理员定义的策略进行比较。因为自动更新已禁用，所以 NPS 确定该连接与“不符合条件”策略相匹配，并通知 TS 网关不允许建立此连接。TS 网关会断开此连接，并告知用户其计算机没有达到组织安全策略的要求。然后，用户可以采取所需的纠正措施（在本例中，只需启用自动更新）并重新尝试建立连接。因此，会生成新的 SoH，NPS 将确定其符合性，然后 TS 网关可能允许继续建立连接。
图 3 只有符合条件的系统可以建立连接
图 3 只有符合条件的系统可以建立连接

结束语
Windows Server 2008 包含安全随处访问解决方案的主要构建基块。TS 网关提供了一种安全的方法，可以通过 Internet 利用信道传输远程桌面会话，并在与现有网络集成的方式方面为组织提供了多种选择。这些选择包括将 TS 网关直接放在外围网络中，或者在 TS 网关前使用第 7 层防火墙（如 ISA 服务器或智能应用程序网关）。可结合使用 NAP 与 TS 网关以将端点运行检查功能添加到解决方案中。通过端点检查，组织不仅可以确保远程连接来自于有效用户，还可以确保其来自于符合 IT 安全策略的计算机。一旦 NAP 与 TS 网关结合使用，这些技术就可以为组织提供更安全、效率更高的远程访问功能，还可以为终端用户提供更好的体验。通过浏览“终端服务资源”侧栏中所列出的站点，您可以找到更多相关信息。

John Morello于 2000 年加盟 Microsoft。作为高级顾问，他曾经为财富 100 强企业以及联邦民用和国防客户设计多种安全解决方案。目前他是 Windows Server 小组的高级项目经理，主要研究随处访问技术。用户可访问 blogs.technet.com/WinCAT 查看其团队的博客。


 桌面文件: 碎片整理原理
桌面文件
碎片整理原理
Wes Miller

只要存在硬盘，就会有磁盘碎片。如果您非常关注自己的系统，就应该定期对其进行碎片整理。就像我们要让牙医清洁牙齿一样。碎片整理也同样重要。
除非您的计算机始终闲置不用，否则碎片会越来越多。稍后，我将向您演示如何进行碎片整理，但现在先让我们来稍微了解一下碎片整理的历史。

碎片整理和 Windows NT
Windows NT® 没有内置的碎片整理实用工具，当时人们普遍认为不需要这个工具。毕竟，NTFS 在构建时进行了优化，而且它不像 FAT 卷那样容易产生大量碎片。但是随着时间的推移，NTFS 性能也可能由于文件位置不佳而产生碎片。大量第三方碎片整理工具即应运而生。最受 IT 专业人员欢迎的一个产品是 Executive Software（现为 Diskeeper Corporation）的 Diskeeper 产品。Windows 2000 增加碎片整理功能后，Microsoft 从 Executive Software 获得了技术授权。Windows® 2000 碎片整理功能可从其自身的 Microsoft® 管理控制台 (MMC) 管理单元 (dfrg.msc) 运行，单击某个卷或手动从命令行中运行 defrag.exe 即可调用该管理单元。虽然这个内置版本无法进行日程安排且只能使用一些受限的命令行，但是许多 IT 专业人员仍创建功能脚本来使用它自动进行碎片整理。Windows XP 和 Windows Server® 2003 中的 defrag.exe 在早期版本的基础上做出了一些改进，但也只能提供有限的自动化 — 您仍需要编写脚本。
许多供应商（包括我以前的雇主 Winternals Software），都开发了用于企业空间碎片整理的软件。其中大多数产品的工作原理都相同：使用集中式控制台、依赖于客户端系统（可能始终依赖，也可能只按需依赖）的某种类型的代理以及指示碎片整理任务运行时间和方法的结构。
Windows Vista® 基本上仍采用单系统碎片整理，同时优化了碎片整理程序，还包括一些选项，如对小型文件碎片（64MB 或更小）进行碎片整理，此选项加快了碎片整理速度但会在磁盘上保留许多较大的文件碎片。与 Windows 以前版本相比，Windows Vista 和 Windows Server 2008 中的碎片整理引擎本身的功能更加强大。它还能自动运行而不需要手动安排运行时间。但是，如果您经营一个大型组织或希望采用默认情况下碎片整理不支持的方法来优化系统，可能仍需要使用第三方软件。在早期版本中，对于已启用 NTFS 压缩并且使用很频繁的卷，您可能无法对其进行碎片整理。在这种情况下，第三方工具可能有所帮助。

碎片是如何产生的？
随着时间的推移，文件会发生更改，进而就会产生碎片。理论上，Windows 文件自身不会发生更改，或者至少不会经常发生更改。实际上，只有在安装 Service Pack 和软件更新时，Windows 文件才会发生更改。否则，系统文件属于相对稳定。执行大型更新（如安装 Service Pack）后，由于通常无法覆盖磁盘上正进行更新的文件，所以自然会产生碎片，而且更新可能需要重新启动，这也会导致更多的碎片。
另一方面，用户文件和数据（以及 Windows 注册表）都在不断变化。读取、写入、编辑、复制和删除文件都会导致大量碎片，尤其是在驱动器容量已满的情况下。
为了形象地说明这种情况，请设想一个组织方式良好的磁盘，其中文件连续占据空间，而文件之间没有多余的空间。假设您打开了一个文件并对其进行编辑，然后试图保存。如果文件已增长，则 Windows 必须将文件完整地保存在磁盘的某个位置（假定在文件 N 后面），或将最新的数据保存在文件 N 后面。这意味着文件 2 现在非常零散。如果现在编辑文件 1，就会出现两个零碎的文件。随着时间的推移，如果一直重复此类过程，最终会得到一个非常零散的系统，其中驱动器需要查看多个位置才能访问单个文件。在大型数据库文件、用于虚拟计算技术的高成本硬盘文件以及一般磁盘中存储的各种视频和音频中，碎片很常见。当然，目前硬盘空间越来越大，碎片算不上大问题，但其影响始终存在。硬盘较小的旧便携式计算机的响应速度会变得越来越慢，打开和保存文件花费的时间也会越来越长。
关键问题不在于系统的零碎程度，而在于单个文件的零碎程度。从看到第一个磁盘碎片整理程序以彩色视觉效果在屏幕中显示开始，用户就在想“我需要彩色实心块。”但实际上，那是您最不需要的东西。一些产品尝试使其磁盘显示为两个实心块 — 一种为彩色（文件数据），另一种通常为白色（可用空间）。遗憾的是，如果您希望尽可能降低碎片整理的频率和成本，对磁盘进行此操作是最糟糕的事情之一。当您继续对文件进行编辑时，如果已将所有文件数据强行压缩到磁盘的前面部分，并腾出了大量可用空间，则必须将所有这些编辑写入到文件数据的末尾，因此如果通过上述方式进行碎片整理，从下一次文件编辑开始您实际上已经导致了碎片的产生。良好的碎片整理不一定要产生两个经过组织的整齐文件数据块，而是产生一个未必完美的映像。有关进行碎片整理前测试系统的示例，请参阅图 1。然后，请参阅图 2 中 Windows 完成碎片整理后同一系统的状况。
图 1 进行碎片整理前的驱动器状态
图 1 进行碎片整理前的驱动器状态
图 2 进行碎片整理后的驱动器状态
图 2 进行碎片整理后的驱动器状态
请注意，Windows 并不关注跨磁盘的文件碎片，而是关注单个文件碎片本身（有关我对系统进行碎片整理之前的大多数零碎文件的碎片整理报告部分，请参阅图 3）。
图 3 碎片整理报告
图 3 碎片整理报告
这样，即使在进行碎片整理后，Windows 也不会在磁盘前面部分显示完全压缩的文件数据集。还要注意图 1 和图 2 中大的绿色数据部分，那是 Windows 页面文件，稍后我会简要介绍一下。如果在 Windows 系统中启用了休眠，它同样会显示在碎片整理中。

常规的碎片整理是必要的
就像定期清洁牙齿一样，定期对系统进行碎片整理最重要。如果不经常进行碎片整理，处理过程就会花费很长时间，并且使您的服务器不可用或停止响应（因为碎片整理很费时，而且特定阶段的碎片整理还会占用大量 CPU），所以经常对使用率高的系统（如服务器）进行碎片整理非常重要。
即使最好的联机碎片整理程序也无法对所有内容进行碎片整理。例如，碎片整理程序无法始终对已打开或锁定的文件（如页面文件或注册表文件）进行碎片整理，而且必须解决可能存在的休眠文件（该休眠文件与系统中正在使用的 RAM 一样大）。要优化锁定的文件，请参阅下一部分中关于碎片整理技巧的内容。
我认为了解关于碎片整理的误解和事实非常重要。图 4 和图 5 列出了在讨论碎片整理经常提出来的一些主题并指出了这些问题发生的实际几率。
Figure 5 有关碎片整理的误解 (Close Figure 5)

误解 | 可能性
系统崩溃。 | 不可能 — 崩溃通常源于驱动程序或硬件问题（内存损坏、散热不良引起的重新启动，或由磁盘温度过高引起的磁盘故障）。
应用程序崩溃。 | 不可能 — 与整个系统一样，设计合理的应用程序不会因碎片而崩溃，所以除非推定碎片是唯一原因，否则不应假定应用程序崩溃是碎片导致的。
会损坏注册表。 | 不可能（请参阅上述原因）— 碎片不会导致注册表损坏。
碎片整理应该在磁盘的可视表示形式中产生单个实心块。 | 不可能 — 通常不应该将系统中的所有文件挤压在一起，除非您专门计划将系统与基于扇区的映像工具映射在一起，该映射工具不排斥可用空间，也不缩减或拆分分区。您需要将文件放在磁盘的前面部分；否则，继续文件合并只会导致更多碎片。
Figure 4 碎片整理常见问题 (Close Figure 4)

问题 | 可能性
系统性能将受影响。 | 高 — 具体来说，受影响的程度取决于系统的使用情况。
恢复不慎删除的文件可能会非常困难甚至无法恢复。 | 高 — 大多数文件恢复工具依赖于试探法（确定数据类型）和文件群集邻近度。分散的文件会导致操作更复杂甚至无法恢复。
对系统进行碎片整理会花费大量时间。 | 中 — 系统的使用程度与系统中文件随着时间变化的程度有直接关系。例如，如果用户继续编辑文件，却只将文件保存在服务器共享上，则性能不会随着时间的推移迅速降低。
会损坏磁盘。 | 低 — 不太可能。不过，您越滥用系统（总是让磁盘处于通电状态以及编辑、修改或删除文件），这种情况就越可能发生。但是现在的硬件不会因文件编辑而导致这种情况。

碎片整理作为基础结构的一部分
您应该认真考虑在所有系统中定期运行碎片整理程序。您可以选择使用 Windows 中内置的碎片整理程序或使用第三方产品。这主要取决于您需要进行多少工程处理。Windows XP 及更高版本允许您将 defrag.exe 添加为计划任务，support.microsoft.com/kb/555098 上的相应知识库文章向您显示了添加方法。请注意，便携式计算机碎片整理有一些特殊的注意事项。您想在用户系统启动（最好通过交流电源）时对其进行碎片整理，并且不希望在移动用户正努力完成工作时占用 CPU 和磁盘周期。但遗憾的是，在移动用户未使用自己的系统时，很可能是系统断开了交流电源或者处于待机或休眠状态（从电源管理和计划任务角度出发断开电源）。在 Winternals（其他公司可能也一样），我们花费了很多时间尝试设计一个理想的移动用户方案。如果您使用 Windows Vista，因为它与早期版本相比具有更强的电源感知能力，所以使用内置碎片整理程序和计划任务的解决方案完全可以解决问题。否则，您可能必须使用适用于移动系统的第三方解决方案。某些第三方解决方案实际上是启动碎片整理任务，让您了解该任务是否正在运行、何时运行（和运行频率）以及运行花费的时间。
除了移动方案，您还需要考虑文件系统之外的碎片。通常，您无须针对桌面或移动系统考虑这一问题，但是服务器、Microsoft Exchange、SQL ServerTM 或其他数据存储可能要求自己进行碎片整理。在此类情况下，您需要决定在执行文件系统碎片整理之前还是之后进行该过程。
如果您正使用第三方碎片整理程序，还需要确保它使用了 Windows 碎片整理 API。从 Windows NT 4.0 开始，Windows 已经拥有自己的碎片整理 API 以避免意外的数据丢失。例如，如果在移动文件的过程中系统断电，会出现不完整的移动碎片，这会导致数据丢失甚至无法启动系统。
最后，如果您正使用虚拟计算技术，可能还需要考虑如何管理虚拟磁盘的碎片整理。因为它们同样有可能面临诸多碎片整理问题，在某种意义上还会因大小限制而使情况变得更糟。此外，如果虚拟化解决方案允许压缩磁盘或分区，您可能需要先进行碎片整理，以便释放空间（或者至少可以缩短压缩操作所需的时间）。

其他工具
现在，您应该相信碎片整理是一项重要而有价值的功能了吧！即使不使用第三方工具对自身进行碎片整理，您还可以考虑由 Mark Russinovich 提供的一个称为 PageDefrag 的工具，此工具可从 Microsoft Sysinternals 工具站点获得（请参阅 microsoft.com/technet/sysinternals/FileAndDisk/PageDefrag.mspx）。如上所述，在 Windows 联机时无法对 Windows 页面文件进行碎片整理。实际上，这同样适用于 Windows 注册表文件和事件日志。通过 PageDefrag，您可以在 Windows 完成启动并锁定这些文件之前使用体积小巧的驱动程序对其进行碎片整理。若要使用它，只需运行 PageDefrag 并将其设置为下次重新启动或每次启动时执行即可。当系统重新启动时（在启动过程中您可能会看到磁盘检查已提前运行），将对列表中的指定文件进行碎片整理（请参阅图 6）。
图 6 在 PageDefrag 中进行碎片整理的文件
图 6 在 PageDefrag 中进行碎片整理的文件
PageDefrag 完成后，系统通常会自动启动。有关 PageDefrag 的详细信息，Lance Whitney 在九月份的实用工具特别推荐安装中进行了介绍（请参阅 technetmagazine.com/issues/2007/09/UtilitySpotlight）。请注意，只有 Windows NT 4.0、Windows 2000、Windows XP 和 Windows Server 2003 支持 PageDefrag，它当前并不受 Windows Vista 支持。
除了 PageDefrag，您还可以使用 Sysinternals 提供的另一个称为 Contig 的工具，手动对特定文件进行碎片整理（请参阅 microsoft.com/technet/sysinternals/FileAndDisk/Contig.mspx）。如果无法通过正常碎片整理任务对特定文件进行碎片整理或该文件已变得零碎（但卷的其余部分并不零碎），此工具将非常有用。
Contig 还可以使用通配符对整个目录或子目录进行碎片整理。下面将对 Windows 目录下的所有文件进行碎片整理，无论这些文件位于何处。
Contig –s c:\Windows\*.*
应用 –v 开关可进行细节操作，而 –q 开关可使其安静地运行。

Wes Miller是德克萨斯州奥斯汀市 Pluck 公司 (www.pluck.com) 的一位开发经理。在这之前，他在奥斯汀市的 Winternals Software 公司任职，并曾在 Microsoft 担任 Windows 项目经理和产品经理。您可以通过电子邮件 technet@getwired.com 与 Wes 联系。


 现场注意事项: 行为鳕鱼
现场注意事项
行为鳕鱼
Betsy Aoki

有时 您所需要的也许不是性能更佳的服务器，也不是受过更多教育的用户群，尽管这类人不会在您想早点离开去过周末时打扰您。有时，管理准则不是问题；只是需要“一条相当大的鱼”。
大约一年前，我负责处理 Live QnA 站点 (qna.live.com) 上的滥用报告。我们通过操纵“删除”按钮并对站点进行监视来检查是否存在恶意攻击或不良行为。我们拥有内部工具和外部策略。我们遇到过真正古怪的人，他们试图用令人厌恶的内容蓄意破坏我们的问题。
同时，我也精疲力竭了。但是，保证站点社区正常运行毕竟是我的责任。我曾帮助制定用于设定站点基调的行为准则。我就相当于“守卫”，尽量让每个人都表现良好。
除非他们不乐意这样。人总归还是人 — 也就是最善于说谎和最容易犯错，其实我并不在意某用户是否说其他用户愚蠢。
某个周六，我坐在厨房中，思考着我所维护的行为准则。在用笔乱画的时候，我脑中突然灵机一动。如果没有行为准则，而只有“行为鳕鱼”又会怎样呢？如果是这样的话，这条鳕鱼应该是什么样子，它将如何行动？我在新英格兰长大，在那里我们吃鳕鱼。白色、片状、令人厌烦的鳕鱼。我想通过模拟鳕鱼，用讽刺来斥责和诱导我的 QnA 成员。不再仅仅使用“删除”按钮（我后期使用此按钮太频繁了），还要使用“严厉的幽默”，这些幽默在使人发笑的同时，还会使他们决心再不会发生越轨行为。因此，Norbert“行为鳕鱼”就诞生了。我曾考虑给他一个烟斗，但发现蝴蝶领结就足够了。
行为鳕鱼
我将绘制的鳕鱼图上传到一个新的 LiveID，为它起了 QnA 用户名，然后 Norbert，即 QnA“行为鳕鱼”，就开始工作了。但提醒您，它并不总是我。有时，可能是另一工作组的成员担任“鳕鱼”角色并斥责那些行为卑劣的人。谁是“行为鳕鱼”？请参阅 go.microsoft.com/fwlink/?LinkId=99044。“行为鳕鱼”是否会伤害人的感情？请参阅 go.microsoft.com/fwlink/?LinkId=99045。
QnA 社区成员非常喜欢他，就像...嗯...鱼喜欢水一样。他们与他开玩笑、召唤他，对他发脾气。他教育新来人员，斥责那些我们认为尚可变好的人群，并提供一种了解规则的简单方法，而不是只阅读全是法律术语的网页。
规则 — 无论是公司政策、群体法规还是运动场苛刻的规则 — 都依赖于那些能够认识到实施效果的人群的良好意愿。作为 IT 人员或社区网站开发人员，您可以创建协助实施规则的工具，但有时工作的最佳工具是根据您自己的个性或人类集体群体意识激发出的某些东西。与技术管理相比，少许的社会管理提高和优化可能会更有效。也许，从我们的情况考虑，就是提高、优化和“一条鱼”。

Betsy Aoki是 Microsoft Xbox 团队的社区项目经理。她的电子邮件、博客文章中体现了她的幽默风格，同时在 XNA Framework 上也可能有所体现。


 Windows 机密: 文件系统 Paradox
Windows 机密
文件系统 Paradox
Raymond Chen

如果查看一下硬盘驱动器， 您很可能会注意到大量操作系统文件位于启动驱动器的根目录。如果更进一步查看那些文件，您可能会注意到一个主题：boot.ini、NTLDR 和 NTDETECT.COM 是关键启动文件，而 hiberfil.sys 是休眠文件。这些是启动操作系统（对于 hiberfil.sys，为从休眠状态恢复）的前几个关键阶段将涉及到所有文件，而且它们必须进入启动驱动器的根目录。为什么不能将它们移动到其他位置呢？
我的同事 Adrian Oney 解释道：为了从磁盘中读取启动文件，您需要安装文件系统驱动程序，但文件系统驱动程序位于磁盘中，而且必须加载了文件系统驱动程序才能读取磁盘。噢不，自相矛盾!
通过为关键启动文件构建小型文件系统驱动程序可打破该恶性循环。此小型驱动程序仅能够查找根目录中的文件并将它们加载到内存中。这些文件反过来却可以使操作系统开始运行，此时真正的文件系统驱动程序才能够接管并查找位于更加独特位置（比如，子目录）的文件。
休眠将采用类似的模式。使操作系统处于休眠状态意味着将内存中的全部内容转储到休眠文件中；从休眠状态中恢复需要将该文件提取到内存中并装作什么也没发生过。同样，它也是一个先有鸡还是先有蛋的问题：要加载休眠文件，您需要文件系统驱动程序，但是文件系统驱动程序位于休眠文件中。如果将休眠文件保留在启动驱动器的根目录中，则可使用小型文件系统驱动程序。
曾使用过 MS-DOS® 早期版本的用户非常了解操作系统启动文件的这种位置限制。旧的 SYS 命令使令人厌烦的旧软盘成为奇迹般的可启动软盘。但是，如果在已拥有数据的软盘上运行旧的 SYS 命令，转换过程很可能会失败，因为 MS-DOS 的早期版本要求启动文件位于软盘的特定位置以便启动扇区能够找到它们。MS-DOS 的较新版本通过改进启动加载程序放松了这些要求，但即使是改进版本，系统文件仍必须位于根目录下。
一位客户问道：“我能将休眠文件移动到子目录中吗？”毕竟，文件的位置怎么会有影响？无论您将文件的 ACL 放在哪里，应该都是一样的。但是这些人想将它置于不同于启动驱动器的驱动器上，却被告知不可以。他们并不真正理解为何会有这种限制，因此尝试结束运行：嗯，如果至少能够将它移动到子目录中，我就能够创建一个目录并使该目录成为指向我真正想使休眠文件所处位置的交接点。哈哈 — 我重新定位了休眠文件！
当然，小型文件系统驱动程序并不了解装入点（因为装入点意味着与磁盘管理服务交流，但在系统启动时，计算机甚至还未加载操作系统），对一些了解如何将驱动器号映射回 ARC 路径的奇特、高级服务所知就更少了，而且即使您一定程度上运行该服务，仍必须查找其他硬盘驱动器的设备驱动程序并加载相应的文件系统驱动程序。
不久，就会有人询问将休眠文件置于 DFS 交接点上的方法，这只是时间问题。

Raymond Chen的网站“The Old New Thing”及其同名书籍（Addison-Wesley，2007）讨论了 Windows 的历史和 Win32 编程。他的 Web 2.0 名称是 Raymond，或者可能是 Chester。