 TechNet Magazine September 2007

TechNet Magazine September 2007

Windows Vista: 使用 BDD 2007 部署 Windows Vista

您的组织已经准备从 Windows 2000 或 Windows XP 迁移到 Windows Vista，并且由您负责该项目。不要烦恼。此处将为您提供有关如何使用 Business Desktop Deployment 2007 Solution Accelerator 来简化 Windows Vista 部署的分步指南。

Michael Niehaus Windows Vista: Windows Vista 备份技术指南

备份经常被许多人忽视，而想起时为时已晚。但是没有理由忽视备份，尤其是现在，新的 Windows Vista 备份和还原中心提供了各种功能，使用这些功能可以轻松地保护您的数据以防止各种形式的数据丢失。了解如何使用 Windows Vista 规划完整的恢复策略。

Christine Fok Windows Server: 用于管理 Active Directory 的 11 个基本工具

在一个大型的组织中，即使最常见的 Active Directory 任务（如添加和修改对象）都可能是乏味且耗时的。这 11 种工具可使 Active Directory 管理变得更加轻松。

Laura E. Hunter Windows Server: 恢复 Active Directory 逻辑删除对象

每个 Active Directory 灾难恢复计划都应包含一些基本技巧和工具。逻辑删除恢复就是这些技术中的一种，该技术提供了在不使域控制器脱机的情况下恢复已删除对象的唯一方法。以下是在 Active Directory 中查找和恢复逻辑删除的指南。

Gil Kirkpatrick 通信: 使用 Office Communications Server 2007 连接用户

提供统一通信。浏览 Microsoft Office Communications Server 2007，了解集成的消息传送、语音、视频和会议功能如何提高组织的工作效率并加强远距离协作。

Alan Maddison 编辑视角: 学习途径

Joshua Trupin 读者来信: 有问必答

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

Greg Steen SQL 问题与解答: CPU 瓶颈、还原和移动数据库，及其他信息

Edited by Nancy Michell 实用工具特别推荐: PageDefrag

典型的 Windows 碎片整理工具可以优化硬盘驱动器上的大部分文件。但是某些项目（如 Windows 页面文件和注册表配置单元）超出了大多数碎片整理工具的能力范围。Mark Russinovich 为 Sysinternals 创建的实用工具可通过对其他工具未处理的文件进行碎片整理来节省时间。

Lance Whitney 网络专家: 强弱主机模式

多宿主主机可同时连接多个网络，提供了增强的连接性。但是，在多宿主主机上运行的服务受到攻击的风险性也增加了。为帮助您阻止攻击，本文将介绍多宿主主机的不同主机模式，以及 Windows 如何支持这些模式。

Joseph Davies Windows PowerShell: 保护 Shell

设计 Windows PowerShell 时，Microsoft 将安全性放在首位。事实证明确实如此。让我们来看一看一些主要的安全性功能和设置，如凭据处理和执行策略，这些功能确保 Windows PowerShell 不会遇到与 VBScript 相同的问题。

Don Jones 您好，脚本专家！: 能保存此关系吗？

关系数据库旨在处理一对多关系。这会使编写用来查询这些数据库的脚本变得有点棘手。不过不要担心，脚本专家在这里向您演示您想知道的一切。

The Microsoft Scripting Guys Exchange 问题与解答: 安装程序、邮件日记、存储选项，及其他信息

了解如何使用邮件日记监视公司中的电子邮件、了解 Office 2003 用户是否能够使用统一消息、检查您的 Exchange 2007 实现的存储选项、获得有关如何使用 Outlook 旧版本连接到 Exchange 2007 的解答以及更多内容。

KC Lemson and Nino Billic 安全观察: 用户帐户控制的长期影响

关于用户帐户控制，尽管已做过详实的介绍，但仍存在大量的疑问和误解。下面将公开讨论 UAC 是什么、UAC 不是什么，以及它如何影响管理系统的方式。

Jesper M. Johansson 桌面文件: 使用 Windows PE 进行 PC 恢复

Windows Vista 提供了一些有价值的工具，利用这些工具进行系统恢复相当容易。但是对于大型的、变化多端的组织，现有的解决方案并不总是奏效。如果您所在的大公司需要构建自定义的自我恢复解决方案，请不要错过有关使用 Windows PE 构建自己的恢复解决方案的讨论。

Wes Miller 领域备注: 免费食物和培训技巧

给予用户良好的培训是将问题保持在最低限度的关键所在。因此，切记给予用户非正式的课程培训并且经常巡视，了解用户是否还有问题（否则他们可能不会提出这些问题），这是非常重要的。

Michael Dragone Windows 机密: 已知的 DLL 平衡行为

已知的 DLL 功能作为一种提高性能的方法包含在 Windows 中。了解其工作原理，并且进一步了解该功能如何随时间而变化。

Raymond Chen


 Windows Vista: 使用 BDD 2007 部署 Windows Vista
Windows Vista Michael Niehaus

使用 BDD 2007 部署 Windows Vista
概览:
  • BDD 2007 Solution Accelerator
  • 准备映像
  • 驱动程序和应用程序包

您已拖延了一段时日，但采取果断行动的最终时刻到了。您的组织有数百甚至数千台计算机需要从 Windows 2000 或 Windows XP 迁移到 Windows Vista。而您的团队的工作就是实现这种迁移。
那么应从哪儿开始呢？
如果您几年前就安装了 Windows® 操作系统，您很可能注意到，从 Windows NT® 3.5 到 Windows XP，所做的更改相对较少。安装和配置过程完全一致，使用的工具也相同，整体过程也没有更改。但是在 Windows Vista® 中，整个过程已重新设计并包含了许多新工具。要了解有关这些更改的可靠介绍以及这些更改会对您产生哪些影响，请参阅 2006 年 11 月期《TechNet 杂志》中的“部署 Windows Vista 需要了解的十大事项”文章，该文章也可以通过 technetmagazine.com/issues/2006/11/Deployment 在线获得。

如何学习新的过程和工具？
有两种选择：
  1. 学习每种新工具。研究所有可用文档。确定如何将每个文档插入现有进程。进行必要的调整。然后验证结果。
  2. 利用已为您完成上述所有操作的某内容。
当然，您可以选择第一个选项，但是这将是一本书而不是一篇杂志文章。我建议继续使用第 2 种方法：您将使用的“某内容”是 Business Desktop Deployment (BDD) 2007 Solution Accelerator，它可以通过位于 microsoft.com/desktopdeployment 的 Microsoft® 桌面部署中心下载获得。
BDD 2007 Solution Accelerator 是一组工具、指南和分步操作过程，用于简化 Windows 操作系统部署过程，并将 Windows Vista 引入的所有新部署过程和工具结合在一起。
要开始使用 BDD 2007，请确定一台要安装 BDD 2007 的 Windows XP 或 Windows Server® 2003 计算机。安装之前，需要先安装 Microsoft .NET Framework 2.0 和 Microsoft 管理控制台 (MMC) 3.0。然后，才能安装 BDD 2007 本身。安装后，查看“开始”菜单上 BDD 2007 文件夹中的可用发行说明文档。然后使用 Deployment Workbench 快捷方式启动 MMC 管理单元（请参见图 1）。
图 1 启动 BDD 2007 Deployment Workbench
图 1 启动 BDD 2007 Deployment Workbench
此时，检查信息中心提供的信息，尤其是“入门”检查表和文档可能是比较理想的选择。确保通过右键单击“组件”节点并选择“检查更新”下载最新新闻和组件列表。
还需要另一个必备软件：Windows 自动安装工具包 (AIK)。BDD 2007 需要 Windows AIK 中包含的工具来执行许多功能。您可以通过两种不同方式获得 Windows AIK：从 Microsoft 下载中心 (go.microsoft.com/fwlink/?LinkId=85377) 下载或使用 Deployment Workbench 中的“组件”节点进行下载。无论采用哪种方式的下载都是大型下载，所以需要一段时间进行准备。
安装 Windows AIK 后，您可以继续下一阶段：收集执行 Windows Vista 部署所需的所有文件。

我需要什么文件？
此时，您需要收集 Windows Vista 安装文件、要安装的应用程序、硬件所需的驱动程序以及可能需要的 Windows Vista 更新或语言包。所有文件都将复制到安装 BDD 2007 时创建的分布共享目录结构中。
创建您自己的自定义映像
本文介绍的步骤展示了如何从 Microsoft 产品 DVD 直接部署标准 Windows Vista 映像。但是您可能希望部署包含所有计算机需要的其他应用程序（如 2007 Microsoft Office system）的自定义映像。这是经典之争了：应该继续使用极小的“瘦”映像并在部署期间安装其他所有应用程序，还是应该在预安装了所有应用程序后创建较大的“胖”映像？通常，答案取决于可用于部署的时间、创建和维护映像的管理工作量、网络容量等因素。大多数情况下，越瘦越好，但这由您自己决定。
不管您决定在映像中包含什么，请确保创建自定义映像的过程是完全自动的。通过自动化，对映像进行更新会像将另一步骤添加到过程一样简单，然后重新运行整个过程，最后捕获新映像。
那么如何使用 BDD 2007 进行该操作？这实际上非常简单：
  1. 为创建自定义映像创建版本。
  2. 为此版本修改任务序列以包含所有自定义步骤。
  3. 从实验室部署点（从 Windows PE ISO 启动）执行“裸机”部署，选择该版本。
  4. 指定要加入的工作组。
执行这些步骤时，部署向导会显示另一窗格。
通过选择捕获引用计算机的映像，BDD 2007 将自动执行 Sysprep 准备操作系统以进行捕获，然后重新启动 Windows PE 并执行 ImageX.exe 捕获新的 WIM 映像。然后您可以将该映像导入 Deployment Workbench 中并在下次部署时使用。
使用 BDD 2007 捕获参考映像
使用 BDD 2007 捕获参考映像

首先，让我们复制 OS 安装文件。插入 Windows Vista DVD（最好是批量许可证媒体，因为它不要求为每个安装输入单独产品密钥），然后通过右键单击 Deployment Workbench 中的“操作系统”节点并选择“新建”命令启动“新建 OS 向导”。选择整套源文件并指定到 DVD 驱动器的路径（或相应的路径 — 如果您已将这些文件复制到另一位置）。完成向导，接受其余的默认设置。现在，您应该在单击“操作系统”节点时显示的列表中看到一个或多个 OS 映像（取决于您使用的媒体）。
其次是应用程序。此时，您不必添加任何应用程序，但如果添加了，在部署 Windows Vista 时可从列表中选择它们。理想情况下，您将希望为安装应用程序指定命令行而不进行用户交互，因为您不希望让任何人等待开始应用程序安装。要大致了解前面所说的情形，只需通过选择 Deployment Workbench 中“应用程序”节点上的“新建”命令尝试添加单个应用程序，然后完成“新建应用程序向导”（请参见图 2）。
图 2 将应用程序添加到工作台
图 2 将应用程序添加到工作台
接下来是 OS 程序包。您可能对以下三种类型的程序包感兴趣：语言包、安全更新和 Windows Vista 组件。
语言包可以使 Windows Vista 以多种语言形式运行。有关受支持语言的详细信息，请参阅 microsoft.com/globaldev/vista/Vista_Language_Support.mspx。所有软件保证客户都可以从 licensing.microsoft.com 下载打包为 CAB 文件的语言包，如果您运行的是 Windows Vista Ultimate，也可以通过 Windows Update 获得。（请注意，只有 Windows Vista Enterprise 和 Windows Vista Ultimate 支持安装在计算机上的多语言包。）
Windows Vista 安全更新通常每月发布一次，并可作为单独的 MSU 文件通过 microsoft.com/technet/security/bulletinsandadvisories 下载获得。
您还可以包含新的 Windows Vista 组件，如 Windows PowerShell™。这些组件可以从 Microsoft 下载中心 (microsoft.com/downloads) 下载获得，还可以打包为 MSU 文件。
在后台，所有这些实际上都是组件（也称为程序包），因此就有了“OS 程序包”节点。这些组件都可以注入 Windows Vista，无论是联机（OS 运行时）还是脱机（OS 未运行时）。对于 BDD 2007，在扩展 Windows Vista 映像并将其添加到磁盘之后且首次启动之前，总是脱机注入这些组件。
还有另一个挑战：MSU 文件被设计为在 Windows Vista 运行时使用 WUSA.EXE 更新安装程序进行联机安装。然而，在本示例中，您希望脱机安装这些更新。为此，您需要包含实际组件的 CAB 文件。而这些 MSU 文件实际上是 CAB 文件本身，内含真正的组件 CAB 文件。您可以使用如下命令自己从 MSU 文件中解压缩这些 CAB 文件：
EXTRACT.EXE file.msu -F:*.CAB C:\
这将为您提供需要导入的 CAB 文件。请注意，Microsoft 已发行了自动执行此解压缩操作的 BDD 2007 修补程序。安装此修补程序后，就不必再执行该手动步骤；您可以将 BDD 2007 指向 MSU 文件，它会执行其余操作。有关此修补程序的详细信息，请参阅 support.microsoft.com/kb/937191。
要将这些组件添加到 Deployment Workbench，请右键单击“OS 程序包”节点并选择“新建”以启动“新建程序包向导”。指定到包含要添加的程序包的文件夹的路径。
最后，您可能需要打算在其上运行 Windows Vista 的计算机硬件的驱动程序。从供应商网站或 Microsoft Update 查找您需要的驱动程序，下载它们，然后从以各种不同方式打的包中解压缩。最后的步骤可能需要一些技巧，但是最终结果应该是原始的驱动程序文件：.inf、.sys、.dll 以及驱动程序本身所需的相关文件。
解压缩驱动程序文件后，通过右键单击“驱动程序”节点并选择“新建部署”来运行“新建驱动程序向导”。工作台将扫描目录结构查找所有 .inf 文件，因此不必担心会清除已解压缩的目录结构。
在导出驱动程序后，Deployment Workbench 创建所有驱动程序详细信息的目录，包括受支持的平台、制造商和版本以及驱动程序支持的即插即用 (PnP) ID 列表。

使用这些驱动程序执行什么操作？需要将它们注入先前导入的操作系统映像中吗？
BDD 2007 不对导入的 OS 映像进行任何修改。相反，驱动程序在部署过程中注入。基本过程如下所示：
  1. 在要部署的计算机上运行实用工具 (Microsoft.BDD.PnpEnum.exe)，标识计算机上显示的所有 PnP ID。
  2. 查看驱动程序目录中的每个 PnP ID。对于找到的每个匹配项，将所需的驱动程序文件复制到计算机上。
  3. 在映像应用到磁盘后但首次启动 Windows Vista 之前，指示 Windows Vista 安装程序将驱动程序注入 OS。此顺序非常重要，因为在操作系统启动时可能要用到其中的某些驱动程序（如大容量存储驱动程序）。

是否已为部署做好准备？
在可以进行部署之前，还要执行一些步骤。首先，您需要定义将分布共享中的操作系统与应该使用的设置相关联的版本以及执行 OS 安装和配置所需的任务序列。
要创建该版本，请右键单击“版本”节点并选择“新建”以启动“新建版本向导”。指定版本 ID（选择一个无空格或特殊字符的简单值）以及版本名称和描述，两者都可以在执行操作系统部署时看到（请参见图 3）。然后选择要安装的操作系统，指定要使用的一些基本设置。
图 3 指定基本版本信息
图 3 指定基本版本信息

好，现在我们准备好进行部署了吗？
还需要一样东西：部署点。简而言之，这是一个网络共享，它包括目前为止您收集的所有文件、所有版本详细信息以及部署过程中使用的 Windows PE 映像。创建部署点工作与您目前为止看到的其他步骤相同：右键单击“部署点”节点，选择“新建”。选择实验室或单个服务器部署（请参见图 4）并接受其余的默认设置。
图 4 选择部署点的类型
图 4 选择部署点的类型
完成向导后，右键单击列表窗格中的新部署点并选择“更新”以生成共享和 Windows PE 映像。
记得先前添加的驱动程序吗？Windows PE 也需要这些相同的驱动程序，至少需要有网络和大容量存储驱动程序，因此该更新过程会自动将驱动程序添加到 Windows PE 映像。

是否已准备好进行部署？
是！首先，让我们尝试部署到新的计算机。从 \distribution\boot 文件夹中取出 LiteTouchPE_x86.iso 文件并使用您最喜欢的 CD 编写器软件将其刻录到 CD-R，或使用可以从 Microsoft (go.microsoft.com/fwlink/?LinkID=77796) 下载的 cdburn.exe 工具。从 CD 启动计算机，这将启动 Windows PE 并显示初始欢迎向导，如图 5 所示。
图 5 准备开始部署
图 5 准备开始部署
选择“运行部署向导”并单击“下一步”启动它。您可以从中选择已定义的版本、已添加的任何应用程序以及已导入的任何语言包。您也可以选择加入域、指定计算机的名称以及配置各种其他设置。您甚至可以指定要自动捕获新的自定义映像（使用 Sysprep、Windows PE 和 ImageX 创建新的映像文件）。
部署可能会花费一些时间（取决于计算机的速度和类型），但不需要任何用户交互。部署向导完成后，会显示一个摘要屏幕让您了解有关在该过程中记录的警告或错误的信息。这将使您能够快速确认部署是否成功 — 黄色或红色摘要屏幕表示需要多加注意，白色摘要屏幕表示一切正常。
现在尝试一台正在运行 Windows XP 的计算机。从命令提示符下将驱动器映射到您在 BDD 2007 服务器上创建的 Distribution$ 共享，然后运行 LiteTouch.vbs 开始部署：
NET USE M: \\MyServer\Distribution$
cscript.exe M:\Scripts\LiteTouch.vbs
现在除了增添了一些新的选项之外，启动的仍是您以前看到的同一部署向导（请参见图 6）。
图 6 运行 Windows XP 的计算机的选项
图 6 运行 Windows XP 的计算机的选项
如果选择“刷新”此计算机，现有 OS 将被删除（在使用用户状态迁移工具选择性捕获用户数据和设置之后。用户状态迁移工具需要使用“组件”节点下载，与先前使用 Windows AIK 下载一样），并将执行 Windows Vista 的全新安装。您还可以选择“升级”此计算机，这将使 Windows Vista 安装程序升级现有 OS，保留计算机上的现有应用程序、数据和设置。您选择的选项取决于多种因素，不过大部分人会选择执行刷新，以便以一个清晰已知的状态作为开始。

这就是我需要了解的所有内容吗？
Windows XP 的相关情况如何呢？
如果您仍要部署 Windows XP，怎么办？不要担心，您仍可以使用 BDD 2007 帮助执行该过程。使用的步骤相同；只不过是需要使用 Windows XP 安装文件来创建初始版本，捕获新的 Windows XP Windows Imaging (WIM) 映像（部署 Windows XP 映像比执行无人参与安装快），然后在后续部署中使用该 WIM 文件。
请记住，与 Windows Vista 部署相比，部署 Windows XP 稍显复杂：
Windows XP 大容量存储驱动程序需要额外配置，如 TEXTMODE 文件夹、unattend.txt 设置以及 sysprep.inf 设置。当然，由于大容量存储驱动程序不能注入现有 Windows XP 映像，因此，每次需要添加大容量存储驱动程序时，都需要捕获新的映像。此外，Windows XP 映像不依赖于 HAL，因此您可能需要具有两个或三个单独的映像。最后，因为语言包和安全更新不能脱机注入 Windows XP，所以需要在 Windows XP 启动并运行后安装它们。
如果您将 BDD 2007 用于 Windows XP 部署，那么一旦确定向 Windows Vista 迁移的时机已到，就已经事先完全为 Windows Vista 做好了准备。

不，那只是略知皮毛。但是，通过查看端到端的工作过程，您可以在不需要学习每个工具的情况下了解所有新工具如何协同工作。现在您可以深入了解 BDD 2007 脚本和日志以查看执行的情况。您可以构建自己的自定义映像并将其添加到 BDD 2007 进行部署，而不使用标准 Windows Vista 映像。您可以通过加载到它们上面的映像来创建 DVD 媒体或 USB 闪存驱动器。您可以将 SMS 2003 及其操作系统部署功能包集成到该过程。

从哪里可以找到更多信息？
查看我在前文中跳过的所有文档 — 有千页以上可查，分别由部署项目通常涉及的不同团队提供。也可以访问前面提到的 microsoft.com/desktopdeployment 网站。使用 microsoft.public.deployment.desktop 新闻组，IT 专业人员（例如您自己）可以在其中询问各种 Windows 部署问题。访问第三方网站（如 deployvista.com 和 myitforum.com），这些网站上包含关于 BDD 2007 和 Windows Vista 部署的丰富信息。查看 Microsoft Press 提供的新 Windows Vista 资源工具包书籍 (microsoft.com/mspress/books/9536.aspx)。到 blogs.technet.com/mniehaus 阅读我的博客了解有关 BDD 2007 各部分的讨论。与本地 Microsoft 代表交谈了解有关在您所在区域提供的 BDD 2007 和 Windows Vista 培训研讨会的内容。最后，可参阅“部署资源”侧栏以获得更多信息。
如果您具有 Microsoft Office System 的软件保证，请确保利用 Desktop Deployment Planning Services (microsoft.com/licensing/sa/benefits/deployment.mspx) 以使 Microsoft 或 Microsoft 合作伙伴花几天时间与您协商制定计划，乃至在您自己的网站上从事概念证明实验。
部署资源
  • Microsoft 桌面部署中心 microsoft.com/desktopdeployment
  • 部署 Windows Vista 需要了解的十大事项 technetmagazine.com/issues/2006/11/Deployment
  • Microsoft .NET Framework 2.0 go.microsoft.com/fwlink/?LinkId=94601
  • 用于 Windows Server 2003 x86 的 Microsoft 管理控制台 (MMC) 3.0 go.microsoft.com/fwlink/?LinkId=94602
  • 安全公告和顾问 microsoft.com/technet/security/bulletinsandadvisories

Michael Niehaus是 Microsoft 解决方案加速器团队的一名系统设计工程师。他负责开发针对商用台式机部署的最佳实践、工具和脚本。可通过发送电子邮件至 michael.niehaus@microsoft.com 与其联系。
© 2007 Microsoft Corporation 与 CMP Media, LLC.保留所有权利；不得对全文或部分内容进行复制.


 Windows Vista: Windows Vista 备份技术指南
Windows Vista Christine Fok

Windows Vista 备份技术指南
概览:
  • 文件备份和还原
  • Windows Complete PC 备份和还原
  • 系统还原
  • 卷影副本

太多的人没有想到备份自己的数据，而想到时为时已晚并且数据已经丢失。其实，不应该出现这种情况，但不幸的是，事实往往如此。Windows Vista 旨在利用各种功能使备份更加容易，从而无缝地保护数据。
熟悉的系统还原已经过重新设计，更加稳定可靠，并且支持更多系统修复方案。文件备份已进行了改进，使数据保护更简单、更彻底，而且增加了两个新功能，即 Windows® Complete PC 备份和还原及卷影副本。
所有这些功能都或多或少依赖于卷影复制服务。这是一项创建卷的时间点副本（也称为“卷影副本”）并且跟踪卷影副本间进行的更改的服务。
这四项功能都可以在新的“备份和还原中心”（请参见图 1）找到，这些功能都允许您备份和还原数据，但每项功能都有明显差异。但这些功能结合使用可以提供广泛的保护，防止在计算机的整个生存期中出现各种形式的数据丢失。
图 1 Windows Vista 中的“备份和还原中心”
图 1 Windows Vista 中的“备份和还原中心”

文件备份
计划 Complete PC 备份
计划定期的 Complete PC 备份是确保您具有整个计算机的最新映像的一种方法。Complete PC 备份不可以通过“控制面板”计划，但是您可以通过在“任务计划程序”中创建新任务来计划备份。如果您选择计划 Complete PC 备份，我建议定期监视以验证备份是否成功完成。为什么这是必需的？因为在由于磁盘空间问题或其他暂时问题而导致备份失败时，此方法不通过弹出信息通知您。不应认为这是定期使用文件备份的替代方案。事实如此，以下是如何使用“任务计划程序”计划 Complete PC 备份的方法：
  1. 转到“任务计划程序”（在“开始”菜单的“所有程序”部分的“附件\系统工具”文件夹中可以找到此文件夹）。
  2. 单击“创建任务”。
  3. 转到“常规”选项卡。
  4. 键入描述性名称，如“计划的 Complete PC 备份”。
  5. 如果希望任务不管您是否已登录都要运行，请单击“不管用户是否登录都要运行”。
  6. 单击“使用最高权限运行”。
  7. 转到“触发器”页。
  8. 单击“新建”，然后指定计划备份执行的时间和频率。
  9. 转到“操作”页。
  10. 单击“新建”。
  11. 在“程序或脚本”下，键入 wbadmin。
  12. 在“添加参数(可选)”中，键入以下命令，可根据需要调整目标驱动器号：
    Start backup –allcritical –backupTarget:D: -quiet
    如果希望包括系统卷、启动卷或 Windows 恢复环境卷之外的卷，请使用以下语句代替上面的命令，可以用适当的驱动器号（以逗号分隔）替代 E 和 F：
    Start backup –allcritical –backupTarget:D: -include:E:,F: -quiet
    请注意，该命令应始终包含 allcritical 标记。如果没有此标记会有将重要的系统卷排除在备份之外的风险，这样会导致还原失败。
  13. 配置任何其他与任务相关的设置。
  14. 单击“确定”。

假定我购买了一台新的便携式计算机。在将各种文件（如照片、Microsoft® Word 文档等等）复制到我的系统、安装应用程序并下载最新的 Windows 更新之后，我决定进行文件备份。因此，我将外部硬盘连接到此便携式计算机，然后转到“备份和还原中心”。在我单击“备份文件”按钮后，出现一个可以指导我完成设置的向导。该向导要求指定备份目标（在本例中为外部硬盘）、要备份文件的类别（如图片），以及要执行备份的时间。
文件备份使用基于类别的方法指定要备份的文件。源必须为 NTFS 格式，而目标硬盘可以是 NTFS 格式，也可以是 FAT 格式。确定文件是否与特定类别相关联是以下列三个因素为依据的：MIME 类型、应用程序关联和文件扩展名。
如果要备份不适用于任何其他类别的文件，请选择“其他文件”类别。其中包括带有 Windows 不识别的扩展名的文件。但是，它不支持可执行文件和系统文件。此类文件不通过此功能进行备份，因为它们很少代表用户数据。如果确实要使用此机制备份系统文件和可执行文件，您可以将其压缩为 .zip 文件，并在该向导中选择“压缩文件”类别。
由于这是我第一次在我的新便携式计算机上使用备份功能，所以会立即执行完整备份（即对所选类别的所有文件执行完整备份）。此后，只执行增量备份。术语“增量”在文件备份上下文中指仅跟踪新的或更新的文件。例如，如果您有一个旧的 Word 文档，然后对其进行一些更改，文件备份工具会保留旧文档和更新的文档的完整副本。（单个完整备份和此后创建的连续增量备份统称为备份集。）
您不应该无限制地执行增量备份，而应该不定期地执行完整备份。这样做是受各种因素影响，如距上次进行完整备份的时间、备份的文件数量、备份目标 CD 或 DVD 的数量等等。这样可以确保完整的基准备份始终可用。
备份的数据存储为 .zip 文件（每个这样的文件最大为 200MB）。这样能够更加全面地访问数据。例如，您可以通过直接浏览备份媒体将数据还原到未运行 Windows Vista 的计算机。备份数据存储在单独的文件中并且能够存储在多个光盘中。如果其中一个光盘无法使用，其他媒体上的备份数据仍可以访问。
在文件备份中，卷影复制服务用于创建打开的或应用程序正在使用的文件的一致副本。在备份过程中，备份应用程序从这些一致副本中进行读取。例如，在备份 Microsoft Outlook® 一直打开的 .pst 文件时，这种方法非常便捷。卷影复制服务可确保备份的 .pst 文件处于一致状态，以便在还原时能够对其进行访问。
文件备份不会自动删除。但是，您可以在空间不足时手动删除文件备份。建议：您应该始终删除整个备份集，而非删除单个增量备份。
我应该顺便指出的是您应该避免将文件备份复制到其他位置。如果您一定要这样做，请记住，仅当您将单个原始备份媒体移动到另一个目标媒体时才能这样做。例如，您可以将备份数据从一个 CD 复制到一个 DVD，但是您不能将备份数据从多个 CD 复制到一个 DVD。当您移动备份时，必须复制具有您的计算机名称的备份文件夹和 mediaid.bin 文件，这两者位于备份媒体的根目录下。请注意，如果要还原已经移动的文件，您必须从备份控制面板选择“高级还原”|“从其他计算机创建的备份还原文件”以获取这些文件，因为该计算机上的备份目录不会知道这个新的备份位置。

Complete PC 备份
在完全设置和配置好我的新便携式计算机后，我想进行完整备份，以便保护所有内容，其中包括操作系统、我安装的应用程序、配置设置以及更新。我使用 Complete PC 备份功能进行备份，此功能在硬盘出现故障或出现其他灾难时还可用于恢复我的计算机。我不需要分别重新安装所有应用程序和重新进行所有配置设置。首次运行时，此功能对我选择的卷中的所有块（不包括未存储任何信息的块）执行完整备份。后续备份是在块级别进行的差异备份（稍后对此详加论述）。
执行备份后，“备份和还原中心”的控制面板会更新（请参见图 2）。现在，它提供执行备份的时间和备份存储的位置等信息。
图 2 “备份和还原中心”提供有关以前的备份的详细信息
图 2 “备份和还原中心”提供有关以前的备份的详细信息
同样是执行备份，但 Complete PC 备份完全不同于文件备份。Complete PC 备份以虚拟硬盘 (.vhd) 格式创建整个计算机的块级映像备份。在第一次完整备份过程中，引擎会扫描源磁盘并将包含数据的块复制到存储在目标磁盘上的 .vhd 文件中。虽然备份的数据未进行压缩，但是占用的空间较少。
下一次执行 Complete PC 备份时，只有新的和更改的数据会写入 .vhd 文件，而同一块中的旧数据会移动到卷影副本存储区。卷影复制服务用于计算取得的快照之间的差异，以及处理将旧数据移出到目标磁盘上的卷影副本区域的过程（请参见图 3）。此方法使备份快捷（因为只备份更改的块）而高效（因为数据以压缩形式存储）。请注意，备份应用程序确定了目标磁盘上可用的最大卷影副本存储空间。有关定期或自动使用 Complete PC 备份系统的分步操作过程，请参见侧栏的“计划 Complete PC 备份”。
图 3 数据在 Complete PC 备份和还原中如何移动
图 3 数据在 Complete PC 备份和还原中如何移动
还原数据时，会将块还原到各自的原始位置。如果要从较早的备份还原，引擎会从卷影副本区域进行读取并还原相应的块。
请注意，Complete PC 备份只能备份 NTFS 格式的磁盘。如果备份目标是硬盘，则也需要是 NTFS 格式的。

系统还原
默认情况下，系统还原是启用的。我通过选择“备份和还原中心”左上方显示的“使用系统还原修复 Windows”访问系统还原向导（还可以在“开始”菜单的“所有程序”部分的“附件\系统工具”文件夹中对其进行访问）。如果我选择“选择另一还原点”并单击“下一步”，我可以看到当我设置我的便携式计算机、安装应用程序和执行备份时在各个时刻已经创建的还原点。
默认情况下，还原点只在启动卷上打开，即使系统上的硬盘具有多个卷。还原点是在应用程序和驱动程序安装过程中自动创建的，并且每天在所选卷中创建（如果当天尚未创建还原点）。还原点还可以通过在“系统”控制面板小程序中选择“系统保护”选项手动创建。在文件备份和 Complete PC 备份过程中创建的卷影副本也可以用作还原点。
在 Windows XP 中，系统还原使用文件系统筛选器跟踪系统文件的更改。在 Windows Vista 中，系统还原使用卷影复制服务跟踪所选卷的块级更改。这使系统还原更加稳定可靠，并且使其支持范围更广的修复方案。
而且，现在即使普通 Windows 安装处于脱机状态，新的系统还原仍可以运行。这是使用 Windows 恢复环境实现的，即使 Windows 无法启动也允许您修复系统。

卷影副本
卷影副本几乎不可见。它默认是启用的，并且不需要用户输入任何内容。如果用户需要还原某个文件，此时，她可能会首先注意到此功能。这个过程实质上是公开由卷影复制服务创建的文件的时间点副本的过程。

卷影副本空间管理
用于 Complete PC 备份的活动卷和备份磁盘上都存在分配给卷影副本的存储空间。您可以通过从提升的命令提示符运行以下命令，检查已使用的、已分配的和最大的卷影副本存储空间值：
VSSAdmin list ShadowStorage
已使用的卷影副本存储空间值表示当前卷影副本占用的空间量；已分配的卷影副本存储空间值表示为卷影副本预留的空间量（因此不能用于其他目的）；最大的卷影副本存储空间值是卷影副本保证小于该值的大小限制。
卷影副本的空间分配是自动的，这意味着不能由用户进行设置。每当先前分配的空间用完时，都会以固定的增量分配新空间。这就是已用空间的显示值总是小于您看到的已分配空间值的原因。
对于活动卷，允许的最大卷影副本空间是在第一个卷影副本创建时（通常是在系统还原首次启用以及在安装过程中创建还原点时）确定的。该值设置为以下值中较小的一个：可用空间的 30％ 或卷总大小的 15％。此最大值是静态的。当可用空间增加或减少时它不会更改，在卷大小调整后它也不会更改。
但是，您实际上可以通过从提升的命令提示符使用 VSSAdmin 工具来手动调整此存储区域的大小。例如，将在 C:\ 上的最大存储大小增加到 15GB 的命令应为：
VSSAdmin Resize ShadowStorage /For=C: /On=C: /MaxSize=15GB
此工具源自 Windows Server®，在该系统中特定卷的卷影副本可以在另一个卷上维护。在 Windows Vista 中，某个卷的卷影副本保留在同一卷上。创建卷影副本的卷和维护卷影副本的卷必须相同。
另一方面，用于 Complete PC 备份的备份目标磁盘具有固定的最大卷影副本存储大小，为磁盘空间的 30％。此值由 Complete PC 备份控制，并且不能手动更改。此卷影副本存储空间用于存储 Complete PC 备份的增量。
假定卷影副本存储区域中有足够的空间，一个卷上任一时刻至多可以保存 64 个卷影副本。一旦达到最大空间限制，较旧的卷影副本将被删除，以便为新的卷影副本释放空间。因此，当达到活动卷上的卷影存储限制时系统还原的旧还原点会被删除，而在备份磁盘上达到该限制时 Complete PC 备份会被删除。此外，存储和编辑备份磁盘上的其他数据可能会干扰旧备份的正常老化过程，从而导致更快地删除旧备份。

使用卷影副本还原文件
现在，假定我拥有便携式计算机已有一段时间了，并且我一直在使用它创建一些演示文稿。我已经完成了演示文稿，并将它们提交给了我的客户。一个月之后，我要进行新项目，因此我删除了这些文件。后来，我的经理向我索要一份旧演示文稿。此时，卷影副本就真的派上用场了。
有两种方法可查找已删除文件的副本。第一种，如果我知道文件曾经存储的位置，则我只需右键单击曾经包含已删除文件的文件夹，然后选择“还原以前的版本”。接下来，我选择包含已删除文件所需版本的日期（请参见图 4），单击“打开”，然后将目标文件复制到活动卷上的其他位置。此复制操作与常规文件复制一样快。
图 4 还原已删除文件
图 4 还原已删除文件
如果我已忘记文件的存储位置，则我可以在文件树中打开最接近的父文件夹的以前版本，并在其中进行搜索。例如，如果我已忘记特定文件夹，但是我确实知道它位于 Documents 的某个子文件夹中，则我可以通过在位于 Windows 资源管理器窗口右上角的搜索框中键入文件名（全部或部分）来搜索文档的以前版本，如图 5 所示。请注意，卷影副本的此搜索功能对根文件夹不起作用。由于卷影副本未编制索引，因此，比起在活动卷上进行搜索，搜索时间会更长。
图 5 通过键入部分文件名搜索文档的以前版本
图 5 通过键入部分文件名搜索文档的以前版本

从文件备份还原文件
卷影副本并不是始终可用，由于为了管理可用空间它们时常会被删除。如果我需要一个文件，而使用此方法无法获得，则我可以利用我计划的文件备份。我只需从“备份和还原中心”选择“还原文件”，并选择包含已删除演示文稿的备份日期。当我单击“添加文件”按钮时，会显示一个打开文件对话框，允许我浏览备份。在我选择我要查找的文件之后，会让我选择是将文件还原到原来的位置还是其他位置。
值得注意的是，“还原文件”选项只显示包含在最近备份集中的备份。要查看较旧备份集中的备份，请选择“高级还原”，然后选择“文件来自这台计算机上的旧备份”选项。如果您使用该选项不能找到旧备份集（这种情况极少），请选择“高级还原”，然后选择“从其他计算机创建的备份还原文件”选项。这种情况可能会发生，因为当计算机备份目录变得过大时会被删减。

从 Complete PC 备份还原文件
为了周全起见，我应该提到的是 Complete PC 备份可用于还原单个文件。尽管 Complete PC 备份旨在进行卷级还原，但是它以 .vhd 格式存储数据，这意味着您可以使用脱机 VHD 装载工具访问和还原单个文件。（撰写本文时，VHD 装载工具仅作为 Microsoft Virtual Server 2005 R2 SP1 的一部分提供，Microsoft Virtual Server 2005 R2 SP1 可以从 microsoft.com/technet/prodtechnol/eval/virtualserver 下载。）要装载备份，请打开具有更高权限的命令提示符并导航到 Microsoft Virtual Server\Vhdmount。命令为：
vhdmount /m [path of the .vhd file] [drive letter to assign to the virtual hard drive]
第一次执行此命令时，系统可能由于所需驱动程序未签名而无法将其加载。这将产生一条错误消息，显示无法加载设备驱动程序。要解决此问题，请在使用上述命令装入 .vhd 文件后，转到“设备管理器”，右键单击显示的新设备，然后选择“属性”。接下来，转到“驱动程序”选项卡，选择“更新驱动程序”，单击“浏览计算机以查找驱动程序软件”，然后选择“从计算机的设备驱动程序列表中选择”。正确的驱动程序文件将位于 Microsoft Virtual Server\Vhdmount\vhdstor.inf。安装之后，会出现新的驱动器，而且您将能够浏览最新的 Complete PC 备份并将所需文件复制到其他位置。

Complete PC 还原
现在，假定在一个晴朗的下午，我决定坐在水池旁使用我的便携式计算机。我在潮湿的瓷砖上滑到，而且我的便携式计算机掉到了水池中。计算机无法修理，我别无选择只好买台新的。由于我使用了 Complete PC 备份工具，因此我可以将我的系统还原到新便携式计算机中，不必花费大量时间手动重新安装每个应用程序并重新对其进行个人设置配置。执行 Complete PC 还原非常简单。启动时，我使用 Windows Vista 安装磁盘启动进入 Windows 恢复环境。此时，系统将提示我连接包含系统映像的设备。我选择正确的映像，然后开始还原过程。
完成还原后，我从我最新的文件备份执行文件还原。这是因为我更频繁地执行文件备份，因此包含在我的文件备份中的数据更新。由于计算机还原为所选文件备份之前的某个时间，所以目录中不包含此备份的记录。因此，我选择“高级还原”|“从其他计算机创建的备份还原文件”|“还原此备份中的所有内容”。我还启动新的完整备份以保护最新存储的数据。
Windows 恢复环境通常由 OEM 作为隐藏分区安装在硬盘上。这可用于将 Complete PC 备份映像还原到相同的硬件。但是，如果您需要将创建的映像从一台计算机还原到另一台，则需要从外部媒体（如 Windows 安装磁盘）运行 Windows 恢复环境。
有一些值得注意的事项。Complete PC 还原仅在还原到与生成备份所使用的硬件相同的硬件时才起作用。（当然，是在硬件没有出现故障的前提下。）
由于 Complete PC 备份包括整个计算机的映像，还原到不同的硬件时会受到某些限制。首先，备份映像包含还原完成后用于启动计算机的驱动程序。在少数情况下，启动所需的驱动程序在新计算机上可能不存在。当将在一种类型的磁盘控制器（IDE、SATA 和 SCSI）上创建的映像备份还原到另一类型的磁盘控制器时，可能会出现这种情况。甚至在这种情况下，成功完成还原仍有很大可能，因为包括在映像备份中的常见 Windows 驱动程序可能是兼容的。
其次，仅当新计算机具有至少相同数量的硬盘并且每个硬盘至少与它替代的原始硬盘一样大时，才可以执行还原。如果您打算使用 Complete PC 备份迁移到新硬件，请谨记这些限制。
由于对所有卷的备份和还原在块级执行，因此 Complete PC 还原需要对某个卷进行完全还原或跳过某个卷。因此，您可能希望为备份创建多个卷（例如，将系统文件和数据文件分开）。那么在还原时，您就可以选择只还原系统卷（被视为必需的）或所有卷。

将这些功能用于实践
与 Windows XP 相比，Windows Vista 通过引入新的备份技术和改进现有选项已在保护数据和系统方面做出了重大改进。四项主要的备份功能（文件备份和还原、Windows Complete PC 备份和还原、系统还原和卷影副本）提供不同的功能但又相互补充，实现了广泛的数据保护。了解这些功能如何协同工作，确保您的系统配置为使用这四种方法，并且根据情况应用适当的保护和补救措施是非常重要的。
一般来说，在数据丢失时总是首先尝试卷影副本还原，因为此方法可能具有数据的最新副本。对于系统的不稳定和修复，请使用系统还原。Complete PC 还原通常应该用作完整系统修复的最后手段，而且应该谨慎使用。虽然如此，Complete PC 修复可能是真正的应急方法。最重要的是，不要在为时已晚时才采取行动：立即备份吧！
我要感谢 Eduardo Laureano、Ivan Pashov、Jill Zoeller 以及备份和还原产品团队的所有成员为写作本文提供的帮助。

Christine Fok是 Microsoft 存储解决方案部门的项目经理。她关注 Windows 客户端平台中的备份和还原体验。


 Windows Server: 用于管理 Active Directory 的 11 个基本工具
Windows Server Laura E. Hunter

用于管理 Active Directory 的 11 个基本工具
概览:
  • 在命令行创建对象
  • 在 Active Directory 中执行批量操作
  • Active Directory 更新和维护

如果您负责处理列有从下周开始工作的 200 名新员工资料的 Excel 电子表格，或者由于技术支持人员点击了某些不应点击的内容而导致用户帐户配置错误，
或者您只是需要除了打开“用户和计算机”之外的一种更加轻松的方法来管理 Active Directory®，则有大量免费管理工具可以提供帮助。有些工具内置于 Windows® 操作系统中，有些位于资源工具包或 Windows 支持工具中，而有些甚至是免费的第三方工具。这些便捷工具都包括什么，可以从何处获取？让我们来了解一下。
首先介绍 Windows Server® 2003 中的内置命令行工具，这些工具允许您在 Active Directory 中创建、删除、修改和查找对象。

CSVDE
逗号分隔值数据交换工具（即 CSVDE）允许您使用 CSV 源文件将新对象导入到 Active Directory 中；此外，该工具还提供了将现有对象导出到 CSV 文件的功能。CSVDE 不能用于修改现有对象；在导入模式下使用此工具时，您只能创建全新的对象。
使用 CSVDE 导出现有对象的列表相当简单。将 Active Directory 对象导出到名为 ad.csv 的文件,方法如下：
csvde –f ad.csv
–f 开关表示后面为输出文件的名称。但是您必须注意，根据环境的不同，此基本语法可能会生成不实用的大型输出文件。要将此工具限制为仅导出特定组织单位 (OU) 中的对象，可以将语句修改为如下形式：
csvde –f UsersOU.csv –d ou=Users,dc=contoso,dc=com
进一步假定您只对将用户对象导出到 CSV 文件感兴趣。如果是那样的话，您可以添加 –r 开关和 –l 开关，前者允许指定轻型目录访问协议 (LDAP) 筛选器进行搜索，后者可以限制导出的属性的数量（请注意以下所有内容位于一行）：
csvde –f UsersOnly.csv –d ou=Users,dc=contoso,dc=com –r
    "(&(objectcategory=person)(objectclass=user))" –l
    DN,objectClass,description
通过 –i 开关，您可以将对象从源 CSV 文件导入到 Active Directory。但是，使用 CSVDE 创建用户对象存在一个关键限制：不能使用 CSVDE 设置用户密码。因此，应该避免使用 CSVDE 创建用户对象。

LDIFDE
Active Directory 还提供了另外一个用于执行批量用户操作的内置工具，称为 LDIFDE，与 CSVDE 相比，此工具更强大，更灵活。除了可以创建新对象外，LDIFDE 还可以修改和删除现有对象，甚至扩展 Active Directory 架构。LDIFDE 虽然具有灵活性，但为了实现这种灵活性却必须要使用扩展名为 .ldf 的 LDIF 文件作为输出文件，这种文件与简单的 CSV 文件相比，格式更复杂。（只需少量操作就可以配置好用户密码，我稍后将对此进行介绍。）
我们从一个简单的示例开始，将某个 OU 中的用户导出到 LDF 文件中（请注意以下所有内容位于一行）：
ldifde -f users.ldf -s DC1.contoso.com -d "ou=UsersOU,dc=contoso,dc=com"
       –r "(&(objectcategory=person)(objectclass=user))"
与大多数命令行工具一样，您可以通过运行 LDIFDE /? 命令找到 LDIFDE 开关的完整说明。图 1 介绍了我在此使用过的开关。（注意 CSVDE 和 LDIFDE 命令的开关实际上是相同的。）
Figure 1 LDIFDE 开关 (Close Figure 1)

开关 | 说明
-d | 指定 LDIFDE 为了执行操作应连接到的 LDAP 路径。
-f | 指明要使用的文件的名称，在本例中用于输出导出结果。
-r | 指定要用于导出操作的 LDAP 筛选器。
-s | 指定要连接到的执行操作的域控制器 (DC)；如果遗漏了此项，LDIFDE 将连接到本地 DC 上（如果您正在从工作站中运行此工具，则连接到验证您身份的 DC）。
LDIFDE 的真正功能在于创建和操作对象。然而，进行此操作之前，您首先需要创建一个输入文件。以下语句创建两个名为 afuller 和 rking 的用户帐户；要创建该输入文件，请在记事本（或者您喜欢的纯文本编辑器）中输入以下文本，然后将其保存为 NewUsers.ldf：
dn: CN=afuller, OU=UsersOU, DC=contoso, DC=com
changetype: add
cn: afuller
objectClass: user
samAccountName: afuller

dn: CN=rking, OU=UsersOU, DC=contoso, DC=com
changetype: add
cn: rking
objectClass: user
samAccountName: rking
创建完该文件后，请运行以下命令：
ldifde –i –f NewUsers.ldf –s DC1.contoso.com
您可能会猜到，此处使用的唯一新开关 -i 表明这是一项导入操作而非导出操作。
如果要修改或删除现有对象，不必更改 LDIFDE 命令的语法；相反，您应该修改 LDF 文件中的内容。要更改用户帐户的说明字段，请创建名为 ModifyUsers.ldf 的文本文件，如图 2 所示。
图 2 ModifyUsers LDF 文件
图 2 ModifyUsers LDF 文件
您可以通过运行与之前相同的 LDIFDE 命令语法，在 -f 开关后面指定新的 LDF 文件名来导入更改。用于删除对象的 LDF 格式更简单；要删除一直使用的用户，请创建一个名为 DeleteUsers.ldf 的文件，然后输入以下内容：
dn: CN=afuller OU=UsersOU, DC=contoso, DC=com
changetype: delete

dn: CN=rking, OU=UsersOU, DC=contoso, DC=com
changetype: delete
注意，与 CSVDE 不同，LDIFDE 能够配置用户密码。不过，在为用户帐户配置 unicodePWD 属性之前，必须在域控制器上配置安全套接字层/传输层安全性 (SSL/TLS) 加密。
而且，LDIFDE 能够创建和修改任何类型的 Active Directory 对象，并不仅限于用户帐户。例如，下面的 LDF 文件可在 contoso.com 林的架构中创建名为 EmployeeID-example 的自定义架构扩展：
dn: cn=EmployeeID-example,cn=Schema,
cn=Configuration,dc=contoso,dc=com
changetype: add
adminDisplayName: EmployeeID-Example
attributeID: 1.2.3.4.5.6.6.6.7
attributeSyntax: 2.5.5.6
cn: Employee-ID
instanceType: 4
isSingleValued: True
lDAPDisplayName: employeeID-example
由于 LDIFDE 文件使用工业标准 LDAP 文件格式，因此需要修改 Active Directory 架构的第三方应用程序会经常提供 LDF 文件，您可以在将这些更改应用于生产环境之前使用这些文件检查和批准更改。
除了用于执行批量导入和导出操作的工具外，Windows Server 2003 还包括一个内置工具集，您可以使用它来创建、删除和修改各种 Active Directory 对象，还可以对符合特定条件的对象执行查询。（请注意 Windows 2000 Active Directory 并不支持这些工具，如 dsadd、dsrm、dsget 和 dsquery 等。）

dsadd
Dsadd 用于在特定的目录分区上创建 Active Directory 对象类的实例。这些类包括用户、计算机、联系人、组、组织单位和配额。Dsadd 具备一个由下列内容组成的通用语法：
dsadd <ObjectType> <ObjectDistinguishedName> attributes
请注意，您创建的每个对象类型都有一组特定的开关，它们与该类型的属性相对应。以下命令创建一个填充了各种属性的用户对象（请注意以下所有内容位于一行）：
dsadd user cn=afuller,ou=IT,dc=contoso,dc=com
–samID afuller –fn Andrew –ln Fuller –pwd *
-memberOf cn=IT,ou=Groups,dc=contoso,dc=com "cn=Help Desk,ou=Groups,
dc=contoso,dc=com"
–desc "Marketing Director"
–memberOf 开关要求指定应添加该用户的每个组的完整可分辨名称 (DN)；如果要将用户添加到多个组，您可以添加多个 DN 并用空格分隔开。
任何元素如果包含空格（如 Help Desk 组的 DN），则该元素应该括在双引号中。如果某个元素含有反斜杠（如称为 IT\EMEA 的 OU），则必须输入两次反斜杠：IT\\EMEA。（这些要求适用于所有的 ds* 工具。）
如果使用 -pwd * 开关，则系统将提示您在命令行输入用户密码。您可以在该命令中指定密码 (-pwd P@ssword1)，但是这样会在屏幕上或该命令嵌入到的任何文本或脚本文件中以纯文本形式显示该密码。
同样，您可以使用下列两个命令创建组对象和 OU：
dsadd computer cn=WKS1,ou=Workstations,dc=contoso,dc=com
dsadd ou "ou=Training OU,dc=contoso,dc=com"

Dsmod
Dsmod 用于修改现有对象，它的使用方法与 dsadd 非常相似，您需要根据要修改的对象的类型使用不同的子菜单和语法。以下 dsmod 语句会更改用户的密码并修改该用户的帐户，因此在下次登录时系统会提示该用户更改为新的密码：
dsmod user "cn=afuller,ou=IT,dc=contoso,dc=com" –pwd P@ssw0rd1
    –mustchpwd yes
要了解这些开关多么相似，您可以查看要用于创建此用户并配置了相同属性的 dsadd 语法：
dsadd user "cn=afuller,ou=IT,dc=contoso,dc=com" –pwd P@ssw0rd1
    –mustchpwd yes
您可以清晰地看到，如果知道 dsadd 中用于创建对象的开关，则可以使用那些相同的开关修改 dsmod 用户。

dsrm
dsrm 与 dsadd 是相逆的；正如您可能想到的，使用此工具可从命令行中删除对象。基本的 dsrm 语法相当简明：只需输入 dsrm 后输入要删除对象的可分辨名称即可，如下所示：
dsrm cn=WKS1,ou=Workstations,dc=contoso,dc=com
默认情况下，dsrm 会提示“确实要删除此对象吗?”，此时键入 Y，然后按 Enter。您可以使用 –noprompt 开关禁止显示此提示，但很明显，这样做无法在删除对象之前确认所选对象是否正确。如果要删除容器对象（即，在其内部可能包含其他对象的组织单位），另外两个开关可能会很有用。以下命令将删除 TrainingOU 组织单位及其内部包含的所有对象：
dsrm ou=TrainingOU,dc=contoso,dc=com –subtree
以下命令将删除包含在 TrainingOU 中的所有子对象，但保留组织单位对象本身：
dsrm ou=TrainingOU,dc=contoso,dc=com –subtree
    –exclude

dsmove
要移动或重命名 Active Directory 中的对象，请使用 dsmove 工具，但请注意您只应使用该工具在单一域中移动对象。要在域和林之间迁移对象，请使用 Active Directory 迁移工具 (ADMT)，可从 Microsoft 网站免费下载。Dsmove 依赖于两个开关，它们可以单独使用，也可以结合在一起使用。以下命令将为 Steve Conn 的帐户指定新姓氏：
dsmove "cn=Conn, Steve,ou=IT,dc=contoso,dc=com"
    –newname "Steve Conn"
以下命令将 Steve 的帐户从 IT OU 移动到 Training OU：
dsmove "cn=Conn, Steve,ou=IT,dc=contoso,dc=com" –newparent
    ou=Training,dc=contoso,dc=com
您可以通过同时指定这两个开关，将重命名和移动合并为一个操作，如下所示：
dsmove "cn=Conn, Steve,ou=IT,dc=contoso,dc=com" –newname
    "Steve Conn" –newparent ou=Training,dc=contoso,dc=com

Dsget 和 Dsquery
ds* 命令行工具集还包括两个用于查询 Active Directory 获取信息而非用于创建或修改对象的工具。
Dsget 将对象的 DN 作为输入并为您提供您指定的一个或多个属性的值。Dsget 使用与 dsadd 和 dsmod 相同的子菜单 — user、computer、contact、group、ou 和 quota。
要获得用户帐户的 SAM 帐户名和安全标识符 (SID)，请键入以下命令（请注意以下所有内容位于一行）：
dsget user cn=afuller,ou=IT,dc=contoso,dc=com
    –samAccountName –sid
您将会得到如图 3 所示的输出。
图 3 运行 dsget
图 3 运行 dsget
Dsquery 将返回一个符合您指定条件的 Active Directory 对象的列表。无论您使用的是哪个子菜单，都可以指定以下参数：
dsquery <ObjectType> <StartNode> -s <Search Scope> -o <OutputFormat>
对于 ObjectType，dsquery 可以使用以下子菜单，每个子菜单都具有自己的语法：computer、contact、subnet、group、ou、site、server（请注意，服务器子菜单检索有关域控制器的信息，而不是环境中的任一成员服务器）、user、quota 和 partition。如果其中一个查询类型不符合需要，您可以使用 * 子菜单，这样您可以输入任意格式的 LDAP 查询。
StartNode 指定搜索在 Active Directory 树中的开始位置。您可以使用特定的 DN，如 ou=IT、dc=contoso、dc=com 或下列其中一个快捷说明符：domainroot，从特定域的根目录开始；forestroot，从使用全局编录服务器执行搜索的林根域的根目录开始。
最后，“搜索范围”选项指定 dsquery 搜索 Active Directory 树的方式。Subtree（默认方式）查询指定的 StartNode 及其所有子对象；onelevel 仅查询 StartNode 的直接子项；base 仅查询 StartNode 对象。
为了更好地理解搜索范围，假定有一个 OU，其中包含用户对象和一个子 OU，该子 OU 自身又包含其他对象。使用 subtree 范围将查询该 OU、包含在该 OU 内的所有用户对象和子 OU 及其内容。onelevel 范围仅查询包含在 OU 中的用户而不查询子 OU 及其内容。base 查询仅搜索 OU 本身而不查询其中包含的任何对象。
最后，您可以使用 Output Format 控制如何设置 dsquery 的结果的格式。默认情况下，dsquery 将返回与查询相匹配的所有对象的可分辨名称，如下所示：
"cn=afuller,ou=Training,dc=contoso,dc=com"
"cn=rking,ou=ITTraining,ou=Training,dc=contoso,dc=com"
要查询 IT OU 和任意子 OU 中包含的所有用户对象，请使用以下命令：
dsquery user ou=IT,dc=contoso,dc=com
您可以通过添加其他开关进一步细化此查询，如 -disabled（仅返回已禁用的用户帐户）、-inactive x（仅返回在过去 x 周或更久未登录的用户）或 -stalepwd x（仅返回在 x 天内或更久未更改其密码的用户）。
依据目录中对象的数目，在运行查询时您可能需要指定 -limit x 开关。默认情况下，dsquery 将会返回多达 100 个与查询细节相匹配的对象。您可以指定更大的数目（如 -limit 500），或使用 -limit 0 指示 dsquery 返回所有匹配对象。
也可以使用其他子菜单执行对其他对象类型的有用查询。考虑以下查询，此查询将返回在 Active Directory 站点和服务中定义的位于 10.1.x.x 地址空间中的每个子网：
dsquery subnet –name 10.1.*
或使用以下命令返回位于 Corp 站点中的每个子网：
dsquery subnet –site Corp
使用另一个子菜单，您可以很快确定林中配置为全局编录服务器的域控制器的数量：
dsquery server –forest –isgc
您还可以使用此语法帮助确定域中哪个域控制器承载主域控制器 (PDC) 模拟器灵活单主机操作 (FSMO) 角色：
dsquery server –hasfsmo pdc
与其他包含子菜单的 ds* 命令一样，您可以转到命令提示符并键入 dsquery user /?、dsquery computer /?、dsquery subnet /? 等查看特定 dsquery 子菜单中可用的所有开关。
另一个灵活的技巧是使用管道字符（在美式键盘上按下 shift 的同时按反斜杠即可）将 dsquery 的输出通过管道传送到其他工具（如 dsmod）中。例如，假设您的公司已将 Training 部门重命名为 Internal Development，现在您必须将每位相关用户的说明字段从旧部门名称更改为新名称。在单一命令行上，您可以查询具有 Training 的说明字段的用户对象，然后批量修改该说明字段，如下所示：
dsquery user –description "Training" | dsmod
    -description "Internal Development"

一些第三方产品
由于 Active Directory 基于 LDAP 标准，您可以使用任何支持 LDAP 的工具对其进行查询和修改。许多第三方供应商已发布了收费的工具，帮助您管理 Active Directory，但有时您会发现为社区免费提供的极具价值的工具。目录服务 MVP Joe Richards 创建的集合就是这种情况，可以从 joeware.net/freetools 下载。在那里您将会发现大量具有不同功能的工具。我反复使用的有 adfind、admod 和 oldcmp 这三种工具。

Adfind 和 Admod
Adfind 和 admod 类似于 dsquery 和 dsmod；adfind 是 Active Directory 的命令行查询工具，admod 能够创建、删除或修改一个或多个 Active Directory 对象。
与具有多个子菜单并且开关依据对象类型而异的 ds* 工具不同，adfind 和 admod 具有一致的语法，与要尝试执行的查询或修改类型无关。adfind 的基本语法为：
adfind –b <Search Base> -s <Search Scope> -f <Search Filter>
    attributesDesired
所以对域中所有计算机对象的 DN 和说明的查询应为：
adfind –b dc=contoso,dc=com –s subtree –f (objectclass=computer) dn
    description
对所有用户对象的查询如下所示：
adfind –b dc=contoso,dc=com –s subtree –f "(&(objectcategory=person)
    (objectclass=user))" dn description
注意，除了 LDAP 查询的内容外，语法没有任何更改。
使用 adfind 时，您将发现许多快捷操作符，可以减少许多键入内容。例如，-default 开关可以取代上一示例中的 -b dc=contoso,dc=com 并搜索整个域；-gc 搜索垃圾收集 (GC) 并返回 Active Directory 林中所有的用户。还可以使用 -rb 开关设置相对搜索库；如果要在 phl.east.us.contoso.com 域中搜索 Training OU，您可以通过仅仅指定 –default –rb ou=Training，而非 –b ou=Training, dc=phl,dc=east,dc=us,dc=contoso,dc=com，从而减少许多工作量。
另外，adfind 还可以执行在命令行中不能轻松管理的许多高级搜索功能，如图 4 所示。
Figure 4 adfind 开关 (Close Figure 4)

开关 | 说明
-showdel | 查询 Deleted Objects 容器，查找逻辑删除对象。
-bit | 查询 userAccountControl 属性之类的位运算符。
-asq | 执行属性范围查询。此功能（在 dsquery 中不能使用）可以检索特定对象的属性，然后对其执行查询。
-dsq | 将 adfind 查询的结果通过管道传送到 dsmod 或其他 ds* 工具之一。
使用 –asq 开关“显示 HelpDesk 成员的组成员身份”的示例如下所示：
adfind –default –rb cn=HelpDesk,ou=IT –asq member memberOf
顾名思义，admod 用于修改 Active Directory 中的对象。与 adfind 一样，不需要记住有特殊语法的特定子菜单；admod 在任何时候都使用相同的语法，与要处理的对象类型无关。还可以使用 admod 添加、移动、重命名、删除甚至恢复对象，只需通过添加相应的开关（如 -add、-rm、-move、-undel）即可实现。就像 dsquery 和 dsmod 一样，您也可以使用 | 字符将 adfind 查询的结果通过管道传送到 admod。
请注意，使用 admod 执行恢复操作只能执行逻辑删除恢复操作，在此操作中大部分对象属性已被删除。要完全还原某个对象及其所有属性，您仍需要执行该对象的授权还原。

Oldcmp
还有一个 joeware 工具，我认为它是自动工具包中必不可少的一部分：oldcmp，该工具会扫描 Active Directory 数据库，查找在指定周数内未使用的计算机帐户，而且可以执行以下操作：
  • 创建帐户报表而不对其进行任何操作
  • 禁用未使用的计算机帐户
  • 将计算机帐户移动到另一个指定的 OU 中
  • 完全删除计算机帐户
请注意，由于 oldcmp 可能会严重损坏您的目录，因此它有许多内置的安全功能。它不会删除尚未禁用的任何帐户（无需手动指定“No really, I mean it!”命令行开关）。无需指定类似的“No really, I mean it!”开关，每次修改对象不会超过 10 个，而且绝对不会对域控制器的计算机帐户执行任何操作。
现在，尽管工具的名称易于误导，但是 Joe 已更新了 oldcmp，以便对在特定时间内未使用的用户帐户也能执行相似的功能。
对于一个小型 Active Directory 环境或每次只执行一两个添加或更改操作的环境，GUI 工具（如 Active Directory 用户和计算机）可能足以满足日常管理需要。但是，如果您每天都要添加和修改大量对象，或者只是需要更加简化地管理任务解决方案，则改用命令行可以大大加快在 Active Directory 中创建、修改和删除对象的过程。您已经了解到，有许多灵活且功能强大的工具可以免费获得，它们或者内置于 Windows 中，或者可从 Active Directory 社区成员中下载。这些工具中的任何一个都能够大大提高 Active Directory 管理员的工作效率，与此同时，它们在您的日常工作中变得更加必要。

Laura E. Hunter曾连续四次获得 Windows Server 网络领域中的 Microsoft MVP 奖。她是“Active Directory Cookbook, Second Edition”（Active Directory 详解，第二版）(O'Reilly, 2006) 的作者。Laura 在 IT 行业已有 10 年的丰富经验，目前在一家全球著名的工程公司担任 Active Directory 架构师。她拥有多个行业的相关证书，而且经常在用户组会议和行业会议上发表演讲。


 Windows Server: 恢复 Active Directory 逻辑删除对象
Windows Server Gil Kirkpatrick

恢复 Active Directory 逻辑删除对象
概览:
  • 如何将已删除对象存储在 Active Directory 中
  • 使用 LDP 和 ADRESTORE 查找和还原逻辑删除
  • 对象属性和 systemFlags

也许这并不是您最喜欢思考的主题，但出现意外数据丢失的情况是一个不争的事实，作为一名 IT 专业人员，您必须准备好各种恢复方案。在 2007 年 4 月一期的《TechNet 杂志》中，我论述了关于采取恢复
Active Directory® 用户和组的计划的重要性。可在 technetmagazine.com/issues/2007/04/ADRecovery 找到该文章，我在其中介绍了对象链接、复制、删除和授权还原的结构。遗憾的是，授权还原功能要求在目录服务还原模式 (DSRM) 下启动域控制器 (DC)。这样做会导致 DC 在还原操作期间不可用。
还存在另外一种方法，您应有所了解。逻辑删除恢复（与“僵尸”电脑无关）可提供无需使 DC 脱机就能恢复已删除对象的唯一方法，并且还是恢复已删除对象身份信息（如 objectGUID 和 objectSid 属性）的唯一方法。它巧妙地解决了重新创建已删除用户或组、必须修复所有旧访问控制列表 (ACL) 引用（其中包含已删除对象的 objectSid）的问题。不过请记住逻辑删除恢复有其自身的缺陷，相关内容我将在后面讨论，所以您仍需要掌握授权还原技能。
逻辑删除恢复是通过 Windows Server® 2003 Active Directory 引进的，用于简化一些数据恢复方案。在对对象进行物理删除之前，Active Directory 可将已删除对象保留在数据库中一段时间，该功能恰利用了这一点。在这篇文章中，我将详细描述 Active Directory 如何删除和恢复对象，还将演示如何使用标准 Microsoft 工具恢复已删除对象。

逻辑删除是什么？
当 Active Directory 从目录中删除对象时，并没有将对象从数据库中物理删除，而是通过将对象的 isDeleted 属性设置为 TRUE，删除对象的大部分属性、对对象进行重命名，然后将对象移动到对象的命名上下文 (NC) 中的一个特殊容器（名为 CN=Deleted Objects）中，从而将对象标记为已删除对象。此时的对象称为逻辑删除，在普通目录操作下，处于不可见状态。它不在任何 Microsoft® 管理控制台 (MMC) 管理单元中显示，大多数轻型目录访问协议 (LDAP) 实用工具意识不到逻辑删除的存在。无论从哪点看，逻辑删除似乎都消失了。然而，数据仍然存在，只是不可见而已。那么为什么 Active Directory 在数据库中保留逻辑删除这些在别处已删除的对象呢？
虽然逻辑删除对于其他过程不可见，但对于 Active Directory 复制过程是可见的。为了确保在所有承载被删除对象的 DC 上执行删除，Active Directory 将逻辑删除复制到其他 DC。因此逻辑删除被用于在 Active Directory 环境中复制删除。

逻辑删除的生存期
为响应 LDAP 删除协议操作或安全帐户管理器 (SAM) 删除操作，Active Directory 通常从目录中删除对象。此操作称为原始删除，与 Active Directory 复制过程执行的删除操作不同。注意，此处的讨论并未考虑动态对象，该类对象具有不同的删除机制，当它们的生存期 (TTL) 过期时，Active Directory 会将它们直接删除。
当 Active Directory 收到删除操作时，它首先遍历一个检查表以确保允许删除该对象。包含此过程显得有些奇怪，但这是因为它可确保满足以下所有条件：
  • 未将对象的 isDeleted 属性设置为 TRUE。（无法删除已删除对象！）
  • 未在对象的安全描述符中设置特定于“专有对象”资源的安全描述符控制标志。（这显示为未记录的“feature”。该专有对象标志是安全描述符结构的 Sbz1 字节的位 1。）
  • 未在对象的 systemFlags 属性中设置“disallow delete”位 (0x80000000)。
  • 未将对象的 isCriticalSystemObject 属性设置为 TRUE。
  • 对象的安全描述符向用户授予了删除对象所需的相应访问权限。（更具体地来说，就是允许用户删除对象本身以及从父对象中删除子对象。）
  • 该对象不是现有命名上下文的交叉引用对象 (objectClass = crossRef)。
  • 该对象没有任何附属对象。（如果 LDAP 删除操作包含 LDAP "tree delete" 控件对象 ID，Active Directory 将同时自动删除附属对象，除非附属对象的 isCriticalSystemObject 属性设置为 TRUE。这样可防止将关键系统对象被作为树删除操作的一部分无意删除。当然您可以逐一删除这些对象。）
  • 该对象不是关键内部对象（例如，它既不是 DC 的 nTDSDSA 对象，也不是 NC 头的上级的占位符对象）。
除了应满足这些条件外，Active Directory 还必须处于合适的状态以处理删除操作。例如，如果 Active Directory 正在重新命名一个域，它将不会删除域信任帐户或 crossRef 对象。
如果已确定对象确实可删除，那么 Active Directory 会继续将该对象转换为逻辑删除。Active Directory 首先删除不必要的对象属性，在逻辑删除中只保留图 1 中指定的以及架构中定义的那些属性。（请参阅“恢复对象属性”部分获取相关详细信息。）然后，它将对象的相对可分辨名称 (RDN) 更改为 CN=<old RDN>\0ADEL:<objectGUID>，其中，\0A 表示 ASCII 换行符字符，<objectGUID> 是以字符串形式表示的 objectGUID。然后，lastKnownParent 属性被设置为对象父容器的可分辨名称 (DN)，isDeleted 属性被设置为 TRUE。随后，Active Directory 删除对象中的所有前向和后向链接属性。最后，如果该对象的 systemFlag 属性不具有“disallow move on delete”位集，那么 Active Directory 会将对象移动到 NC 的 CN=Deleted Objects 容器中。（请参阅“systemFlags 属性和对象行为”侧栏，获取有关该主题的详细信息。）
Figure 1 保存在逻辑删除中的属性 (Close Figure 1)

要保存的硬编码
attributeID
attributeSyntax
dnReferenceUpdate
dNSHostName
flatName
governsID
groupType
instanceType
lDAPDisplayName
legacyExchangeDN
mS-DS-CreatorSID
mSMQOwnerID
nCName
objectClass
objectGUID
objectSid
oMSyntax
proxiedObejctName
replPropertyMetaData
sAMAccountName
securityIdentifier
sIDHistory
subClassOf
systemFlags
trustPartner
trustDirection
trustType
trustAttributes
userAccountControl
uSNChanged
uSNCreated
whenCreated
因 searchFlags 设置而保存
msDS-AdditionalSamAccountName
msDS-Auxiliary-Classes
msDS-Entry-Time-To-Die
msDS-IntId
msSFU30NisDomain
nTSecurityDescriptor
uid
您应注意 CN=Deleted Objects 文件夹是平面的，没有对象层次结构。您也许会认为，这会导致删除具有相同 CN 的两个不同对象时出现名称冲突。然而，事实并非如此。因为 objectGUID 合并到每一个逻辑删除的 RDN，而每一个逻辑删除的 RDN 在 CN=Deleted Objects 容器中是唯一的。
显然，对象不会永远保留在 CN=Deleted Objects 容器中。对于最初使用 Windows® 2000 和 Windows Server 2003 构建的林，其默认逻辑删除生存期为 60 天；最初使用 Windows Server 2003 SP1 构建的林，其默认逻辑删除生存期为 180 天。通过设置 CN=Directory Service,CN=Windows NT, CN=Services,CN=Configuration, DC=<root domain> 对象的 tombstoneLifetime 属性，可更改逻辑删除生存期。
每隔 12 个小时，每个域控制器就会启动一个垃圾收集进程。（通过为 CN=Directory Service,CN=Windows NT, CN=Services,CN=Configuration,DC=<root domain> 对象的 garbageCollPeriod 属性设置新值，可对此时间进行更改。）垃圾收集扫描 DC 上的所有逻辑删除，对其中超过逻辑删除生存期的逻辑删除进行物理删除。

使用 LDP 查找逻辑删除
LDP 是类似 Windows 资源管理器的实用工具，同 Active Directory 搭配使用。Active Directory 开发团队设计 LDP 的最初意图是在开发 Active Directory 时，使用 LDP 测试其 LDAP 代码。现在，作为 Windows Server 2003 支持工具的一部分，LDP 已经发展成为一种与 Active Directory 配合使用的强大工具。
虽然逻辑删除对于普通目录操作是不可见的，但是您可在 Active Directory 中使用 LDAP 搜索操作和称为控件的特殊 LDAP 扩展查找逻辑删除对象。控件是在 LDAP 标准中定义的一种机制，用于扩展 LDAP 协议以提供超出 LDAP 标准中定义的功能以外的额外功能，同时保留与其他符合 LDAP 的软件的兼容性。Active Directory 支持 22 个控件，其中包含 Return Deleted Objects 控件。当使用该控件扩展 LDAP 搜索操作时，该控件会检索在其他情形下不可见的已删除对象。
为了演示该工作过程，我使用企业管理员凭据登录 foo.local 域，然后使用 Active Directory 用户和计算机 (ADUC) MMC 管理单元创建用户对象 (CN=John Smith,CN=Users,DC=foo, DC=local)，如图 2 所示。然后再次使用 ADUC 删除该用户对象。
图 2 使用 ADUC 创建用户
图 2 使用 ADUC 创建用户
现在，我可以运行 LDP 程序并使用它显示已删除用户的逻辑删除。第一步是将 LDP 连接到特定的 DC，然后使用相应的凭据进行身份验证。要连接到 DC，只需在“连接”菜单上选择“连接”选项。因为我正在 DC 上运行 LDP，所以只需按“确定”即可连接到本地 DC。如果正在远程运行 LDP，则必须指定打算连接到的 DC 的名称。连接成功后，LDP 会显示 rootDSE 的属性 — 这包含描述 DC 本身的状态和配置的属性（请参见图 3）。
图 3 连接到 DC 的 LDP
图 3 连接到 DC 的 LDP
现在，为了使用域或企业管理员凭据对 DC 进行身份验证，我在“连接”菜单上选择“绑定”。因为我已经作为林的企业管理员登录（默认情况下，域管理员和企业管理员有权列出并恢复 CN=Deleted Objects 容器中的对象），所以我只要使“绑定”对话框中的“用户名”和“密码”保持空白然后按“确定”即可。否则，我可以在“绑定”对话框中输入相应的凭据。
下一步，列出 CN=Deleted Objects,DC=foo,DC=local con- tainer 的内容。正常情况下，您不会看到 CN=Deleted Objects 容器，因为该容器本身被标记为已删除。搜索 CN=Deleted Objects 容器的唯一方法是使用 Return Deleted Objects LDAP 控件。
要对 LDP 使用此控件，请转到“浏览”菜单，然后选择“搜索”。此时会出现图 4 中所示的“搜索”对话框。基 Dn 字段允许您在目录树中指定搜索开始的位置。输入域的“已删除对象”容器的 DN，在本例中，DN 是 CN=Deleted Objects,DC=foo,DC=local。
图 4 “LDP 搜索”对话框
图 4 “LDP 搜索”对话框
在筛选器字段中，我指定了 LDP 将使用的搜索条件。默认值为 (objectClass=*)，它会指示搜索返回所有具有 objectClass 属性值的对象。因为在 Active Directory 中已删除的对象也具有 objectClass 值，所以默认筛选器将返回该搜索范围内的每个对象。在本例中，我将筛选器更改为 (objectClass=user)，将搜索限制为用户对象。这样，在 CN=Deleted Objects 容器大约成千上万的逻辑删除中查找已删除的 John Smith 用户会比较简单。
您可能会发现，在单个搜索操作中，CN=Deleted Objects 容器要比 Active Directory 返回的对象多。要解决此问题，通常您将使用分页 LDAP 搜索，每次返回一组结果。但是，LDP 不允许同时指定分页和扩展搜索。所以，必须优化 LDAP 筛选器来查找希望获取的对象。
使用“范围”单选按钮，可以指定要搜索的目录树范围。基础搜索将仅返回由基 Dn 字段指定的对象。一级搜索将返回直接从属于基 Dn 对象的对象。子树搜索将返回所有从属于基 Dn 对象的对象。由于 CN=Deleted Objects 文件夹是平面的，因此我使用一级搜索来检索所有逻辑删除。
到目前为止，我仅大致介绍了传统的 LDAP 搜索。如果我现在就运行搜索，LDP 将显示一个错误，指出 CN=Deleted Objects,DC=foo,DC=com 不存在，因为它被标记为已删除。我仍必须将 Return Deleted Objects LDAP 控件包括在搜索操作中。为此，我单击“搜索”对话框上的“选项”按钮，然后选择搜索调用类型为“已扩展”，如图 5 所示。通过此选项，我能够为搜索操作指定控件。此处，我还将属性列表更改为 *。这将导致 LDP 显示它检索的每个对象的所有常规属性，而不是 LDP 的默认属性集。
图 5 LDP 搜索 “选项”对话框
图 5 LDP 搜索 “选项”对话框
现在我按下“控件”按钮以显示“控件”对话框。LDP 的“控件”对话框有点难以使用，所以当进行此操作时，请确保认真执行以下步骤以添加 Return Deleted Objects 控件。
打开“加载预定义控件”下拉列表，选择“Return Deleted Objects”，然后按“签入”按钮。这将 Return Deleted Objects 控件 (1.2.840.113556.1.4.417) 的对象标识符 (OID) 添加到“活动控件”列表中，如图 6 所示。然后，LDP 将该控件添加到所有的后续扩展搜索操作中。按“确定”以保存控件设置，然后再次按“确定”关闭“搜索选项”对话框。
图 6 添加 Return Deleted Objects 控件
图 6 添加 Return Deleted Objects 控件
“控件”对话框具有一些特殊行为。具体来说，即使 OID 显示在“活动控件”列表中，也并不一定意味着该控件实际上已生效。有时，您必须签出控件，然后再将其签回，以确保将在下一个 LDAP 操作中可使用此控件。
现在我已准备好运行我的搜索了。我按下“LDP 搜索”对话框上的“确定”按钮，然后 LDP 将检索来自该域 CN=Deleted Objects 容器的所有用户对象。图 7 显示了我的结果。
图 7 来自 CN=Deleted Objects 容器的结果
图 7 来自 CN=Deleted Objects 容器的结果

检查 LDP 结果
我的搜索返回了两个逻辑删除对象。首先，您可以看到第一个逻辑删除的 DN：CN=John Smith\0ADEL:41800281-6bc4-42c3-a99b-b283022b3af8,CN=Deleted Objects,DC=foo,DC=local。已删除对象的 objectGUID 表示为字符串 (41800281-6bc4-42c3-a99b-b283022b3af8)。在 DN 下面有一个属性列表，显示了 objectClass、cn 和 distinguishedName 等的值。您可以看到 isDeleted 属性的值为 TRUE，这表示该对象实际上已被删除。您还会看到 objectSid 已被保留在逻辑删除中 — 这对于恢复用户和组逻辑删除来说非常重要，稍后我将讲到这一点。lastKnownParent 属性表示在成为逻辑删除之前包含已删除对象的对象的 DN，此属性在恢复逻辑删除时也极其重要。
在我的示例中，LDP 显示了两个逻辑删除对象，两个都是来自 CN=Users,dc=foo,dc=local 容器的名为 CN=John Smith 的用户对象。两个具有相同 RDN 的单独对象怎么会来自同一容器？这个解释起来非常简单。在运行 LDP 搜索逻辑删除之前，我在 CN=Users,DC=foo,DC=local 容器中创建了 CN=John Smith 用户对象，然后又将其删除。然后，我创建了另一用户对象，并且所有属性与 CN=John Smith 用户对象的属性完全相同，我又将其删除。因为我已经删除了第一个 CN=John Smith 用户对象，所以创建第二个用户对象是完全合理的，即使它具有相同的名称也无妨。但它们是单独的、唯一的对象，由它们的 objectGUID 加以区分。因为 Active Directory 将 objectGUID 合并到了逻辑删除的 DN 中，因此它们在 CN=Deleted Objects 容器中显示为单独的对象。

逻辑删除是如何恢复的
Active Directory 提供了将逻辑删除恢复为常规对象的机制。这实际上是一个针对已删除对象的取消删除操作函数。此函数是一个结构特殊的 LDAP 修改操作，必须包括两个特定属性修改：它必须删除 isDeleted 属性（不是仅设置为 FALSE），并且它必须通过更改对象的 distinguishedName 将对象移动到另一容器。新的 distinguishedName 通常（但并不一定）将 lastKnownParent 属性用作容器，保留相同的 RDN，而不包括 Active Directory 创建逻辑删除时添加的 \0ADEL:<objectGUID> 组件。
在恢复逻辑删除之前，Active Directory 进行检查，以确保满足所有特定的必要条件。用户必须具有恢复逻辑删除扩展的访问权限，该权限是在包含逻辑删除的 NC 的 NC 头上定义的。用户不能恢复自己的对象。必须将逻辑删除的 isDeleted 属性设置为 TRUE。与在安全描述符中定义的相同，对象的所有者安全标识符 (SID) 必须具有来自林中某一个域或者受信任域的 SID。
如果涉及的对象位于“配置”或“架构 NC”中，则必须在逻辑删除的 systemFlags 属性中设置 FLAG_CONFIG_ALLOW_RENAME 和 FLAG_ CONFIG_ALLOW_MOVE 位。如果对象位于“配置”或“架构 NC”中，并且已经设置 FLAG_CONFIG_ALLOW_LIMITED_MOVE 标志，则仅可将该对象移动至具有相同祖父的容器中 — 也就是说在移动后，该对象必须保留其增祖父。如果对象位于域 NC 或应用程序分区中，则不应在逻辑删除的 systemFlags 属性中设置 FLAG_DOMAIN_DISALLOW_RENAME 和 FLAG_DOMAIN_DISALLOW_MOVE 位。
正如安全描述符中所定义的，用户必须有修改 RDN（通常是 CN，但并非始终如此）并将对象添加到新的父容器的权限。并且按照架构定义，对于逻辑删除的 objectClass，新父容器必须可以是上一级。虽然在正常情况下不允许移入或移出系统容器（除非 Unlock system subtree 注册表值为非零），但是，允许将逻辑删除恢复到系统容器中。
永远不允许恢复架构对象。但是，这并不会真正成为一个问题，因为您不能从构架 NC 合法地删除对象。
如果所有检查都成功且满足所需条件，Active Directory 将对逻辑删除执行下列步骤来恢复该对象：
  • 删除 isDeleted 属性。
  • 如果未在修改操作中另行规定，会将 objectCategory 设置为逻辑删除中指出的最特定 objectClass。
  • RDN 已更改并且已将该对象写入新的父容器。
恢复后，该对象具有与原来相同的 objectGUID 和 objectSid 属性。这意味着对该对象的外部引用（如在 ACL 中）不必像重新创建已删除对象时那样进行重置。该恢复对象看起来以及操作起来都和删除前一样。不过，还有一个重要差异：还原的对象丢失了在逻辑删除中未保存的全部属性。

使用 LDP 恢复逻辑删除
systemFlags 属性和对象行为
systemFlags 属性是为 top 类定义的可选属性，它使 systemFlags 成为每个 Active Directory 类的可选属性。它是 32 位整数位掩码，用于控制对象移动和删除的行为。下面是一个重要标志梗概：

FLAG_DISALLOW_DELETE (0x80000000)

如果设置了此标志，系统将禁止删除对象或将对象移动到另一个域。

FLAG_CONFIG_ALLOW_RENAME (0x40000000)

不能重命名配置 NC 和架构 NC 中的对象，除非在 systemFlags 属性中设置了此标志。

FLAG_CONFIG_ALLOW_MOVE (0x20000000)

不能移动配置 NC 和架构 NC 中的对象，除非在 systemFlags 属性中设置了此标志。

FLAG_CONFIG_ALLOW_LIMITED_MOVE (0x10000000)

不能移动配置 NC 和架构 NC 中的对象，除非在 systemFlags 属性中设置了此标志。此标志对移动操作的目标容器进行了进一步的限制 — 目标容器必须与当前容器具有相同的“祖父”。

FLAG_DOMAIN_DISALLOW_RENAME (0x08000000)

默认情况下，可以重命名域 NC 或应用程序 NC 中的对象。但是，如果对象的 systemFlags 属性设置了此标志，系统将不允许重命名该对象。

FLAG_DOMAIN_DISALLOW_MOVE (0x04000000)

默认情况下，可将域 NC 或应用程序 NC 中的对象移动到另一个容器。但是，如果对象的 systemFlags 属性设置了此标志，系统将不允许移动该对象。

FLAG_DISALLOW_MOVE_ON_DELETE (0x02000000)

如果设置了此标志，系统不会将对象移动到其命名上下文的 CN=Deleted Objects 容器中。它将只设置 isDeleted 属性，重命名该对象并删除要保存的架构中未指定的属性。这意味着并不是所有已删除对象都会出现在命名上下文的 CN=Deleted Objects 容器中；某些对象仍然会保留在原始父容器中。

前面我已经展示了逻辑删除恢复工作的具体细节，现在我要演示怎样使用 LDP 还原已删除的用户 CN=John Smith。首先，我连接到 DC 并进行身份验证。现在，我可以使用 LDP 执行修改操作。在修改操作参数过程中，我可以删除 isDeleted 属性，同时指定一个新的 DN。
因为我打算对逻辑删除进行操作，所以必须指定 Return Deleted Objects LDAP 控件。若要在 LDP 中为修改操作设置此控件，请在“选项”菜单下选择“控件”，在“加载预定义控件”下拉列表中选择“Return deleted objects”，然后按“签入”按钮，最后按“确定”保存控件设置。
现在，在“浏览”菜单中选择“修改”，打开“修改”对话框，输入要还原的逻辑删除对象的 DN。执行此操作最简单的方法是复制和粘贴来自之前执行的搜索操作结果中的 DN。
下一步，我必须输入待执行的属性操作的列表。恢复逻辑删除需要执行两个属性操作 — 删除 isDeleted 属性以及使用所需的恢复逻辑删除的 DN 替换 distinguishedName 属性。所以，我在“属性”字段中键入 isDeleted，然后选择“删除”单选按钮。按 Enter 按钮后，该属性操作将添加到“条目”列表，如图 8 所示。
图 8 指定待执行的属性操作
图 8 指定待执行的属性操作
然后，我在“属性”字段中输入 distinguishedName，选择“替换”单选按钮，然后在“值”字段中输入该对象的新 DN。在本例中，我使用用户的原始 distuiguishedName，CN=John Smith,CN=Users,DC=foo,DC=local。按 Enter 按钮后，该修改操作将添加到“条目”列表。
因为我必须使用修改操作包括 Return Deleted objects LDAP 控件，所以我必须使用扩展的 LDAP 修改。为此，我选中了“扩展”复选框。设置好所有相关内容后，如图 9 所示，按“运行”按钮以进行更改。LDP 在一个大文本窗口中显示结果。
图 9 更改 distinguishedName
图 9 更改 distinguishedName
当返回 Active Directory 用户和计算机 MMC 管理单元查看 CN=Users 容器时，我将发现曾被删除的用户对象还原到了原处。但是，该对象与原来的对象间存在某些重要的差异，稍后我将进行介绍。

使用 ADRESTORE 恢复逻辑删除
一旦明白了使用 LDP 的方法，恢复逻辑删除就不是很难了，但也不是非常方便。幸运的是，Sysinternals（Microsoft 的附属公司）的优秀员工们开发了一种命令行工具，从而简化了恢复过程。此工具叫做 ADRESTORE，可以从 Microsoft 网站 microsoft.com/technet/ sysinternals/utilities/AdRestore.mspx 获得。安装很简单。只要将可执行文件复制到计算机的相应目录下即可，例如 C:\WINDOWS\SYSTEM32 目录。
ADRESTORE 可以在两种模式下运行。如果您在不带任何参数的情况下运行它，它将列出默认域的 CN=Deleted Objects 容器中的所有逻辑删除。您可以将搜索字符串添加到命令行来选择要显示的对象，例如：
C:\> adrestore John
这样就会显示 CN=Deleted Objects 容器中其 CN 或 OU 属性中包含“John”字符串的所有逻辑删除对象 — 它使用 LDAP 搜索过滤器 cn=*John* 和 ou=*John*。这不是搜索逻辑删除对象最灵活的方式，但它在大多数情况下都可以使用。图 10 显示了在 ADRESTORE 中我的搜索所返回的输出。
图 10 保存在逻辑删除中的属性
图 10 保存在逻辑删除中的属性
如果您希望恢复逻辑删除，而不仅仅是找到它，那么您需要指定 –r 开关和可选字符串，如下所示：
C:\> adrestore –r John
此命令将提示您恢复每一个匹配的逻辑删除对象。ADRESTORE 总是将对象恢复到逻辑删除的 lastKnownParent 属性指定的容器中 — 无法指定其他容器。
ADRESTORE 为使用 Active Directory 恢复功能提供了方便的命令行界面。虽然不是非常灵活，但它确实比 LDP 便于使用。但 ADRESTORE 仍不能避免恢复逻辑删除时遇到的两个重大问题：恢复对象第一次被删除后从对象去除的属性、恢复从配置 NC 中删除的对象。

恢复对象属性
就数据恢复而言，逻辑删除恢复与执行授权还原相比有一个重要优势：逻辑删除恢复不需要使 DC 处于脱机状态。并且恢复逻辑删除要比仅仅重新创建一个新版本的已删除对象要好得多。如果重新创建某个对象，它将获得新的 objectGUID 和 objectSid（如果它是安全主体，如用户）属性。如此一来，对该对象的所有外部引用（如 ACL）都必须更新才能反映新对象的身份。这是很让人头疼的。
删除对象时，某些属性会被去除，并且不能使用逻辑删除恢复来恢复这些属性。但是 Active Directory 在逻辑删除中保存了一些关键属性，其中最重要的是与身份相关的属性，如 objectGUID 和 objectSid。默认情况下，它也保存了其他许多属性（参见图 1）。保存大部分硬编码属性并不很稀奇，尤其是在有关恢复已删除用户对象的讨论中。但通过设置 Active Directory 构架中相应 attributeSchema 对象的 searchFlags 属性的位 3 (0x00000008)，您可以指定要保存在逻辑删除中的其他属性。在 Windows Server 2003 R2 的架构中，已设置了某些属性的此位（如图 1 所示）。
安装特定应用程序可以更改现有 searchFlags 属性的位 3，甚至可添加设置了位 3 的新属性。例如，Exchange Server 可配置要保存在逻辑删除中的几个其他属性。
Active Directory 不会在逻辑删除中保存前向链接属性或后向链接属性，即使您在架构对象的 searchFlags 属性中指定了此操作也会如此。特别是，Active Directory 不会保存组的 member 属性或用户的 memberOf 属性之类的内容。因此逻辑删除恢复不会为恢复 Active Directory 中的组成员资格提供解决方案。有关此方面信息，请参见我的“灾难恢复：Active Directory 用户和组成员”文章，可在 technetmagazine.com/issues/2007/04/ADRecovery 上找到该文章。因此恢复逻辑删除时，您仍需要提供一个备用机制以便恢复此类信息。
如果希望使用逻辑删除恢复作为数据恢复策略的一部分，您需要确保在逻辑删除中保存了重要的属性，或者需要提供其他方法来保存和恢复重要的属性，例如使用 LDIFDE 或其他备份和还原方案。其他选择包括使用可以提供自动机制来备份和恢复逻辑删除中没有保存并且不能通过逻辑删除恢复的属性的第三方 Active Directory 数据恢复产品。

从配置命名上下文恢复对象。
对逻辑删除恢复的另一项重要限制是，一般而言，您不能恢复从配置 NC 删除的对象。如对象的 systemFlags 属性定义的那样，这些对象受与移动和重命名相关的特殊规则限制。除非通过 systemFlags 属性另行指定，否则配置 NC 中的对象不能移动或重命名，这意味着它们的逻辑删除无法恢复。如图 11 中定义的那样，Active Directory 在创建特定类的对象时强制 systemFlags 属性采用特定值。请注意，Active Directory 将对这些值应用按位逻辑 OR 操作以与添加操作中指定的任何 systemFlags 值相结合。这样，即使应用程序为 systemFlags 属性指定了不同的值，也会正确设置所需的位。
Figure 11 默认 systemFlags 设置 (Close Figure 11)

类 | 默认设置
server | FLAG_DISALLOW_MOVE_ON_DELETE FLAG_CONFIG_ALLOW_RENAME FLAG_CONFIG_ALLOW_LIMITED_MOVE
site | FLAG_DISALLOW_MOVE_ON_DELETE
serversContainer | FLAG_DISALLOW_MOVE_ON_DELETE
nTDSDSA | FLAG_DISALLOW_MOVE_ON_DELETE
siteLink | FLAG_CONFIG_ALLOW_RENAME
siteLinkBridge | FLAG_CONFIG_ALLOW_RENAME
nTDSConnection | FLAG_CONFIG_ALLOW_RENAME
正常情况下，来自配置 NC 的唯一可恢复对象是服务器对象。有趣的是，当 Active Directory 删除服务器对象时，逻辑删除不会被移动到配置 NC 的 CN=Deleted Objects 容器；逻辑删除只是保留在对象所在的位置。这样，对于已删除的服务器对象可能阻碍正确复制的特定情况，就可以通过知识一致性检查器 (KCC)（该进程负责计算 Active Directory 复制拓扑）自动从这些情况恢复。因此，如果您发现自己在试图恢复某个服务器对象，请记住您不会在 CN=Deleted Objects 容器中找到该服务器对象。

在恢复计划中恢复
逻辑删除恢复应是数据恢复工具包的一个重要部分。此机制是无需使 DC 脱机就能恢复已删除对象的唯一方法，同样重要的是，它也是恢复已删除对象的身份信息的唯一方法。它巧妙地解决了重新创建已删除的用户或组以及必须修复所有旧 ACL 引用的问题。
但是，逻辑删除恢复是一项不完整的解决方案。您必须为恢复 Active Directory 没有保存在逻辑删除对象中的属性提供您自己的机制，并且您从配置 NC 恢复已删除对象的能力受到限制。请记住，如果确实选择要恢复已删除的用户或组，则您还必须恢复组成员资格和可能需要的其他任何链接属性。

Gil Kirkpatrick是 NetPro 的 CTO，他自 1996 年起便一直参与开发 Active Directory 软件。他与来自 HP 的 Guido Grillenmeier 一起创办了广受欢迎的 Active Directory 灾难恢复学习班。Gil 还是目录专家会议 (www.dec2007.com) 的创始人。


 通信: 使用 Office Communications Server 2007 连接用户
通信 Alan Maddison

使用 Office Communications Server 2007 连接用户
概览:
  • Office Communications Server 体系结构
  • 会议功能
  • 企业语音
  • 增强的状态显示功能

提供统一通信。即将推出的 Office Communications Server 2007 对 Live Communications Server 2005 进行了全面的改进，提供了更出色的体验。除了体系结构和管理方面的改进之外，Office
Communications Server 2007 还包括一个新的客户端 Office Communicator。它还提供了新增功能和增强功能，如企业语音、内部部署 Web 会议、增强的状态显示功能、即时消息以及联合身份验证。将这些功能结合使用能够为 Microsoft® 统一通信策略提供平台，并为提高工作效率和加强远距离协作提供保障。
此更新还包括简化的 Microsoft 管理控制台 (MMC) 管理单元界面。图 1 显示了性能计数器的一个新管理增强功能。
图 1 新的 MMC 管理单元包括性能计数器
图 1 新的 MMC 管理单元包括性能计数器
新的 Office Communications Server 2007 有两种版本：标准版和企业版。Office Communications Server 2007 标准版是进行少于 10,000 位用户的部署时的理想选择。在标准版部署中，单一前端服务器将承载所有服务。
企业版适用于更大型的部署，而且可以在合并或扩展的配置中对其进行部署。在合并的拓扑中，所有硬件都被安排在前端服务器的单个池中。要获得最大的可伸缩性，您可以使用扩展的配置，通过该配置您可以使用运行 Internet 信息服务 (IIS) 的专用 Web 服务器、Web 会议以及前端服务器的企业池外的音频/视频 (A/V) 会议服务器。图 2 显示了扩展的配置拓扑。
图 2 扩展的配置拓扑
图 2 扩展的配置拓扑

体系结构
Office Communications Server 2007 体系结构基于核心服务器构建：前端服务器、边缘服务器和应用程序服务器。前端服务器提供用户身份验证、通讯簿维护、状态显示管理、会议管理、应用程序承载以及服务器与客户端之间的信号处理、媒体管理（包括文件共享）、即时消息 (IM) 路由和会议通信。
Office Communications Server 2007 的核心会议功能通过一系列集成的服务器提供，这些服务器也称为多点控制单元 (MCU)。图 3 提供了这些服务器及其角色的摘要。
Figure 3 会议服务器及其功能 (Close Figure 3)

会议服务器 (MCU) | 受支持的功能
即时消息 | 通过在参与者之间路由 IM 通信启用组 IM。集成到前端服务器，但不能安装在单独的服务器上。
电话服务 | 启用对入站和出站拨号音的支持。集成到前端服务器，但不能安装在单独的服务器上。
Web | 负责协作功能，如白板、应用程序共享和问答。此服务器还提供对 Office 文档共享和 PowerPoint 演示文稿的支持。可以安装在前端服务器上或安装在单独服务器的扩展池配置中。
A/V | 用于多方 IP 音频/视频混合和中继。可以安装在前端服务器上或安装在单独服务器的扩展池配置中。
前端服务器的另一个重要功能是作为通讯簿服务器的主机。熟悉 Live Communications Server 2005 SP1 的用户一定熟悉此服务。在 Office Communications Server 2007 中，它起着重要的作用并且现在已不再是可选组件。通讯簿服务器由两个组件组成：通讯簿服务和通讯簿文件存储。此服务器负责提供来自内部源和外部源的联系人信息。Active Directory® 和 Exchange Server 的全局地址列表和通讯组列表是典型的内部源。外部源包括来自联合合作伙伴的用户或公共 IM 联系人。
Office Communications Server 2007 增强了 Live Communications Server 2005 引入的外部用户连接，使外部用户可以参加内部部署会议。此附加功能需要两个新的边缘服务器：Web 会议边缘服务器和 A/V 边缘服务器。另一个变化是以前的访问代理服务器现在称为访问边缘服务器。Office Communications Server 边缘服务器的设计要求位于外围网络（被筛选的子网），旨在提供关键的外部用户连接。图 4 提供了边缘服务器角色及其功能的摘要。
Figure 4 边缘服务器角色 (Close Figure 4)

服务器 | 受支持的功能
访问边缘服务器 | 联合身份验证；远程用户连接；公共 IM 连接 (PIC)。
Web 会议边缘服务器 | 外部 Web 会议。
A/V 边缘服务器 | 外部用户参与的 A/V 会议和点对点 A/V 呼叫。
反向代理服务器 | 组扩展、通讯簿文件下载、对会议内容进行 Web 会议访问。并非严格意义上的 Office Communications Server 角色，但提供关键功能。ISA Server 2006 还可以提供反向代理功能。
除了先前介绍的集成服务器之外，Office Communications Server 还利用各种应用程序服务器执行重要功能，如身份验证、存储会议元数据以及提供通讯组列表功能。应用程序服务器通常与 Office Communications Server 结合使用，包括 IIS、证书服务器、Active Directory 环境下的全局编录服务器、SQL Server® 2005、Exchange Server 2007 和文件服务器。
IIS 用于访问会议内容、通讯簿更新、IM 的 Active Directory 通讯组扩展、外部用户的 Outlook® 通讯组列表扩展，以及为 Office Communications Server 组件之间的基本通信提供方便。
Office Communications Server 中的证书服务器在保护客户端/服务器通信和服务器/服务器通信的安全方面发挥着至关重要的作用。如果您使用的是内部企业证书服务器，所有内部客户端和服务器都必须信任该证书颁发机构 (CA)。这样一来，必须在每台计算机上的受信任根存储区中安装每个 CA 证书链。如果使用的是 Office Communications Server 联合身份验证服务，则您的合作伙伴组织也必须进行同样的处理。
会议参与者身份验证受 Active Directory 环境下的全局编录服务器支持。对于内部用户和联合用户，全局编录服务器将使用 Kerberos 进行身份验证。受雇于贵公司的远程用户将通过 NTLM 使用其 Active Directory 凭据进行身份验证，而匿名用户将通过摘要式身份验证进行验证。
SQL Server 2005 用于维护有关会议、用户注册和状态显示信息的状态数据。出现故障时，您可以使用存储在 SQL Server 中的数据快速还原会议，从而提供一个快速而可靠的恢复方法，并且不会丢失内容。
Exchange Server 2007 及其统一消息功能包含语音消息和自动助理功能，从而为 Office Communication Server 2007 提供了重要的协助。
文件服务器用于存储客户端需要访问的数据。例如，下载通讯簿时客户端需要的物理文件就存储在文件服务器上。同样，其他会议内容也存储在文件服务器中。
Office Communications Server 2007 的基础协议体系结构是在结合使用标准 Internet 协议和 Microsoft 协议的基础上建立的。例如，会话初始协议 (SIP) 被广泛用于各种功能，如 IM、会议和状态显示订阅。Office Communications Server 的各种组件所使用的协议提供了最强大的功能和灵活性。图 5 提供了核心协议及其用途的摘要。
Figure 5 协议及其用途 (Close Figure 5)

协议 | 受支持的功能
超文本传输协议 (HTTP) | 客户端访问、下载会议内容和通讯簿数据。还用于会议服务器和 Office Communications Server 的 Focus 组件之间的通信。
会话初始协议 (SIP) | 通过 Office Communications Server 的各种组件创建和管理会话，这些组件包括企业语音、IM、会议服务器和增强的状态显示功能。
集中会议控制协议 (CCCP) | 用于构建和控制会议及会议客户端的自定义协议。
持久共享对象模型 (PSOM) | 传输 Web 会议内容时使用的自定义协议，包括安全密钥、用户角色和权限。
实时传输协议 (RTP) | 实时数据传输。在 Office Communications Server 2007 中，它为企业语音和 A/V 会议提供传输机制。
安全实时传输协议 (SRTP) | 安全服务，如 RTP 数据的加密、消息身份验证和完整性。在 Office Communications Server 2007 中，在将音频和视频内容传输到媒体设备（如麦克风和扬声器）时用于确保传输的安全。
实时传输控制协议 (RTCP) | 与 SRTP 结合使用，在媒体设备间传送有关 A/V 会议会话的信号质量的信息。

企业语音
企业语音是 Microsoft 对 IP 电话 (VoIP) 电话服务的实现，它是此产品最重要的唯一一个附加件。在使用会话初始协议 (SIP) 处理信号、使用实时协议 (RTP) 进行语音通信的基础上，企业语音使您可以在 PC 到 PC 之间、PC 与其他任何电话之间拨打和接听电话。此外，企业语音还提供一些功能，如呼叫控制、路由和号码规范化。支持公用电话交换网 (PSTN) 以及与专用交换分机 (PBX) 的互操作性，PBX 支持 SIP、计算机支持的电信应用 (CSTA) 或者直接与 Office Communications Server 2007 API 进行交互。
Office Communications Server 2007 可以在不对现有语音基础结构进行重大更改的情况下进行部署，同时仍能使您获得巨大的好处。同样，企业语音支持三种部署配置：SIP–PBX、SIP–IP–PBX 和 IP-PSTN。
在 SIP–PBX 安装程序中，所有远程呼叫均由 PBX 控制，而且您可以保持现有的通话。此集成可通过远程呼叫控制 (RCC) 网关和 CSTA 来实现。
SIP–IP–PBX 配置利用 IP-PSTN 网关，该网关不需要 CSTA 并且允许 Office Communicator 客户端拨号和控制 IP-PBX 电话。如果没有现成的话筒，您可以将 Office Communicator 配置为“softphone”。
通过 IP-PSTN 组件部署 Office Communications Server 2007 使您可以将呼叫控制路由到前端服务器。Office Communicator 可与 VoIP 或 Microsoft 认证的第三方 SIP 终结点（在许多组织中，此端点通常为话筒）连接，从而通过 Internet 拨打和接听电话。
媒体网关是第三方网关，提供 VoIP 与 PSTN 之间的信号和媒体转换。Office Communications Server 2007 支持三种类型的媒体网关，可分为基本、高级和基本混合三类。为了支持除高级类型之外的网关，Office Communications Server 2007 提供了“中介服务器”角色，用于提供关键协议和媒体转换功能。远程办公集成也可能使用 Office Communications Server 提供的组件。
与 Office Communications Server 2007 的其他组件相同，企业语音也依靠边缘服务器提供外部用户连接。具体地说，访问边缘服务器对于公司的外围用户来说是必需的（由于它在 SIP 信号中的角色），而 A/V 边缘服务器允许外部用户通过外围网络服务（如防火墙和网络地址传输 (NAT) 实现）连接访问语音和视频服务。
尽管企业语音基本上支持大量的客户端，但是目前为企业语音推荐的客户端是最新版本的 Office Communicator。此外，Microsoft 及其合作伙伴已公布了为新 VoIP 电话硬件制定的计划，VoIP 电话硬件将与 Office Communications Server 集成。
企业语音还与 Exchange Server 2007 的“统一消息”角色集成，为可从使用 Outlook Voice Access 的电话或计算机访问的语音邮件、电子邮件、日历、联系人和传真的收件人提供单一接口。此外，统一消息还提供自动助理服务，该服务使您可以实现自动的电话菜单系统。

增强的状态显示功能
在 Live Communications Server 2005 中您可能熟知状态显示的概念，但此概念在 Office Communications Server 2007 中已进行了扩展和增强。一般来讲，状态显示与用户的状态和可用性相关联。在 Office Communications Server 中，支持基础结构通过改进与状态显示相关的信息的配置粒度创建了更加丰富的体验。
现在，用户可以从六种不同的状态模式中进行选择：可以将状态设置为“联机”、“忙碌”、“请勿打扰”、“马上回来”、“离开”或“显示为脱机”。用户还能够使用其他信息自定义此状态。例如，如果将用户的状态设置为“请勿打扰”，该用户可以提供附加信息说明不能被打扰的原因。
增强的状态显示功能还可以使用户通过五个可选的状态显示级别筛选向其他用户显示的信息：这些状态显示级别为“个人”、“团队”、“工作区”、“公用”和“块”。这些级别提供了分层状态显示管理的方法。例如，“个人”显示级别即使在用户状态设置为“忙碌”时，也允许用户通过 IM 执行联系之类的操作，从而提供了最强大的灵活性。状态显示级别还控制向联系人显示的信息量。
此外，使用 Office Communicator 时，用户可以设置其位置状态，可以是自定义位置或者默认选项（家庭或办公室）之一。位置信息适用于按“个人”或“团队”分类的联系人。
尽管状态显示的各项增强功能很受欢迎，并会证明它们自身在简化通信方面的作用，但对组织产生巨大影响的却是 Office Communications Server 的基本基础结构和状态显示引擎。例如，Office Communications Server 2007 附带了成员 Web 部件，它是一项 Office SharePoint Server 2007 Web 部件，使用户可以查看与 SharePoint 网站或门户相关联的其他用户的显示信息。此 Web 部件可以轻松地添加到您的 SharePoint 站点，使得在关键协作基础结构间传递显示信息更加便利。
通过使用文档工作区和智能标记操作按钮可将状态显示信息集成到整个 Microsoft® Office 2007 应用程序套件中。例如，智能标记操作按钮可以显示用户的状态、联系人和日历信息。用户可以利用智能标记操作共享工作、安排会议或启动 IM 会话。

内部部署会议
Office Communications Server 2007 中的另一个重要改进是内部部署会议功能。对许多组织而言，能够举行内部或外部用户（匿名或联合）参加的实时会议应该都是很有用的。这些会议可以是有计划的或即席的会议，可以包括 IM 会议、A/V 会议和 Web 会议，以及其他协作工具，如文件共享、白板、幻灯片注释、参与者轮询和参与者问答会话。Office Communications Server 还支持从一种会议类型到另一种会议类型的转换。例如，用户可以选择将协作添加到现有的 IM 会话并创建一个即席会议。
尽管 Office Communicator 是推荐的会议客户端，但 Office Communications Server 2007 还支持 Office Live Meeting 2007 和 Office Live Meeting Add-In for Outlook 2007。Office Communicator 2007 支持 IM、A/V 会话参与、应用程序共享、白板和文件传输。Office Live Meeting 2007 包括会议参与支持，以及安排会话、记录会话、参与者轮询和问答。
Office Live Meeting 2007 Add-In for Outlook 2007 包括对使用 Outlook 2007 的会议任务的支持，还支持将各个参与者指定为与会者或演示者并向不同的角色发送单独的邀请。用户除了担任“组织者”、“演示者”或“与会者”角色外，还可以根据其位置和凭据归类为属于内部还是外部用户组。内部用户拥有 Active Directory 登录权限，位于企业局域网上。外部用户细分为三个类别：远程、联合和匿名。
远程用户是指组织中拥有 Active Directory 帐户的任何人。可以包括远程工作人员或合同工。所有远程用户都可以举办、参加和出席会议。
联合用户拥有通过在 Office Communications Server 中构建联合身份验证而定义的凭据。联合用户可以参加会议并担任演示者，但是不能组织会议。
匿名用户是最受限制的组；这些用户只有在被邀请时才能参加会议。
要为任何给定的会议提供其他安全层，可以指定不同类型的输入控制设置。Office Communications Server 2007 提供以下选项：开放式身份验证、封闭式身份验证和匿名。
开放式身份验证会议允许任何远程用户或内部用户使用 Active Directory 登录以参加会议。任何联合用户也都可以参加。封闭式身份验证会议仅对会议组织者邀请的那些用户开放。联合用户不能参加该会议。
匿名会议对收到邀请的所有人开放。要参加会议，用户必须出示会议密钥并通过摘要式身份验证以验证其凭据。加入会议后，在被提升为演示者之前，匿名用户只能是与会者。图 6 中显示了一些可用设置。
图 6 会议设置
图 6 会议设置

拨入
通过简化通信、集成各种通信媒体并将控制权交到用户手中，Office Communications Server 2007 有可能改进贵公司的工作方式。上下文通信的概念将是此改革的基础，在此概念中，状态显示信息和通信的方式都嵌入到应用程序内部。如果您的实验室中不存在 Office Communications Server 2007，请在实验室中试用它。
有关 Office Communications Server 2007 的详细信息和试用测试版，请参阅 technet.microsoft.com/en-us/office/bb267356.aspx 上的 TechNet Office System TechCenter。另外，一定要访问统一通信组团队博客 blogs.technet.com/uc。

Alan Maddison是 MTI Technology Corporation 的一名高级顾问。他重点研究 Active Directory、Exchange Server 和虚拟化。


 编辑视角: 学习途径
编辑视角
学习途径
Joshua Trupin

只要 我们一直在创办杂志，我们就能创办出以类似“重返校园”为主题的九月期刊。当然，我们发现这个时间段并不总是准确。例如，美国的大多数学校都是八月底返校。有些人则似乎没有假期。
不过，对于我们大多数人来说，九月已近在咫尺。《TechNet 杂志》是一所授予“IT 专业人员”学位的高等培训机构。是的，我们刚刚将其建好。但是您在我们杂志上看到的培训还没有准备好。本月我们已经制定了一套完整的指导性课程提纲。
像所有承办高等培训的优秀组织机构一样，我们提供一系列的培训经验，不仅包括适用于脚本爱好者的 SQL 介绍性课程（“您好，脚本专家！”），还包括 Active Directory 管理工具的调查等。
我们的中级学习内容包括跟踪您对 Windows Vista 的掌握程度。首先您会学到如何使用 Business Desktop Deployment (BDD 2007) 部署 Windows。您在企业中部署 Windows Vista 之后，我们会指导您如何实现系统的常规备份，同时介绍一些当今的关键技术。
现在您的 IT 专业人员文凭唾手可得，您还可以利用我们 Active Directory 研究中的高级课程论文。如果您想了解逻辑删除恢复 (Tombstone Reanimation) 但又不想等到我们特定的 Halloween 课程开始，您这个月就可以开始此学习。
当然，《TechNet 杂志》只是一种学习途径。Microsoft TechNet 网站为您提供了更多的远程学习课程。TechNet 为 IT 专业人员提供了大量关于核心技术的网络广播，其中包括 Microsoft IT 如何内部使用技术的演示。网络广播产品根据受众类型（IT 专业人员、高级主管等）和技术进行分类，而且根据难度级别划分为不同的等级，就像真正的大学编录。
给您举一个例子，本月《TechNet 杂志》提供了几篇关于 Active Directory 的深入介绍文章。然而，您距离真正能够充分使用它们可能只有一步之遥。您只需转到 TechNet 网络广播，观看级别 200 的名为“Active Directory 基础知识”的演示文稿 (msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032295120)。
如今的培训机会有多种形式。从杂志到 Internet，我们在这里通过各种方式为您提供需要的信息。在阅读过我们的一些文章后，何不抽空访问一下《TechNet 杂志》博客 (blogs.technet.com/tnmag)，就像课后喝咖啡聊天一样？
—Joshua Trupin

向以下 Microsoft 技术专家致以衷心的感谢：Paul Bowden、Justin Hall、Anand Lakshminarayanan、Eduardo Laureano、Mike Lewis、Tim Mintner、Michael Murgolo、Mark Russinovich 和 Jim Truher。


 读者来信: 有问必答
读者来信
有问必答

PsTools
在 2007 年 3 月一期的“桌面文件”专栏中，Wes Miller 谈论了 PsTools 实用工具（“PsTools 入门”，请参阅 technetmagazine.com/issues/2007/03/DesktopFiles）。我在尝试运行这些卓越的实用工具时遇到了一些麻烦。我对 PsLoggedOn 尤其感兴趣。您能详细解释一下如何将这些强大的实用工具放进我的路径上的文件夹中吗？最好提供示例，这会有很大帮助。
—Tim

最佳途径是首先将完整的 PsTools 程序包下载 (download.sysinternals.com/Files/PsTools.zip) 到工作目录（例如，c:\toolbox）。只要您将 ZIP 文件解压缩到该目录，这些工具即可使用。如果您希望将该目录添加到您的路径以便从任何地方都可以执行该工具，则只需从命令提示符下运行以下命令，使用您的工作目录替换 c:\toolbox 即可：
SET PATH=%PATH%;c:\toolbox

Robocopy 的赞誉
在阅读 2006 年 11 月关于 Robocopy GUI 的文章 (technetmagazine.com/issues/2006/11/UtilitySpotlight) 之前，我们的技术支持遇到了一个难题，无法保留从网络文件夹移动到 SharePoint® 存储区中的文件的时间戳。Robocopy 是一个伟大的工具！
—Cristino

检查注册表子项
在过去的几周内，我一直在尝试确定如何测试 EnableLUA 注册表子项是打开还是关闭的。该注册表子项处于关闭状态时，用户帐户控制被禁用。这正是我们需要的，这样我们可以将程序自动安装到测试实验室，而无需使用管理员帐户登录进行确认。我们要将此测试放到所有安装脚本的开端，然后运行某个脚本，该脚本在运行之前将 EnableLUA 值从 1（打开）改为 0（关闭）。不过，对于如何进行此项测试工作，我一直找不到合适的方法。我对您能提供的任何帮助表示由衷的感谢。
—Derek

以下是一个可读取注册表项、检查值和更改值（如有必要）的基本脚本。此示例读取注册表项 HKLM\Software\Microsoft\Test\TestKey，检查值是否为 1，如果是，将其更改为 0；如果不是 1，该脚本退出：
On Error Resume Next
Set WSHShell =  Wscript.CreateObject _
    ("Wscript.Shell")
RegLoc = _
    "HKLM\Software\Microsoft\Test\TestKey"
KeyValue = WSHShell.RegRead(RegLoc)
If (KeyValue = "1") then
  WSHShell.RegWrite RegLoc,"0"
end If
Wscript.Quit
通常，应确保谨慎使用修改注册表的脚本，尤其是在类似的情况下。

ReadyBoost
您能详细解释一下 ReadyBoost 吗？在我的理解中，ReadyBoost 的作用就像计算机的 RAM 和硬盘驱动器之间的缓冲区，但同时会写入数据。这是不是意味着性能会因系统两次复制数据而降低？我如何测试含和不含 ReadyBoost 的系统的性能？
—Alex

ReadyBoost 旨在允许闪存（USB 记忆棒等）作为临时缓存，从而扩充（通常更昂贵的）传统 RAM 的大小。ReadyBoost 不一定向闪存和硬盘同时写入相同的数据。实际上，它充当 RAM 和磁盘之间的中间缓存层。Mark Russinovich 在 2007 年 3 月的文章“了解 Windows Vista 内核：第 2 部分”中对此进行了更详细的阐述，他说：
“在 ReadyBoost 服务对缓存进行初始化之后，Ecache.sys 设备驱动程序会截获所有对本地硬盘卷（例如 C:\）的读写，并将要写入的所有数据复制到该服务创建的缓存文件中......
...当 ReadyBoost 确定可从缓存满足随机读取需求时，它便会从那里向随机读取提供服务，但由于硬盘的有序读取访问要胜过闪存，因此，它允许有序访问模式中的读数据直接移至磁盘，即使该数据位于缓存中。”
您可以在 technetmagazine.com/issues/2007/03/VistaKernel 在线阅读 Mark 文章的其余部分。

Windows PE 下载
在 2007 年 5 月一期的“读者来信”专栏中似乎有一些不一致。第一个问题“制作映像”中说，“您可以使用在 WAIK 中提供的工具构建和自定义 Windows® PE 2.0 映像......”这表示 Windows PE 包括在工具中并且是可下载的。
但是，在最后一个问题“获取 Windows PE”中，您回答说“Windows PE（仅）可作为软件保证权益获得......”我认为您的第一个答案是正确的，第二个答案已经过时了。
—Xihui

Windows PE 2.0 可通过下载 Windows 自动安装工具包 (WAIK) 获得。它的授权规则与 Windows PE 1.6（上一个版本，在去年的“Windows PE 入门”中讨论过。您可以在 technetmagazine.com/issues/2006/09/WindowsPE 阅读该文章）不同。Windows PE 1.6 仅作为软件保证的一部分提供。

Windows PowerShell 安全
关于 Windows PowerShell™ 的谈论已经很多了。我看到许多文章都在称赞其类似于 UNIX 的语法以及设置命令输出格式的简便性等，但是我很少听到有关将 Windows PowerShell 部署到数据中心时的安全问题这方面的内容。
在生产服务器上部署或运行像 Windows PowerShell 如此强大的命令行程序时，会产生什么样的安全问题？
—Carlos

我们完全同意有关 Windows PowerShell 的安全性是一个重要主题。事实上，我们的 Windows PowerShell 专栏作家 Don Jones 在本期的《TechNet 杂志》中深入研究了该主题。除此以外，您可能希望阅读最近出版的两本重要书籍：Bruce Payette 编写的“Windows PowerShell in Action”(Manning Publications, 2007) 以及 Don Jones 和 Jeffrey Hicks 合著的“Windows PowerShell:TFM”(SAPIEN Press, 2007)。这两本书深入讨论了 Windows PowerShell，并且都有完整的章节介绍安全性。

SQL 最佳实践
我非常不同意您对最佳实践分析工具 (BPA) 和架构限定对象的建议（请参阅 technetmagazine.com/issues/2007/05/SQLQA）。SQL Server™ 2005 必须仍能解析架构（相对于 SQL Server 2000 中的唯一所有者，作者错误地将其称为“架构”）。SQL Server 2005 的解析顺序在联机丛书 (BOL) 中有完整的说明。
因此，限定对象仍是避免模糊错误和减少解析对象名称时产生的优化器 CPU 周期的最佳做法。专栏中的建议与 Microsoft 白皮书“SQL Server 2005 中的批处理编译、重新编译和计划缓存问题”似乎背道而驰。
—Mike

我们请教了回答问题的专家 David Browne，他是 SQL 问题与解答专栏的撰稿人，德克萨斯州达拉斯市的 Microsoft Technology Center 的技术架构师。他回答说：
最佳实践可能会引起人们的争议。尤其是在性能方面，人们对于什么会造成显著的性能差异和什么可能是有价值的优化持有不同的看法。
例如，我一直不赞成通过以某种方式编写查询来缩短编译过程中的优化器 CPU 周期，并且我怀疑它会对实际工作负荷产生重大影响。
另一方面，通过改进查询计划重用减少编译的频率是普遍接受的性能优化方式。

WinPE
我们使用 Systems Management Server (SMS) 操作系统部署功能包 (OSDFP) 进行操作系统安装。既然 Windows Vista® 已经发布，我们希望通过 OSDFP 来安装它，而且我们已经升级到最新版本。最新的 OSDFP 中附带哪个版本的 Windows PE？
我们过去创建映像安装 .iso 文件，并通过远程安装服务 (RIS) 对其进行复制。然后，使用网络引导选项来引导新的计算机。但是，我们已经将 RIS 升级到了 Windows 部署服务 (WDS)，后者仅支持 Windows 映像 (WIM) 文件作为引导映像。我们如何才能通过 OSD 的安装选项创建 WIM 映像？
—Vasishta

Windows PE 版本并没有随着 OSDFP 的最新版本而更新，OSDFP 仍包含版本 1.5（也称为 Windows PE 2004）。即使 Windows PE 未更新，现在最新版本的 OSDFP 也完全支持 Windows Vista 部署。
创建可部署桌面映像使用的最佳过程是 BDD（商用台式机部署）解决方案加速器中介绍的过程。您可以在 microsoft.com/technet/desktopdeployment/bdd/2007 上在线找到所有必要的组件和文档。也可以查看本期《TechNet 杂志》中 Michael Niehaus 撰写的文章“使用 BDD 2007 部署 Windows Vista”。

Windows 2003 Server 海报
我刚收到 2007 年 7 月的《TechNet 杂志》，很高兴发现了两份 Windows Server® 2008 海报！我的一位同事在上一期中收到一份 Windows 2003 Server 海报。您知道我怎样才能获得 Windows 2003 Server 的海报吗？印刷版本或 PDF 版本均可。
—Jason

我们非常高兴您能喜欢 Windows Server 2008 海报！Windows Server 2003 海报的 PDF 版本在 go.microsoft.com/fwlink/?LinkID=80428 上在线提供。我们仅制作了一种版本的 Windows Server 2003 海报。


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

移动 SQL Server 数据库
xSQL Bundle Professional Edition
www.xsqlsoftware.com
如果您致力于运行支持、应用程序开发、质量保证测试或配置管理，也没有关系。如果您是一位 IT 专业人员（因为您在阅读《TechNet 杂志》，所以我这样猜想），您可能需要经常移动 SQL Server™ 数据库。移动数据和数据架构时，必须注意不一致性。为了帮助您避免这种不一致性，您需要用一个优秀工具集来执行架构及数据的比较和同步。
我最近使用的工具是 xSQL Software 中的 xSQL Bundle。此捆绑由以下四个不同的应用程序组成：xSQL Object、xSQL Data Compare 及其关联的命令行实用程序。
xSQL Object 用于比较和同步数据库架构。它为您要在数据库间进行比较的对象的类型和实例提供了很多比较选项。此应用程序还允许您创建架构快照，以便维护版本历史记录。通过此功能，您还可以轻松回滚到原来的架构状态。您甚至可以用 xSQL Object 生成架构脚本，
以便传输或打包数据库架构。
xSQL Data Compare 可以对包含在两个 SQL Server 数据库中的数据进行等同和同步操作。它可以让您选择比较两个数据库的全部内容还是比较一组表。如果您的表不能完全匹配，您可以定义一个自定义表映射以确保这些表中的数据是相同的。对大量数据进行同步时，应用程序会切换到批量插入模式，从而在同步过程中节省时间。
xSQL Data Compare 和 xSQL Object 都可以保存您的工作区，所以您不必不断重新创建比较环境。这两个应用程序的同步都是事务性的，从而可以确保所有操作作为一个整体成功提交或回滚。捆绑中的所有应用程序还都支持 SQL Server 2000 和 SQL Server 2005 数据库实例，您可以比较和同步各版本间的相关数据和对象。
或许 xSQL Bundle 更强大的功能之一就是两个命令行实用程序，实际上，使用这两个实用程序，您可以通过拥有的任何版本、过程、监视或自动的任务计划程序运行比较和同步任务。（在我的书中，冗余任务的自动化始终使工作生涯更轻松、更有效率。）这些命令行实用程序使用一个 XML 配置文件，您可以通过配置向导从主应用程序 UI 中创建该配置文件；每个实用程序拥有很多文本文件日志记录选项，以便您跟踪在自动执行过程中发生的操作。

价格：xSQL Bundle Professional Edition 的单用户许可证起步价为 499 美元。
xSQL Data Compare 可以同步两个 SQL Server 数据库中的数据。
xSQL Data Compare 可以同步两个 SQL Server 数据库中的数据。

实现更安全的通信
WinSSHD
www.bitvise.com
如果您正在寻找提高组织安全的方法，可以考虑 Secure Shell Handling 2 (SSH2) 和 Secure FTP (SFTP)。简而言之，SSH2 隧道使您可以安全地连接到远程计算机上的服务器。它还可以减少防火墙上打开的可用侦听端口和直接到应用程序端口的数量，从而有助于限制潜在黑客的攻击。SFTP 可作为标准 FTP 服务器的备用服务器，它使用 SSH2 来保护数据和命令。
如果您对这些协议感兴趣，一定要看一看 Bitvise 公司的 WinSSHD。WinSSHD 是专为 Windows 设计的一个 SSH2 服务器。
安装相当简单。该应用程序为管理 WinSSHD 服务提供了一个直观的控制面板。在控制面板中，您可以找到各种功能，包括基本的开启/关闭功能和 Windows® 事件日志（在这里您可以对 WinSSHD 事件进行过滤）。还可以从这里启动设置面板，以便配置安装的基本细节。您可以设置界面和端口绑定、调整日志记录配置、指定要启用的 SSH 会话加密方法、配置会话超时、选择身份验证方法、指定代理配置和控制对实例有访问权限的人。您也可以导入和导出配置。
访问控制设置使您可以通过 IP 规则（屏蔽对子网控制的支持）和 DNS 名称规则（在 IP 规则之后处理）限制访问。
WinSSHD 支持虚拟化，对 SFTP 的实现非常有利。这就意味着您可以对一个 Windows 帐户指定数千个虚拟用户，简化了帐户和安全的具体细节。该应用程序也支持使用 Windows 组来进行身份验证和访问控制，所以您不必分别对每个用户定义一种策略。
由于支持 Kerberos 5 和 NTLM 身份验证，WinSSHD 可集成到单一的登录环境中。完成此任务需要启用 GSSAPI 的 SSH 客户端，如 Tunnelier，它是一款优秀的附带产品，也可从 Bitvise 得到。正如您所料，Tunnelier 与 WinSSHD 服务器完全兼容。它也可用来对您的 WinSSHD 服务器进行远程配置。
如果 SFTP 或 SSH2 服务器环境对您来说非常关键，您可以将 WinSSHD 加入群集以获得高可用性。这是一项非常简单的任务。但是，如果您发现需要一些帮助，请参考公司的网站，其中提供了关于设置群集、端口转发、隧道远程桌面等的信息及配置指南。

价格：99.95 美元。
WinSSHD 让您指定 SSH 会话加密方法
WinSSHD 让您指定 SSH 会话加密方法

监视 USB 活动
USB Monitor Professional
www.hhdsoftware.com
这是适用于所有类型的用户的产品。或许您是一位 DIY 软件爱好者，希望为自己的 USB 设备创建和修改驱动程序。或者您是一位实际创建 USB 设备的硬件工程师。或者您只是对某些 USB 设备上的活动感到好奇，想知道究竟是什么导致了如此多的活动。对于上述任何一种情形，HHD Software 提供的 USB Monitor Professional 都可以帮助您解决问题。使用此实用程序，您可以记录、显示和分析通过 USB 主控制器在 USB 设备和基于 Windows 的系统之间传输的数据。
用户界面稍显复杂，但是一旦习惯了它，您就可以收集到关于从被监视的 USB 设备传入和传出的数据的大量信息。默认情况下，该应用程序会记录传送到 USB 设备的大部分命令和命令集。对于某些设备，特别是大容量存储设备，记录的信息会非常冗长。幸运的是，您可以为大容量存储设备自定义应用程序要记录的数据。
一旦记录了一段会话，您就可以用很多方法对数据进行分析。对于大容量存储设备，您会得到“大容量存储设备视图”。此外，它还提供了针对各种项目的选项，这些项目包括统计和设备吞吐量的线性图形、原始数据包和控制请求视图、数据包解码视图、特定于 HID 的视图和静止图像视图（用于解码适用设备的 USB 静止图像协议）。
由于应用程序记录的数据量有限，您并不想使 USB 记录会话运行太长的时间。同样，您可以限制用于记录会话的最大磁盘空间量并压缩记录的数据以减少所需的空间。

价格：常规许可证起步价为 175.99 美元。
USB Monitor Professional 记录传送给 USB 设备的命令。
USB Monitor Professional 记录传送给 USB 设备的命令。

管理虚拟媒体
Virtual CloneDrive
www.elby.ch/fun/software
处理物理媒体真的是一件麻烦事。因为切换到 Windows Vista 并丧失了与 Microsoft 虚拟 CD-ROM 控制面板的直接兼容性，我一直在寻找装入 CD 和 DVD 图像的替代品。（顺便说一下，感兴趣者可以在 go.microsoft.com/fwlink/?LinkId=94801 上找到适用于 Microsoft® Windows XP 的虚拟 CD-ROM 控制面板。）
当然，您可以在 Windows Vista 中运行虚拟 CD-ROM 控制面板。问题是您必须始终以管理员身份运行并且只能在管理员上下文中（而不是在您的用户的 Windows 资源管理器上下文中）看到装载的驱动器，这就意味着需要通过“以管理员身份运行”命令提示符。结果，不仅工具无法按照我需要的方式运行，而且还要求我在安全性较低的环境下运行应用程序。
我发现确实能在 Windows Vista 用户上下文中运行的一种工具
是 Virtual CloneDrive（Elaborate
Bytes 的一款产品）。此应用程序将其自身安装为 GUI 管理应用程序和存储控制器，
您可以从设备管理器中看到它。安装后，该应用程序有三个基本设置。首先，
您可以指定要使用的虚拟驱动器的数量，最多同时运行 8 个驱动器。其次（也是我喜欢的选项），就是您可以设置 Virtual Sheep 设置，以图标“愤怒的羊”替换标准 CD/DVD 驱动器图标，这样您就知道系统中哪些是 ISO 驱动器，哪些是真正的物理驱动器。最后，您可以选择在启动时自动装载指定给该驱动器的最后一个映像。
除了 ISO 文件，Virtual CloneDrive 还可以装载和读取 .ccd、.dvd、.img、.udf 和 .bin 文件。此外，它还集成到 Windows 资源管理器，使您可以快速访问正在装载和卸载的映像。Virtual CloneDrive 最大的优点之一就是它是免费的。如果您已经迁移到 Windows Vista®，而且一直在寻找管理 ISO 文件的新解决方案，一定要试验一下此工具。

价格：免费。
Virtual CloneDrive 的“愤怒的羊”图标
Virtual CloneDrive 的“愤怒的羊”图标

书评
SharePoint Products and Technologies Administrator's Pocket Consultant
microsoft.com/MSPress/books/10623.aspx
如今的办公室也许不是无纸办公，但是一定会处理越来越多的电子文档。管理和共享这些文档越来越受到人们的关注，许多公司正在考虑采用 Microsoft SharePoint® 服务和 SharePoint Server 作为解决方案。Ben Curry 著作的“Microsoft SharePoint Products and Technologies Administrator's Pocket Consultant”（Microsoft SharePoint 产品和技术管理员的随身顾问）会有所帮助。不论您是正在考虑 SharePoint，还是远处于计划阶段，或者已经拥有了 SharePoint 基础结构，这一管理功能和日常任务参考都是很好的助手。
熟悉“管理员随身顾问”系列的人对此指南会感到非常熟悉。就其内容的深度与结构而言，它与其他指南基本相同。此书涉及 Windows SharePoint Services 3.0、SharePoint Server 2007 Standard 和 SharePoint Server 2007 Enterprise Edition，分为四部分。
第一部分为“SharePoint 产品和技术基础”，对 SharePoint 产品的组件、版本、要求和安装进行了概述。此部分介绍了 Windows SharePoint Services 3.0 与 SharePoint Server 的 Standard 和 Enterprise 版本之间的区别。然后，此部分指导您完成所有三个产品的安装。它还详细说明了在安装过程中如何创建 SQL Server 数据库和 IIS 网站。
第二部分为“SharePoint 核心管理”，包括核心管理用户界面并提供了如何创建新的网站集和网站、如何导入、使用和编辑 Web 部件以及如何为安装配置组和电子邮件设置的参考信息。这里还介绍了如何管理不同的工作流功能和监控这些工作流。
本书的第三部分是“使用 SharePoint Server 2007”，深入探讨了特定于 SharePoint Server Standard 和 Enterprise 版本的特性和功能。它包括如何配置企业内容管理、如何创建和配置 SharePoint 门户、如何建立搜索和索引以及如何配置 Excel® Calculation Services 等主题。“Excel Calculation Services”部分还提供了关于如何在多服务器环境下配置服务以提高性能和可用性的指南。
第四部分详细介绍了 SharePoint Server 实现的各个运行方面，向您展示如何将 SharePoint Server 2007 扩展到服务器场以及此实现的各种不同配置。最后，此书向您介绍备份和还原操作的基础知识、如何分析性能以及如何使用 SharePoint Server 的日志记录功能来帮助维护和改进您的网站。
虽然本书旨在作为管理员的日常参考，但是那些处于规划阶段和对 SharePoint 感兴趣人员也会发现本书有助于迅速、更好地理解 SharePoint。本书首先进行非常基础性的讨论，详细介绍了不同的 SharePoint 技术和它们的作用，然后进一步讲述较为复杂的主题，如配置 Excel Calculation Services 和扩展到服务器场，这样的结构可确保它不仅可供刚开始了解 SharePoint 技术的人员参考，而且随着这些人员知识的增长，它仍是一份有用的参考资料。

价格：29.99 美元。

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


 SQL 问题与解答: CPU 瓶颈、还原和移动数据库，及其他信息
SQL 问题与解答
CPU 瓶颈、还原和移动数据库，及其他信息
编辑：Nancy Michell

问：我的 SQL Server™ CPU 使用率峰值突然过高 — 但之前并未做过任何更改。没有添加新用户，没有卸除硬件，也没有创建新表。这是怎么了？

提示：在创建索引期间进行访问
有时，您要对大型表创建索引（这可能会花费大量时间），但又希望数据在此过程中可用。怎样才能同时达到这两个目标呢？
每次创建、拖动或重建聚集索引时，SQL Server 都会将架构修改 (SCH-M) 锁置于表中，用于阻止所有用户在操作期间访问基础数据。这是对表创建聚集索引的情形。相反，当您对列创建非聚集索引时，SQL Server 会将共享 (S) 锁置于表中，虽然这也会阻止对基础表的数据更新，但至少允许您执行 SELECT 语句进而读取该数据。
如果创建聚集索引的过程中允许对该表进行读取至关重要，您可以对表创建一个索引并使其成为联机操作。该命令如下所示：
CREATE UNIQUE CLUSTERED INDEX CLUST_IDX_SQLTIPS
ON SQLTips (tip) with (ONLINE=ON) Go;
对表使用联机索引操作时，SQL Server 仍会将用于聚集索引的 SCH-M 锁或用于非聚集索引的共享 (S) 锁置于基础表中，但只适用于在索引操作从开始到结束这一段很短的时间。因此，此选项为在索引创建过程中查询和更新底层表提供了更好的访问方式。但要注意，联机索引创建/操作仅适用于 SQL Server 2005 Enterprise Edition。

答：在未对服务器进行任何更改或未增加任何负载的情况下，如果 CPU 瓶颈突然意外出现，其根本原因有很多，但有以下几种常见原因：查询计划不理想、SQL Server 配置差、应用程序/数据库设计不当和硬件资源不足。
出现此类情形时，首要任务是确定服务器是否为 CPU 受限的，如果是，请确定本地 SQL Server 系统上 CPU 占用率最大的是哪些语句。您可以使用性能监视器通过查看 PROCESSOR:% PROCESSOR TIME 计数器来确定服务器是否为 CPU 受限的。如果您发现每个 CPU 所用的时间值等于或大于 75%，就表示出现了 CPU 瓶颈。
您还应通过查询系统动态管理视图 (DMV)（称为 SYS.DM_OS_SCHEDULERS）监视 SQL Server 计划程序，以查看可运行任务的值。非零值表示任务必须等待到进入自己的相应时间段才能运行；此计数器的数值很高也是出现 CPU 瓶颈的表现。
您可以使用以下查询列出所有计划程序并查看可运行任务的数量：
SELECT
 Scheduler_ID,
 Current_Tasks_Count,
 Runnable_Tasks_Count
FROM
 SYS.DM_OS_SCHEDULERS
WHERE
 Scheduler_ID < 255
要获取占用 CPU 最多的前 50 个 SQL 语句，请使用图 1 中的查询。
Figure 1 前 50 个 CPU 占用 (Close Figure 1)
SELECT TOP 50 (a.total_worker_time/a.execution_count) AS [Avg_CPU_Time],
 Convert(Varchar,Last_Execution_Time) AS 'Last_execution_Time',
 Total_Physical_Reads,
 SUBSTRING(b.text,a.statement_start_offset/2,
 (case when a.statement_end_offset = -1 then len(convert(nvarchar(max), b.text)) * 2
 else
 a.statement_end_offset end - a.statement_start_offset)/2) AS Query_Text,
 dbname=Upper(db_name(b.dbid)),
 b.objectid AS 'Object_ID'
 FROM sys.dm_exec_query_stats a
 CROSS APPLY
 sys.dm_exec_sql_text(a.sql_handle) AS b
 ORDER BY
 [Avg_CPU_Time] DESC

问：我必须从磁带恢复 SQL Server 2005 数据库。还原后，用户失去了对数据库的大部分权限。您是否能告诉我在还原过程中哪些操作不正确？数据完好，但是权限很乱。

答：您很有可能没有及时地将 master 数据库还原到同一点，使用户数据库中的登录 ID 与当前的 master 数据库不匹配。您需要对它们进行同步。侧栏“移动数据库时从哪里获得帮助”列出了最有用的资源，可以彻底解决您在还原或移动数据库时遇到的问题。

问：我开发了一个使用存储过程的应用程序，该存储过程使用 SQL Server 2005 SP1 中的 OpenXML 将 XML 数据分割到关系表中。XML 文档最大为 5KB（平均是 2.5KB）。存储过程被多次并行调用（最多 50 次）。
我正面临着严重的锁争用问题，我认为可能是 OpenXML 的原因。您有什么看法吗？

答：尽管 OpenXML 在单线程上分割或转换数据可能比使用 nodes 方法快，但 nodes 方法通常具有较好的适应性，在并行使用时尤为明显。不过，如果您打算完全使用 OpenXML，则应按照以下指导来改进 OpenXML 的总体性能。
不要使用相同的行模式调用 5 次 OpenXML（像您提到的在解决方案中执行的操作一样），而应将使用相同行模式的所有数据提取到一个临时表，然后从临时表中执行您的选择。尽早尝试使用 sp_xml_removedocument 释放内存。另外，只要有可能，就尽量避免使用 * 和 // 等通配符；提供确切的途径可以更好地执行查询。

问：DBCC SHRINKFILE 在我的服务器上运行得相当缓慢。我能在多处理器计算机上获得更好的性能吗？我该如何改善这种状况？

答：DBCC SHRINKFILE 是单线程操作，这表示它不会使用多个 CPU。它将页面从文件后端移到文件前端，每次移动一个页面。该操作通常称为缩减，并不执行碎片整理；事实上，在大多数情况下，缩减还会增加逻辑碎片。
一些改进缩减性能的方法包括将页面移动到聚集索引中。如果您拥有堆，并且这些堆具有很多非聚集索引，则会显著降低速度（与聚集索引情形相比）。
还要注意，移动大型对象 blob (LOB) 数据的页面时速度很慢，这是由于必须要读取行内数据以查找 LOB 数据的根。
如果索引/表的绝大部分内容位于文件末尾，您可以重建索引将其移动到文件前端。重建索引会用到多个 CPU，并可在 bulk_logged 模式中使用较少的日志空间。这样，当您运行缩减时，运行速度将更快。
有关缩减操作的详细信息，请从 blogs.msdn.com/sqlserverstorageengine/archive/2007/03/29/how-does-your-schema-affect-your-shrink-run-time.aspx 和 blogs.msdn.com/sql-serverstorageengine/archive/2007/04/15/how-to-avoid-using-shrink-in-sql-server-2005.aspx 处的条目开始。
移动数据库时从哪里获得帮助
  • 如何在运行 SQL Server 的计算机之间移动数据库
  • 如何通过使用 SQL Server 中的 Detach 和 Attach 函数将 SQL Server 数据库移到新位置
  • INF：协同使用 WITH MOVE 选项与 RESTORE 语句
  • 如何解决在运行 SQL Server 的服务器之间移动数据库时的权限问题
  • INF：如何在 SQL Server 实例之间传输登录和密码
  • INF：了解 SQL Server 2000 中的“复制数据库向导”并排除故障
  • 数据库还原后，对数据库的用户登录和权限可能不正确
  • 不能将系统数据库备份还原到不同版本的 SQL Server
  • 如何从 SQL Server 中的数据库备份或事务日志备份中检索特定的表或行

提示：更改端口
熟悉 SQL Server 的人都知道 SQL Server 所侦听的默认端口号是 1433。尽管 SQL Server 的命名实例被配置为使用动态端口（表示无论 SQL Server 实例何时开始，它们都可以选择任意可用端口），但默认的 SQL Server 实例始终侦听端口 1433。因此如果您的服务器正在侦听该默认端口，并且该端口受到弱保护，那么就存在风险。不过，您可以通过更改默认端口防止攻击。方法如下。
打开 SQL Server 配置管理器，展开 SQL Server 2005 网络配置，然后展开协议。接下来双击 TCP/IP。TCP/IP 属性列表及其功能就会显示在下面的表中，请进行相应设置。
请注意，SQL Server 数据库引擎可以侦听同一 IP 地址的多个端口，因此要使用的端口将以 1433,1500,1501 形式列出，中间使用逗号分隔。如果您希望配置单个 IP 地址以侦听多个端口，还必须将 Listen All 参数设置为“no”，该参数位于“TCP/IP 属性”对话框的“协议”选项卡上。
现在，右键单击每个地址，然后单击“属性”，确定要配置的 IP 地址。如果“TCP 动态端口”对话框包含 0，则表示数据库引擎正在侦听动态端口，请删除 0。在“IP 属性”区域的“TCP 端口”框中，键入希望该 IP 地址侦听的端口号，然后单击“确定”。在控制台窗格中，单击“SQL Server 2005 Services”，然后在详细信息窗格中右键单击“SQL Server”（<实例名称>），然后单击“重新启动”停止并重新启动 SQL Server。
将 SQL Server 配置为侦听特定端口后，有 3 种方式可以将客户端连接到该端口。您可以运行服务器上的 SQL Server Browser 服务按名称连接到数据库引擎实例；您可以在客户端创建一个别名，指定该端口号；或者给客户端编制一个程序，使用自定义的连接字符串连接客户端。

属性 | 说明
活动 | 表示 SQL Server 正在侦听指定端口。不适用于 IPAll。
启用 | 启用或禁用此连接。不适用于 IPAll。
IP 地址 | 查看或更改此连接所用的 IP 地址。列出计算机使用的 IP 地址以及 IP 环回地址 127.0.0.1。不适用于 IPAll。
TCP 动态端口 | 如果未启用动态端口，此属性为空白。要使用动态端口，请设置为 0。
TCP 端口 | 查看或更改 SQL Server 侦听的端口。默认情况下，默认实例侦听端口 1433。该字段限制在 2047 个字符以内。

衷心感谢以下 Microsoft IT 专家为我们回答了本月的问题：Chad Boyd、Cindy Gross、John Hadden、Saleem Hakani、Stephen Jiang、Mahesh Nayak、Paul Randal 以及 Wayne Yu。


 实用工具特别推荐: PageDefrag
实用工具特别推荐
PageDefrag
Lance Whitney
下载这篇文章的代码: PageDefrag (70KB)

常用的碎片整理程序 Windows® 碎片整理程序可以优化硬盘驱动器上的大部分文件，但是某些项目超出了大多数碎片整理工具的能力范围。以独占使用方式打开和锁定的文件（如 Windows 页面文件和注册表配置单元）通常不能使用内置的 Windows 碎片整理程序或第三方实用程序进行处理。标准 Windows API 不支持在使用这些文件时对其进行碎片整理。幸运的是，Mark Russinovich 为 Sysinternals 创建的 PageDefrag 实用工具可通过对其他工具未处理的项目进行碎片整理来节省时间。
PageDefrag 可以对 Windows 页面文件、注册表配置单元、事件日志和休眠文件（笔记本转入休眠模式后占据内存的硬盘区域）进行碎片整理。在使用这些文件前，该程序会在 PC 启动程序过程中对它们进行优化。
要运行 PageDefrag，只需双击 pagedfrg.exe 文件即可。该程序将显示可以进行碎片整理的每个文件的名称（请参见图 1）。页面文件为 pagefile.sys。注册表配置单元的各个配置单元（如 DEFAULT、SAM、SECURITY、SOFTWARE 和 SYSTEM）显示为单个文件。事件日志也显示为单个文件；例如，AppEvent.evt 是应用程序日志、SecEvent.evt 是安全日志以及 SysEvent.evt 是系统日志。最后，休眠文件是 Hiberfil.sys。
图 1 PageDefrag 显示可以进行碎片整理的每个文件的名称。
图 1 PageDefrag 显示可以进行碎片整理的每个文件的名称。
每个文件名称的旁边是“群集”列和“碎片”列，前者为您显示分配到文件的磁盘上的群集数，后者表示分散在磁盘周围的零碎、非连续的文件碎片数。根据此数据，您可以确定是否需要对这些文件进行碎片整理。
您有两个选择：您可以在下次启动时对文件进行碎片整理，也可以在每次启动时对文件进行碎片整理。除非这些文件要经常使用、该 PC 是服务器或者很少重新启动的其他计算机，否则您最好在下次启动时再对其进行碎片整理。您还可以启动倒计时，以便在启动 PC 后有时间取消碎片整理。
下次重新启动计算机时，将运行常规的 chkdsk 命令，然后 PageDefrag 开始操作。将跳过已组织到连续群集中的文件。这些破碎的文件将被逐一优化。该程序显示正在进行碎片整理的每个项目的名称，告诉您碎片整理是否成功，并列出进行碎片整理前后分配到文件的群集数目。
如果 PC 的可用磁盘空间不足或者可用空间本身太零碎，PageDefrag 可能无法优化文件。在这些情况下，您需要清理出更多空间并在 Windows 内运行碎片整理程序来优化可用空间，然后重新尝试 PageDefrag。
由于 PageDefrag 仅处理少量文件，因此它通常运行得很快。不过，如果文件非常零碎，则可能需要花费一段时间才能完成，至少第一次是这样。PageDefrag 完成其工作后，Windows 将可以正常进行加载。这时，您可以重新打开程序以确认现在每个文件都是单个片段。
您可以通过使用 -e Defrag boot、-o Defrag once、-n Never Defrag 和 -t Set 选项将 pagedfrg.exe 文件的倒计时设置为指定的秒数，以非交互方式通过命令行或脚本运行 PageDefrag。
要了解更多信息并下载副本，请访问 microsoft.com/technet/sysinternals/FileAndDisk/PageDefrag.mspx。

Lance Whitney是一位 IT 顾问、培训师和技术撰稿人。他已经花费了无数的时间来研究 Windows 工作站和服务器。15 年前，当他还是一名记者时，就开始涉足 IT 世界。


 网络专家: 强弱主机模式
网络专家
强弱主机模式
Joseph Davies

网络主机的一种越来越常见的配置是通过多个网络接口实现多宿主化。多宿主主机可同时连接多个网络，如 Intranet 或 Internet，从而提供增强的连接性。但是，由于它们既可连接到 Intranet，又可连接到
Internet，因此在多宿主主机上运行的服务容易受到攻击。为了帮助您阻止攻击并了解如何处理多宿主主机的 IP 通信，我将介绍多宿主主机的强弱主机模式，然后讲述 Windows® 如何支持这些模式。
RFC 1122 规范描述了不作为路由器使用且仅发送和接收单播 IP 通信的多宿主主机的两种模式。这两种模式，就是通常所说的强主机和弱主机，指定了发送或接收的单播通信是否必须与通信传输所经的网络接口相关联。这些模式确定主机如何发送和接收数据包，以及主机如何影响在其上运行的服务的易受攻击性。
虽然 RFC 1122 是为 IPv4 定义了这些模式，但这些模式同样适用于 IPv6。IPv6 的一个多宿主主机示例是一台同时使用 IPv4 和 IPv6 的计算机，该计算机具有一个连接 Intranet 的网络适配器和一个 IPv6 隧道接口。

弱主机模式
在弱主机模式下，IP 主机（IPv4 或 IPv6）可在未分配正处于发送状态的数据包的源 IP 地址的接口上发送数据包。这称为弱主机发送行为。IP 主机还可在未分配处于接收状态的数据包的目标 IP 地址的接口上接收数据包。这称为弱主机接收行为。
当您使用具有多个接口的多宿主 IP 主机时，在接口上启用弱主机接收行为有时可使主机容易受到多宿主攻击。例如，图 1 显示了同时连接 Internet 和 Intranet 的主机 A。主机 A 具有分配给其 Internet 接口的公共 IPv4 地址 131.107.89.211，以及分配给其 Intranet 接口的专用 IPv4 地址 192.168.17.48。
图 1 多宿主计算机示例
图 1 多宿主计算机示例
如果主机 A 在其 Internet 和 Intranet 接口都启用弱主机发送行为，则它可在其 Internet 接口上发送来自 131.107.89.211 和 192.168.17.48 的数据包，在其 Intranet 接口上发送来自 131.107.89.211 和 192.168.17.48 的数据包。
如果主机 A 启用弱主机接收行为，则它可接收以下类型的数据包（假设主机防火墙规则允许该传入通信）：在其 Internet 接口上接收到 131.107.89.211 和 192.168.17.48 的数据包，在其 Intranet 接口上接收到 131.107.89.211 和 192.168.17.48 的数据包。
当您启用弱主机接收行为后，Internet 中的恶意用户可将数据包发送至主机 A 的 Internet 接口，攻击在主机 A 上运行的、仅对 Intranet 中的主机可用的服务。如果 Internet 基础结构支持将目标为 192.168.17.48 的数据包转发到主机 A 的 Internet 接口，就可能发生此类型的攻击。您可在主机 A 的 Internet 接口上设置适当的防火墙规则，防止此类型的攻击。但是，即使您这样做了，在主机 A 上运行的对 Intranet 客户端可用的服务仍存在风险。

强主机模式
在强主机模式下，发送和接收行为有所不同。使用强主机发送，主机仅可在分配了处于发送状态的数据包的源 IP 地址的接口上发送数据包。使用强主机接收，主机仅可在分配了处于接收状态的数据包的目标 IP 地址的接口上接收数据包。
如果图 1 中主机 A 在其 Internet 和 Intranet 接口都启用强主机发送行为，则它仅可在其 Internet 接口上发送来自 131.107.89.211 的数据包，在其 Intranet 接口上发送来自 192.168.17.48 的数据包。
如果启用强主机接收行为，则主机 A 仅可在其 Internet 接口上接收到 131.107.89.211 的数据包，在其 Intranet 接口上接收到 192.168.17.48 的数据包。
在图 1 中，主机 A 的强主机模式将所有地址为 192.168.17.48 的传入数据包放到 Internet 接口上，而无需您配置防火墙规则，有效地将主机 A 的 Intranet 接口和 Internet 接口隔开。
当您选择强主机模式时，请记住，它也许会影响为弱主机行为设计的某些连接类型。例如，某些负载平衡实现也许使用弱主机接收行为在任一接口接收数据包，然后将它们路由到适当的内部接口。对于使用弱主机发送来发送来自某接口（与某快速连接对应）上的任一源地址的通信的主机，也可能会有影响。

强主机发送和接收
现在，我们看一看当您允许每个接口启用或禁用强主机发送和接收时，在 IPv4 或 IPv6 的普通主机上，发送和接收过程是如何进行的。
对于发送中的数据包，IP 首先检查是否已经指定了源地址。如果未指定，IP 将在路由表中无约束查询该数据包的目标地址。在无约束查询中，路由表中的所有路由均在考虑之列。根据所选的目标路由，IP 确定下一跃点接口（该接口用于将数据包放置在链路层）和下一跃点地址。根据下一跃点接口，IP 根据需要使用在 RFC 3484 中定义的地址选择过程来确定最佳源地址。此时，IP 具备了发送数据包的所有条件：源地址和目标地址、下一跃点接口和下一跃点地址。
如果指定了源地址，那么源接口也就可知。因为源接口分配给了源地址。然后，IP 就可确定源接口上是否已启用强主机发送。
如果未启用，IP 将在路由表中对数据包的目标地址执行无约束查询。根据目标的最佳匹配路由，IP 确定下一跃点接口和下一跃点地址。IP 具有了源地址和目标地址、下一跃点接口和下一跃点地址。请注意：如果在源接口上禁用强主机发送行为，下一跃点接口也许与源接口不同。
如果源接口上启用了强主机发送，IP 将在路由表中对数据包的目标地址执行受约束的查询。在受约束的查询中，仅考虑带有源接口的下一跃点接口的路由。根据所选目标路由，IP 确定下一跃点地址。IP 具有了源地址和目标地址、下一跃点接口和下一跃点地址。请注意，如果在源接口上启用强主机发送行为，下一跃点接口将始终与源接口相同。图 2 显示发送主机进程的普通 IP。
图 2 发送主机进程的通用 IP
图 2 发送主机进程的通用 IP
指定源地址后，受约束的路由查询可在路由表中的与目标最相匹配的多个路由中选择指标较高的路由。例如，图 1 中的主机 A 具有两个默认路由，一个指向跃点为 10 的 Internet，另一个指向跃点为 20 的 Intranet。两个 LAN 接口上均启用了强主机行为。
如果主机 A 上的发送应用程序未指定源地址，则路由查询结果将是具有最低跃点数的默认路由；主机 A 始终从源地址为 131.107.89.211 的 Internet 接口发送通信。然而，如果主机 A 上的发送应用程序指定了源地址 131.107.89.211，那么查询结果将是 Internet 接口的默认路由；主机 A 从 Internet 接口发送通信。如果主机 A 上的发送应用程序指定源地址为 192.168.17.48，查询将选择 Intranet 接口的默认路由；主机 A 从 Intranet 接口发送通信。通过受约束的路由查询，IP 使用具有较高跃点数的默认路由发送源地址为 192.168.17.48 的通信。
对于已接收的通信，IP 首先确定该通信的目标是否为本主机。如果不是，由于该主机不充当路由器，IP 自行丢弃该数据包。然后，IP 确定传入接口（接收数据包的接口）上是否启用了强主机接收。如果未启用，IP 将处理该数据包。如果已启用，IP 将确定该传入接口是否分配了数据包中的目标地址。如果已分配，IP 将处理该数据包。如果未分配，IP 将自行丢弃该数据包。图 3 显示普通接收主机进程。
图 3 接收主机进程
图 3 接收主机进程

Windows 中的弱强主机行为
Windows XP 和 Windows Server® 2003 使用弱主机模式为所有 IPv4 接口执行发送和接收进程，使用强主机模式为所有 IPv6 接口执行发送和接收进程。您不能对该行为进行配置。默认情况下，Windows Vista 和 Windows Server 2008 中的下一代 TCP/IP 堆栈支持所有接口上的 IPv4 和 IPv6 强主机发送和接收（但 Teredo 隧道接口除外，该接口适用于 Teredo 特定主机中继）。图 4 按照每个接口列出了可用于配置 IPv4 和 IPv6 的发送和接收行为的命令。注意，InterfaceNameOrIndex 要么是来自“网络连接”文件夹的接口名称，要么是其接口索引。您可从命令显示中获取接口的接口索引：
Figure 4 配置强弱发送和接收行为的命令 (Close Figure 4)

• netsh interface ipv4 set interface [InterfaceNameOrIndex] weakhostsend=enabled|disabled
• netsh interface ipv4 set interface [InterfaceNameOrIndex] weakhostreceive=enabled|disabled
• netsh interface ipv6 set interface [InterfaceNameOrIndex] weakhostsend=enabled|disabled
• netsh interface ipv6 set interface [InterfaceNameOrIndex] weakhostreceive=enabled|disabled
netsh interface ipv6 show interface
弱强主机行为和 RFC 3484
为了提供选择源与目标 IPv6 和 IPv4 地址（用于尝试连接）的标准化方法，RFC 3484 定义了两种算法。一种是源地址选择算法，用于选择与目标地址一起使用的最佳源地址。另一种是目标地址选择算法，用于按优先级顺序对可能的目标地址列表排序。
确定给定的目标地址的候选源地址列表时，强弱主机行为会起作用，并且还会影响目标地址的最终排序列表。对于强主机发送行为，候选源地址列表包含分配给目标的发送接口的单播地址。对于弱主机发送行为，候选列表可包含分配给任何已启用弱主机发送的接口的地址。有关源地址选择和目标地址选择的详细信息，请访问 microsoft.com/technet/community/columns/cableguy/cg0206.mspx。

默认情况下，弱主机发送和弱主机接收对于所有接口的 IPv4 和 Pv6 都是禁用的，但适用于 Teredo 特定主机中继的 Teredo 隧道接口除外。
有关 RFC 3484 的详细信息，请参阅“弱强主机行为和 RFC 3484”侧栏。

禁用远程访问 VPN 连接默认路由
远程访问虚拟专用网络 (VPN) 客户端是多宿主主机的另一个示例。尽管它可能具有连接到 Internet 的单一 LAN 接口，但当远程访问 VPN 客户端完成 VPN 连接后，它成为多宿主主机。它具有两个接口：LAN 接口和一个基于适用于 VPN 连接的点对点协议 (PPP) 的接口。它还具有两个 IPv4 地址：Internet 服务提供程序分配的 IPv4 地址用于 LAN 接口，VNP 服务器分配的 IPv4 地址用于基于 PPP 的接口。
为了确保 VPN 客户端通过 VNP 连接将默认路由通信发送至 Intranet，Windows XP 和 Windows Server 2003 通过提高现有默认路由的跃点数，添加一个使用 PPP 接口且具有较低跃点数的新默认路由，修改 IPv4 路由表。该默认行为使 Intranet 上的位置在 VPN 连接持续期间可以访问，而使 Internet 上的几乎所有位置在 VPN 连接持续期间都无法访问。通过不为 VPN 连接添加默认路由而为 Intranet 目标添加特定路由，可将 VPN 客户端配置为拆分隧道以同时访问 Internet 和 Intranet 位置。但是，仍存在一种风险：拆分隧道 VPN 客户端可在 Internet 和 Intranet 两者间路由数据包。有关详细信息，请参阅 microsoft.com/technet/community/columns/cableguy/cg1003.mspx。
Windows XP 和 Windows Server 2003 中的默认 VPN 客户端行为是为弱主机发送行为设计的。路由查询始终使用 VPN 连接的默认路由，因为它具有最低跃点数。然而，使用强主机发送行为时，用于发送通信的默认路由取决于数据包中的源 IP 地址。对于来自由 ISP 分配的 IPv4 地址的通信的路由查询，将使用默认路由，该默认路由使用 LAN 接口，从而可访问所有 Internet 位置。对于来自由 VPN 服务器分配的 IPv4 地址的通信的路由查询，将使用默认路由，该默认路由使用 PPP 接口，从而可访问所有 Intranet 位置。所以，当您使用强主机发送行为时，VPN 客户端会具有一个分拆隧道配置，并且可同时访问 Internet 和 Intranet，甚至对于那些没有管理员级别权限对 IPv4 路由表进行直接修改的应用程序也如此。
为了阻止强主机发送行为在默认情况下创建拆分隧道配置，当 VPN 连接完成后，Windows Vista® 和 Windows Server 2008 中的 VPN 客户端自动禁用 LAN 接口的默认路由。该行为可确保在路由表中仅存在一个单一的使用 PPP 接口的默认活动路由。该行为还可确保没有管理员权级别权限的应用程序不能执行分拆隧道。
由于来自 VPN 客户端计算机的通信必须源自由 VPN 服务器分配的 IPv4 地址，该行为将 Intranet 和 Internet 更好地隔离开来。当 VPN 连接终止时，即启用被禁用的默认路由。
您可以通过以下命令控制此行为：
netsh interface ipv4 set interface [InterfaceNameOrIndex]
ignoredefaultroutes=enabled|disabled

Joseph Davies是 Microsoft 的一位技术撰稿人，他从 1992 年起一直从事 Windows 网络主题的培训和编写工作。他曾为 Microsoft Press 编写了五本著作，是每月在线 TechNet 网络专家专栏的作者。


 Windows PowerShell: 保护 Shell
Windows PowerShell
保护 Shell
Don Jones

当 Windows PowerShell 团队着手创建一个新的外壳，但工作过程中不断提到“脚本”时，在整个 Redmond 周围可能会听到一片失望的声音。毕竟，Microsoft 先前在管理脚本（此处指 VBScript）方面投入的大量工作不能说完全没有问题。一个
过度授权的执行模型以及大多数用户希望作为完全权限管理员登录的意愿，为灾难敞开了大门。
参加第一次 Windows PowerShell™ 会议的人员一定祈祷过：“想必我们此后不会再遇到此类情形了。”他们确实不会再遇到了。Microsoft 的安全性声誉有了极大提高，这在很大程度上是由于 Microsoft 首先考虑的是安全性问题，而不是随后在产品开发周期中才关注此问题。此原理在 Windows PowerShell 中得到了充分体现。

为什么我的脚本不能运行？
将 Windows PowerShell 安装在一台新的计算机上，然后双击一个 .ps1 文件：此时会弹出记事本，而不是 Windows PowerShell。这是由于 .ps1 文件扩展名（用于 Windows PowerShell 脚本的扩展名）与外壳本身没有任何关联。换句话说，您无法仅通过双击来运行脚本。运行脚本的唯一方法是：打开 Windows PowerShell，键入脚本名称，然后按 Enter。
实际上，仅键入脚本名称也是不够的。您可以从图 1 中看到文件 Demo1.ps1 位于当前文件夹中，但键入 demo1 然后按 Enter 会出现一个错误：“无法将‘demo1’一词识别为 cmdlet、函数、可操作程序或脚本文件。”这是为什么？毕竟，文件确实就在那里。
图 1 为避免命令攻击，Windows PowerShell 要求指定脚本的路径
图 1 为避免命令攻击，Windows PowerShell 要求指定脚本的路径
这是 Windows PowerShell 安全模型的另一方面。一个欺骗性恶意用户在其他外壳中所做的尝试通常是使用与内置命令相同的名称创建一个脚本。因此，例如，如果您希望某个用户运行您的脚本，那么您可以将该脚本命名为 Dir.ps1，并将其放到一个文件夹中。如果您确信该用户会键入 Dir 并按 Enter，那么您的脚本就可以运行，而不是运行用户预期的 Dir 命令。这一技术称为命令攻击。在 Windows PowerShell 中，您必须始终提供此类脚本的路径，以确保 Windows PowerShell 能够很好地防止命令攻击。
运行 demo1 无效，因为没有指定路径，但运行 ./demo1 却有效。这是因为现在我已指定了一个路径，即当前文件夹。该命令行与内置命令混淆的可能性很小，因为如果要引用内置命令，从来不需要键入任何类型的路径。因此，要求键入路径有助于 Windows PowerShell 避免在按 Enter 后可能发生的命令攻击和混淆。

脚本执行策略
您已获得全新安装的 Windows PowerShell 副本，您正在使用正确的语法尝试运行某个脚本。令您吃惊的是，您遇了另一条错误消息，通知您不允许 Windows PowerShell 运行脚本。不明白？？？下面将介绍外壳的执行策略。
您可以通过在外壳中运行 Get-ExecutionPolicy 来查看当前的执行策略是什么。默认情况下，设置为“Restricted”。很简单，这个策略意味着脚本将无法运行。任何时候，对于任何人均是如此。默认情况下，Windows PowerShell 只能以交互方式使用，而不能用于运行脚本。您可以使用 Set-ExecutionPolicy cmdlet 从以下四种可能的执行策略设置中选择一种：
  • Restricted，默认设置，不允许运行任何脚本。
  • AllSigned，仅运行受信任脚本（稍后会详细介绍）。
  • RemoteSigned，运行本地脚本，不管这些脚本是否受信任；如果是从 Internet 下载的脚本，则必须是受信任的脚本才能够运行。
  • Unrestricted，允许运行所有脚本，甚至是不受信任的脚本。
坦白说，对于任何生产计算机而言，都应该最低设置为 AllSigned。我发现，RemoteSigned 对于开发和测试环境很有帮助，但对普通用户而言却没有必要。我还发现，Unrestricted 无论在哪种情形下都是没有用处的，所以即使将来的某些 Windows PowerShell 版本忽略了这一过度授权的设置也不必介意。

信任问题
您的计算机已预配置为信任某些根证书颁发机构 (CA)，即颁发数字证书的服务器。图 2 显示了“Internet 选项”控制面板应用程序，该程序列出了受信任的根 CA。在 Windows Vista® 中，此列表很短，仅包含一些主要的商业根 CA。相反，Windows® XP 中的此列表很长，包含很多我从未听过的根 CA。如果某个根 CA 位于此列表中，基本上就表示您信任该公司，它会对根 CA 进行操作，使其负责在向用户颁发数字证书前验证用户身份。
您获得第 III 类数字证书（通常称为代码签名证书）时，CA（可以是商业 CA，也可以是位于贵组织中的专用 CA）必须验证您的身份。此类数字证书类似于电子通行证或身份证。例如，在提供“我是 Don Jones”ID 之前，CA 需要执行一些步骤以确保我确实是 Don Jones。当您使用自己的证书对 Windows PowerShell 脚本进行数字签名时（可以使用 Set-AuthenticodeSignature cmdlet 执行此操作），表示您正在将您的名字签署到脚本上。当然，如果您能够获得包含其他人姓名的错误证书，就可以将其姓名签署到脚本上。因此，图 2 中的列表上仅显示受信任的 CA 是很重要的。
图 2 Windows Vista 中默认受信任的根 CA
图 2 Windows Vista 中默认受信任的根 CA
当 Windows PowerShell 检查脚本是否受信任时（在 AllSigned 和 RemoteSigned 执行策略设置下执行这一过程），会提出三个问题：
  • 此脚本是否已签名？如果没有签名，则该脚本就是不受信任的。
  • 签名是否完整？即，脚本在签名后是否进行过更改？如果签名不完整，则该脚本就是不受信任的。
  • 签名是否由使用受信任的根 CA 颁发的数字证书创建？如果不是，则该脚本就是不受信任的。
本月 cmdlet：Set-AuthenticodeSignature
Set-AuthenticodeSignature 是对您的 Windows PowerShell 脚本进行数字签名的关键，这样可以使用外壳的最安全的执行策略 AllSigned。若要使用此 cmdlet，首先需要运行另一个 cmdlet — Get-ChildItem，后者用于获得已安装的代码签名证书：
$cert = Get-ChildItem –Path cert:\CurrentUser\my –codeSigningCert
您需要使用指向某个已安装证书的路径来替换该文件路径，可以通过 cert:drive 获得所有已安装的证书。加载证书后，运行以下命令可以对脚本进行签名：
Set-AuthenticodeSignature MyScript.ps1
–cert $cert
当然，要提供您的 .ps1 脚本文件的完整路径。该外壳将向该文件添加回签名块。

信任如何提高安全性？当然，黑客可能会编写恶意脚本、签署该脚本，并获取您环境中某位用户的信任从而执行该脚本。由于该脚本已签名，因此将运行。但正是由于该脚本已签名，您就可以使用该签名来查找作者的身份，继而采取相应措施（如联系执法机构）。但是，只有非常愚蠢的人才会在创建恶意脚本后署上自己的真实姓名！
当然，如果恶意用户能够获取其他用户的身份证书（例如，从身份检查过程不完备的 CA 获取），您将无法根据签名识别真正的罪犯。这正是您信任的根 CA 应具有令您满意的身份验证过程的原因。
如果您使用的是 AllSigned 执行策略设置，甚至还必须对您生成的每个脚本进行数字签名，然后才能运行。Set-AuthenticodeSignature cmdlet 使用起来相当简单，但进行这种数字签名的过程仍很麻烦。此时，第三方软件可能派上用场。建议您选择一个可以使用您指定的证书自动签署脚本的脚本编辑器或可视开发环境。这样，使用签名就是一个透明的过程，并且不必花费多余的精力。如果您希望获得有关支持此方法的编辑器和开发环境的建议，请访问一些在线脚本论坛（如我的网站 ScriptingAnswers.com），并发表消息询问其他 Windows PowerShell 爱好者使用的是什么。
获得证书后，您还可以运行以下一行式命令签署特定位置中的所有脚本：
Get-Childitem *.ps1 | %{Set-AuthenticodeSignature $_.fullname $cert}

集中式保护
显然，Windows PowerShell 执行策略可以对计算机逐一进行配置。但对于企业环境而言，这并不是一个好的解决办法。您可以使用组策略来代替该方法。（您可以从 go.microsoft.com/fwlink/?LinkId=93675 下载 Windows PowerShell 管理模板。）只需将文件拖动到能够影响您的整个域的组策略对象 (GPO) 中，并将其设置为 Restricted 即可。这样，无论将 Windows PowerShell 安装在何处，您都能够保证脚本不会运行。继而，您可以只对本应运行脚本的那些计算机（如您自己的工作站）应用限制性更弱的设置（如 AllSigned）。

备用凭据
不同于 Windows 以前的任何脚本管理语言，Windows PowerShell 甚至已准备好以安全的方式处理备用凭据。例如，Get-WMIObject cmdlet 具有一个 –credential 参数，该参数允许您为远程 WMI 连接指定备用凭据。该参数将接受用户名但不接受密码，由此可防止将敏感的密码硬编码到某个明文脚本。在您提供用户名时，Windows PowerShell 会使用一个对话框提示您输入密码。如果您计划再次使用某个备用凭据，则可以使用 Get-Credential cmdlet 存储身份验证信息：
$cred = Get-Credential DOMAIN\USER
这会立即提示您输入密码，并会将最终凭据存储在变量 $cred 中。随后，变量 $cred 将会根据需要随时被传送给 –credential 参数。您甚至可以使用 ConvertTo-SecureString cmdlet 和 ConvertFrom-SecureString cmdlet 将凭据转换为加密的字符串，或将先前加密的字符串转换回凭据。
这样做会出现一个问题，即您的加密密钥最终会存储到明文脚本，这就完全破坏了安全性。因此，您可以通过向您的 Windows PowerShell 配置文件添加一个对 Get-Credential 的调用，以此替换该操作。然后，当 Windows PowerShell 运行时，会立即提示您输入用户名和密码，该信息将存储在名为 $cred 的变量中。这样，您的外壳中会一直存在一个可用的 $cred 变量，用来表示域管理员帐户。并且，您再也不用为将该凭据存储在何处而烦恼了，因为在您每次打开外壳时都会重新创建凭据，没有必要进行存储。

默认安全
默认情况下，Windows PowerShell 将以支持脚本的管理外壳所能够提供的最安全的设置进行安装和配置。除非您更改了其中的任意一项设置，否则 Windows PowerShell 将一直处于它所能达到的最安全状态。换句话说，Windows PowerShell 中降低安全性的任何操作都是由您的决定和操作导致的。因此，在更改任何默认设置（如重新配置文件扩展名关联、更改执行策略等）前，请确保已完全了解您的操作将带来的后果，并准备好为您所做的更改负责。

Don Jones是 SAPIEN Technologies 的首席脚本权威，也是 ScriptingTraining.com 的一名讲师。您可以通过网站 scriptingAnswers.com 与 Don 联系。


 您好，脚本专家！: 能保存此关系吗？
您好，脚本专家！
能保存此关系吗？
Microsoft 脚本专家
下载这篇文章的代码: HeyScriptingGuy2007_09.exe (150KB)

关系 确实很重要。但脚本专家（在所有人中）是如何知道关系重要的？答案是这样的，首先，我们看了很多电视节目，在电视上，人们经常告诉我们关系很重要。
可是关系并不仅仅出现在每周的肥皂剧或电视电影中。例如，有一个宣传自己可为人们的业务提供资助的日历贷款公司广告。首先，是不是由于他们愿意贷款给本来得不到贷款的人呢？不是。那是不是由于他们将在这笔贷款中收取您 900% 的年利息呢？当然不是。这是因为该日历贷款公司与您之间形成了个人关系。就像其广告所说的，“关系非常重要”。
注意：当然，我们在哭泣，但我们并不为此感到羞愧。毕竟，只要想一想将个人与其日历贷款公司紧紧绑在一起的牢固关系，您就必须相当冷静而不能有丝毫的激动。
当然，我们知道您在想什么：“天啊，如果关系对日历贷款公司很重要，那么关系对编写与数据库交互的脚本的人必定相当重要了。”事实上，关系应该对编写与数据库交互的脚本的人很重要。遗憾的是，尽管如此，这些脚本编写者并不总能意识到关系重要。但没有关系；我们将在本月专栏里矫正大家的观念。
我们知道，很多系统管理员往往将使用数据库作为跟踪其硬件清单的方法。问题是，其中很多数据库并不是以最佳设置方式设置的。例如，假设您需要一个数据库来跟踪连接到所有计算机上的磁盘驱动器。如果您没有数据库设计背景，这是一个很好的学习机会，您将创建包含一个表的数据库，如图 1 所示。
图 1 包含一个表的数据库
图 1 包含一个表的数据库
如您所见，这是一个非常简单的设计：一个字段用来填写计算机名称，两个“是/否”字段用来确认计算机是否具有 C: 驱动器和 D: 驱动器。这就是整个设计了。干脆利落、切中主题。
这个数据库有什么问题？实话告诉您，几乎一切都有问题。如果您可以确定自己没有使用两个以上磁盘驱动器的计算机，此设计会起到作用（在某种程度上）。但是，如果计算机具有三个磁盘驱动器，会发生什么情况？在这种情况下，您将不得不添加另一字段（用来跟踪驱动器 E）。但是如果计算机具有 11 个磁盘驱动器，会发生什么情况？并且如果您希望跟踪其中每个驱动器的属性，又会发生什么情况？例如，假设您希望跟踪每个驱动器的总容量。在这种情况下，您需要 Drive_C_Size 字段和 Drive_D_Size 字段，以及 Drive_E_Size 字段，等等 — 您有点明白了吧。（另外，但愿您不会还希望跟踪可用磁盘空间、磁盘连接器类型、是否在驱动器上启用了磁盘配额等等。）
此处有一条经验法则需要记住：一个实体在任何时候都可以拥有多个事物（例如，一台计算机可以拥有多个磁盘驱动器），所以该“平面文件”（一个表格）设计不是很好。确实，您也许认为可以侥幸应付这种磁盘驱动器的设计；毕竟，连接到计算机的驱动器的数量是有限的。但是假设您希望查询数据库并获得所有 100 GB 或更大的磁盘驱动器的列表。您将如何执行此类操作？首先，您需要在 Drive_C_Size 字段查找 100 GB 的驱动器，然后在 Drive_D_Size 字段查找同样的内容，接下来在 Drive_E_Size 字段，接着在......总之，这不是切实有效的方法。但是有其他方法吗？如果您不能用平面文件数据库，那能用什么？
这很简单：关系数据库。关系数据库的设计意图之一就是处理一对多关系（例如，一台可具有多个磁盘驱动器的计算机）。您可能会问是否需要出去购买新的产品来使用关系数据库，先告诉您：不用；如果您有任何一种数据库（Microsoft® Access™、SQL Server™、Oracle 等都可以），很可能您就已经拥有关系数据库了。您不必去购买任何东西，只需知道两件事情即可：1) 如何在数据库的两个表之间建立关系；和 2) 如何编写可以利用此关系的脚本。
注意：根据电视节目，您绝对不应该利用关系。但这是不同的。
因为此专栏名称不是“您好，数据库设计专家！”，所以我们不会花很多时间讨论数据库设计。我们仅是向您演示一个非常简单的关系数据库设计，我们将使用该设计讨论如何编写关系查询。在该数据库中，我们有两个表。第一个表命名为 Computers，含有两个字段：ComputerName 和 SerialNumber。ComputerName 字段用来存储计算机名称，SerialNumber 字段用来存储 — 呵，您猜对了 — 序列号。
那么，在何处存放磁盘驱动器信息呢？那就要用到第二个表了，该表名为 DiskDrives。它包含三个容易理解的字段：SerialNumber、DriveLetter 和 DriveSize。
此处的关键字段是 SerialNumber。这个字段名称听起来熟悉，确实，因为它与 Computers 表中的一个字段完全相同。这并不是意外或巧合，我们是专门这样设计的。为了在这两个表之间建立关系，我们需要某一个字段在两个表中同时出现，这样，我们就可以分辨哪些磁盘驱动器属于哪些计算机了。
为什么用序列号而不用计算机名称链接两个表？实际上，这是因为有一个充分的理由：计算机名称会（并且经常）更改。而序列号往往不会更改。
我们说得够多了。让我们看看图 2，一个脚本可以搜索这两个表并检索属于各台计算机的磁盘驱动器的列表。图 3 显示了该脚本返回的此类数据。
Figure 3 搜索结果 (Close Figure 3)
atl-ws-01
C:

atl-ws-01
D:

atl-ws-01
E:

atl-ws-02
C:

atl-ws-02
D:
Figure 2 搜索表 (Close Figure 2)
Const adOpenStatic = 3
Const adLockOptimistic = 3

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open _
 "Provider = Microsoft.Jet.OLEDB.4.0; " & _
 "Data Source = c:\scripts\test.mdb"

objRecordSet.Open "SELECT Computers.*, DiskDrives.* FROM Computers " & _
 "INNER JOIN DiskDrives ON Computers.SerialNumber = DiskDrives.SerialNumber " & _
 "ORDER BY Computers.ComputerName, DiskDrives.Drive", objConnection, adOpenStatic, _
  adLockOptimistic

objRecordSet.MoveFirst

Do Until objRecordset.EOF
 Wscript.Echo objRecordset.Fields.Item("ComputerName")
 Wscript.Echo objRecordset.Fields.Item("Drive")
 Wscript.Echo
 objRecordset.MoveNext
Loop

objRecordSet.Close
objConnection.Close
我们不打算在本月的专栏文章中论述连接数据库和使用数据库的基础知识。如果您是编写数据库脚本的初学者，您可能想查看“脚本专家”网络广播“系统管理员的数据库脚本”(go.microsoft.com/fwlink/?LinkId=22089)。我们所要说的是我们正要连接到一个 Access 数据库 (C:\Scripts\Test.mdb)，并与名为 Computers 和 DiskDrives 的关系表一起使用。这从脚本来看应该相当清楚。
我们要说的另一件事是您需要做一点改进以便与 Access 2007 一起使用：很重要的一点是提供程序需要从 Microsoft.Jet.OLEDB.4.0 更改为 Microsoft.ACE.OLEDB.12.0，代码如下：
objConnection.Open _
 "Provider = Microsoft.ACE.OLEDB.12.0; " & _
 "Data Source = c:\scripts\test.accdb"
对，就是这样。我们下面要执行的操作重点在于从两个表中检索数据的 SQL 查询：
objRecordSet.Open "SELECT Computers.*, " & _
 "DiskDrives.* FROM Computers " & _
 "INNER JOIN DiskDrives ON " & _
 "Computers.SerialNumber = " & _
 "DiskDrives.SerialNumber " & _
 "ORDER BY ComputerName, Drive", _
 objConnection, adOpenStatic, adLockOptimistic
复杂吗？也许有一点。这样，我们看看是否可以将其分解以便于理解。
查询的第一部分实际上非常简单。我们要选择两个表中的所有字段：Computers 和 DiskDrives。因而就采用了下面这段 SQL 代码：
SELECT Computers.*, DiskDrives.*
确实不错；无需说明，星号只是表示“任何内容”的通配符。
如果您以前编写过 SQL 查询（或者使用 SQL 查询语言的子集编写过 Windows<SUP>®</SUP> Management Instrumentation 查询或 WMI 查询），您应该知道相应的例程：在指定了要选择的项目后，接下来指定从哪里选择这些项目。以下是下一条查询，比较难：
FROM Computers INNER JOIN DiskDrives ON Computers.SerialNumber = DiskDrives.SerialNumber
不要让这些把您搞晕。当然，这比典型的 FROM 语句复杂得多，但使用它是有充分理由的。毕竟，在典型的 SQL 查询中，我们只从一个表中选择数据；而这次我们同时从两个表中选择数据。
让我们进一步看看该语法以及它的工作方式。正如您所看到的一样，我们要求脚本从 Computers 表和 DiskDrives 表选择数据。不过，请注意，我们不使用单词“and”，相反，我们用术语 INNER JOIN。这个术语定义了关系的类型，并说明了如何将两个单独表中的信息连接到一个记录集。（是的，存在其他类型的联接；稍后我们将讨论这些联接。）
正如前面指出的，指定两个表之间的关系类型以及这两个表到底如何进行关联由我们自己决定。下面这段代码将为我们实现上述目的：
ON Computers.SerialNumber = DiskDrives.SerialNumber
我们现在要做的是定义如何联接表。只要 Computers 表中的 SerialNumber 字段与 DiskDrives 表中的 SerialNumber 字段相匹配，随时都会对记录进行组合。如果我们将其他字段（例如 ComputerName）用作联接字段，会怎样？此时所用的代码将类似如下内容：
ON Computers.ComputerName = DiskDrives.ComputerName
为了防止您会产生疑惑，我事先说明一下，是的，这两个字段不必名称相同；它们只需包含相同数据。使用相同的名称可更容易地识别关系字段。这里只需记住一个问题：由于两个字段具有同一名称，所以在引用其中一个字段时需要始终使用语法 TableName.FieldName。这表示要使用类似以下的代码：Wscript.Echo obj- Recordset.Fields.Item("Computers.SerialNumber")。
这实际上就是我们所需的一切；查询的其余部分将仅对数据进行排序，首先按计算机名称排序，然后按驱动器排序：
ORDER BY ComputerName, Drive
看，这种方法很不错，不是吗？我们现在需要暂停片刻，说一下联接。为什么在查询中使用内部联接？很简单。内部联接仅返回在每个表中具有匹配值的记录。换句话说，假设我们有序列号 121989。如果该序列号在 Computers 表和 DiskDrives 表中同时出现，则会返回相应的记录。（当然，并不是在任何地方显示的序列号都有效；它必须显示在 SerialNumber 字段中。）明白了吗？很好。
现在，假设我们有一台具有序列号 121989 的计算机；但是，没有使用该序列号的磁盘驱动器。在这种情况下，将不返回具有序列号 121989 的计算机的数据。这是因为内部联接仅当记录在每一个联接的表中具有匹配值时才返回信息。
换句话说，内部联接查询返回所有具有硬盘的计算机；它不返回任何不具有硬盘的计算机，或者未在计算机上安装的硬盘。很好；这通常是我们需要的。但是，如果您确实想要不具有硬盘的计算机列表或未安装在计算机上的硬盘列表，怎么办？然后呢？
这就是外部联接的用途。（哦，所以这就是外部联接的用途！）现在，我们将谈谈外部联接的两种不同类型：左和右。我们的数据库中有两个表：Computers（视为“左”表，因为它是主表）和 DiskDrives（视为“右”表，因为它不是主表）。假设我们希望返回的记录集包含所有计算机，甚至包含那些没有安装磁盘驱动器的计算机。在这种情况下，我们使用语法 LEFT OUTER JOIN 以及与以下代码类似的查询：
objRecordSet.Open "SELECT Computers.*, " & _
 "DiskDrives.* FROM Computers " & _
 "LEFT OUTER JOIN DiskDrives ON " & _
 "Computers.SerialNumber = " & _
 "DiskDrives.SerialNumber " & _
 "ORDER BY ComputerName, Drive", _
 objConnection, adOpenStatic, adLockOptimistic
您可能已经明白了，即使在右表中没有相应的记录，左外部联接也会返回左表中的所有记录。这样，我们可以收到所有计算机的记录，但从右表（磁盘驱动器）只能返回与计算机关联的记录。
或者，也许我们想要所有磁盘驱动器（包括那些没有安装在计算机上的磁盘驱动器）的列表。因为 DiskDrives 表在关系中是右表，所以我们使用语法 RIGHT OUTER JOIN，类似如下代码：
objRecordSet.Open "SELECT Computers.*, " & _
 "DiskDrives.* FROM Computers " & _
 "RIGHT OUTER JOIN DiskDrives ON " & _
 "Computers.SerialNumber = " & _
 "DiskDrives.SerialNumber " & _
 "ORDER BY ComputerName, Drive", _
 objConnection, adOpenStatic, adLockOptimistic
现在我们考虑一下，如果 DiskDrives 在关系中是右表，那么不管怎么样 Computers 在关系中应该被认为是 husband 表而不是左表。正如某些脚本专家经过痛苦的经历了解到的，husband 在关系中绝不会是右实体。
利用右外部联接，我们可以收到右表中的所有记录（所有磁盘驱动器），但只能收到与磁盘驱动器关联的计算机（左表中的记录）记录。
目前来看其意义可能不大，但您只要用用它，研究一下，就会明白它起的作用。如果您需要使用数据库，请访问 microsoft.com/technet/scriptcenter/resources/tnmag/archive.mspx，我们在其中发布了一个示例供您使用。
无论何时使用外部联接，至少也要使 On Error Resume Next 处于脚本上的第一行，这至关重要。为什么？假设我们执行左外部联接；在这种情况下，我们有可能收到一些未安装硬盘的计算机记录。这很好（毕竟，这正是我们希望收到的），至少在我们遇到下面这行代码之前是这样的，这行代码回显驱动器号：
Wscript.Echo objRecordset.Fields.Item("Drive")
由于特定计算机上不存在“驱动器”字段，所以脚本将崩溃停止：
C:\Scripts\database.vbs(22, 9) Microsoft VBScript runtime error: Type mismatch
不过，如果我们实现了 On Error Resume Next，则脚本可以忽略计算机不具有磁盘驱动器的事实并且能继续顺利执行。或者，您可能使用如下代码来检查“驱动器”字段的值，然后执行相应的操作：
If IsNull(objRecordset.Fields.Item("Drive")) _Then
    Wscript.Echo "No disk drives installed."
Else
    Wscript.Echo _
      objRecordset.Fields.Item("Drive")
End If
使用此代码，我们将检查是否收到了空值而非实际驱动器号。如果返回空值，我们将回显“未安装磁盘驱动器”消息。如果未返回空值，我们只回显“驱动器”字段的值。最终的结果输出如图 4 所示。
Figure 4 显示相应结果 (Close Figure 4)
atl-ws-01
C:

atl-ws-01
D:

atl-ws-02
C:

atl-ws-02
D:

alt-ws-03
No disk drives installed.
无需过多解释，让我们看看另外两个查询。例如，下面是一个内部联接查询，返回了计算机及其安装的磁盘驱动器的列表，并假定这些磁盘驱动器在 50 GB 以上（我们假想磁盘容量大小用 GB 来计算）：
objRecordSet.Open "SELECT Computers.*, " & _
 "DiskDrives.* FROM Computers " & _
 "INNER JOIN DiskDrives ON " & _
 "Computers.SerialNumber = " & _
 "DiskDrives.SerialNumber " & _
 "WHERE DriveSize > 50 " & _
 "ORDER BY Computers.ComputerName, " & _
 "DiskDrives.Drive", objConnection, _
 adOpenStatic, adLockOptimistic
您可以清楚地看到，我们所做的全部工作就是将标准的 Where 子句添加到原始查询：
WHERE DriveSize > 50
如果我们只需要计算机上 E 驱动器的相关信息，怎么办？没问题 — 只需添加相应的 Where 子句：
WHERE Drive = 'E:'
以下是一个稍显复杂的查询，它返回未安装磁盘驱动器的计算机集合：
objRecordSet.Open _
 "SELECT Computers.ComputerName, " & _
 "DiskDrives.Drive " & _
 "FROM Computers LEFT JOIN DiskDrives " & _
 "ON Computers.SerialNumber = " & _
 "DiskDrives.SerialNumber " & _
 "GROUP BY Computers.ComputerName, " & _
 "DiskDrives.Drive " & _
 "HAVING (DiskDrives.Drive) Is Null " & _
 "ORDER BY Computers.ComputerName", _
 objConnection, adOpenStatic, adLockOptimistic
如我们所说，这个查询有些复杂，由于篇幅所限，我们不解释它的工作原理了。但是它确实奏效，而这是最重要的事情。
还有，也许这是第二重要的事情：正如我们曾经多次指出的，关系确实很重要。这并不表示关系不会出现偏差。正如 Woody Allen 在“Annie 会议”结束前所说，“关系就像是一条鲨鱼，它必须不断前进，否则就会死亡。而我想我们获得的是一条死鲨鱼”。要是 Woody 已了解内部联接和外部联接，就不会这样说了。利用这些查询技巧，您可以始终拥有成功的关系！

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


 Exchange 问题与解答: 安装程序、邮件日记、存储选项，及其他信息
Exchange 问题与解答
安装程序、邮件日记、存储选项，及其他信息
KC Lemson and Nino Bilic

问：我正在运行 Exchange Server 2007 安装程序，我想知道是否可以不进行先决条件检查。我并不想解决先决条件检查提示我的所有问题；我只是要运行安装程序并完成安装！

答：简答是不可以。如果先决条件检查标记出的问题阻止安装程序继续运行，则您确实必须解决这些问题，否则将影响到您的长期 Exchange 体验。
一些管理员曾尝试编辑 ExBPA.PreReqs.xml 文件（该文件包含 Exchange 2007 安装先决条件列表），删除导致安装受阻的检查。但这并未起到任何作用，因为 XML 文件已经过数字签名，对其内容进行任何更改都将使签名失效。
这完全是为了防止您创建无法正常运行的安装。我们已在不同环境中对 Exchange 2007 进行了测试，并了解到有些配置和设置相对于其他软件而言运行效果更好，而有些则可能导致出现实际问题。设置先决条件的初衷是基于我们的经验和测试来确保您的安装过程尽可能获得成功。
如果通过 Exchange 2007 先决条件检查发现了真正的问题，并且它阻止了在您的环境中进行的安装，则您应该向 Exchange 支持部门提出问题。

问：从何处可以找到安装日志？我在 C:驱动器的根目录中没有找到该日志。

答：所有的安装日志现在均存储在 %SYSTEMDRIVE%\ExchangeSetupLogs 目录中，而在大多数安装中，该目录指的是 c:\ExchangeSetupLogs。在该目录中提供了多个文件，其中两个文件需要特别注意：
ExchangeSetup.log 此日志包含了有关运行安装程序时使用的任务和参数的信息。配置服务器角色时，有关为配置服务器而运行的任务的信息也会记录在此日志中。在此处您还可以查看有关服务器安装的大部分信息。Service Pack 安装也将附加到同一文件中。
ExchangeSetup.msilog 此文件包含有关安装解包阶段的信息。当 Microsoft® 安装程序将文件从临时位置复制到它们的目标位置时，会将相关信息记录在此文件中。因此，如果您遇到有关在安装过程中无法复制文件或访问文件的问题，此日志可能会有所帮助。

问：我知道先决条件检查受 Exchange Server 最佳实践分析工具 (BPA) 支持，但我从哪里可以找到先决条件报告？
答：如果您想要找到 BPA 在先决条件检查过程中创建的报告，请查看以下文件夹：
%SYSTEMDRIVE%\Exchangesetuplogs\PreReqs
该文件名具有标准的格式：
ExBPA.<dateandtime>.data.xml
如果您要尝试确定某一特定先决条件检查要查找的内容，请查找包含您看到的错误消息的 XML 文件，在该消息的正上方，您会看到测试的规则定义。
问：如何阅读安装日志？我有哪些选择？
答：通常有两种方法可以用来阅读安装日志。您可以从 Exchange 命令行管理程序中运行 Get-SetupLog，也可以就通过记事本或最喜欢的文本编辑器打开安装日志文件。
如果您使用 Get-SetupLog，那么下面是有关如何显示所有警告或错误的一个示例：
Get-SetupLog c:\exchangesetuplogs\exchangesetup.log –error
如果想要使其便于阅读，则应该获取 Out-HTML.ps1 和 Out-IE.ps1 脚本，这些脚本可以从 Exchange 2007 PowerShell Scriptacular 演示包中获得。（在我们的博客 msexchangeteam.com/archive/2006/12/27/431998.aspx 上可以了解更多相关内容。）
获取这些脚本后，将它们放在 Exchange 脚本文件夹中（默认路径为 c:\program files\microsoft\exchange server\scripts），然后运行以下命令：
Get-SetupLog –tree:$false –error:$false | Where { $_.status –eq "Error" } | select datetime, depth, description, status | Out-HTML | Out-IE
这将以 HTML 视图形式打开一个易于导航的浏览器窗口，其中显示在安装过程中可能发生的错误（请参见图 1）。
图 1 Out-HTML 和 Out-IE 可使您的安装日志视图更易于阅读
图 1 Out-HTML 和 Out-IE 可使您的安装日志视图更易于阅读
另一方面，如果您选择使用记事本查看 exchangesetup.log，请参考下列提示：
  • 要查找安装程序运行的开始部分，请搜索：[0] Starting Microsoft Exchange 2007 Setup。
  • 要查找安装程序运行的结束部分，请搜索：[0] End of Setup。
  • 主要安装任务的分隔标记：[0] **************。
  • 要查找运行安装程序的帐户，请搜索：[0] Logged on user。
  • 要查看安装过程中使用了哪个域控制器，请搜索：[0] Setup will use the domain controller。
一般来说，当使用记事本查看安装日志时，您应该从文件的末尾处开始，按时间顺序返回以查看问题所在。错误通常是在安装日志中记录的最后几条信息。

问：是否可以将 Exchange 2007 统一消息与我的 PBX 一起使用？

答：也许可以。请访问 microsoft.com/technet/prodtechnol/exchange/telephony-advisor.mspx 查看受支持的 VoIP 网关和 PBX 列表。对受支持的产品列表所做的任何更改均将添加到此页中。
问：我有一个运行 Small Business Server 2003 的 Exchange 客户端，并且公司策略要求监视所有的邮件。为了执行监视，我想要向管理员帐户发送所有传入和传出邮件的副本。怎样才能实现呢？
答：您所需要的是邮件日记，它使您能够在一个单独的日记邮箱中保留特定邮箱数据库收发的所有邮件的副本。可以通过多个选项来配置记录的副本的详细程度（例如，是否要捕获 BCC 收件人？），还有一个附加工具，您可以从 go.microsoft.com/fwlink/?LinkId=93725 下载此工具以获得一些高级功能。Exchange 2003 中的日记功能在数据库级别被启用，因此该数据库中的每个用户均会被记录下来。创建了用于保留记录的邮件的邮箱后，转至 Exchange 系统管理器中的邮箱存储属性，然后选中用于存档由此存储中的邮箱发送或接收的所有邮件的复选框。根据业务策略，您可能还要使邮箱管理器能够自动将旧的日记副本从日记邮箱中清除。
Exchange 2003 另有一项与日记相似的功能，称为存档接收器。与日记功能将邮件的副本保存到 Exchange 中的另一邮箱中不同，存档接收器将邮件保存到服务器硬盘上的指定文件夹中。如何从这两种方法中做出选择呢？日记功能通常适用于需要符合法规要求的情况，但如果您要捕获来自或发送到 Internet 的所有邮件，存档接收器就会派上用场了。
Exchange 2007 从很大程度上简化了这些情况，您可以轻松地基于每个用户或每个通讯组列表 (DL) 进行记录。如果不希望用户知道他们的邮件被记录，您可以从全局地址列表中隐藏该 DL（请注意，这与 DL 的隐藏成员不同）或为这些用户设置自定义属性，然后创建基于查询的通讯组（这里也称为“动态通讯组列表”或“DDL”）以避免使所有用户都具有该自定义属性。如果想要将整个组织中的所有邮件记录到同一位置，请在创建日记规则时保留收件人字段为空。另请注意，如果要在 Exchange 2007 中使用并非基于数据库的日记功能，则您需要这些用户的企业客户端访问许可证 (CAL)。有关详细信息，请访问 microsoft.com/exchange/howtobuy/licensingFAQ.mspx。如果不想使用 CAL 或其他任何功能，您可以继续使用 Exchange 2003 中基于数据库的日记功能。最后，请查看 David Strome 在《TechNet 杂志》2006 年 12 月刊上发表的标题为“Exchange 2007 中更强大的日记功能”的文章，网址为 technetmagazine.com/issues/2006/12/journaling。

问：我的所有用户运行的都是 Microsoft Office 2003，而且我们不打算在 2008 年硬件更新前升级到 2007 Office system。但从我所阅读到的信息来看，我很担心他们会因此而无法使用某些功能。他们是否能够使用统一消息？

答：当然可以。在 Office 2003 中，启用统一消息的用户可以在其邮箱中接收语音邮件和传真，以及通过电话呼入来访问其邮箱。如果不升级到 Outlook 2007，您将不能使用以下两个统一消息功能：在 Outlook 中通过“选项”选项卡配置语音邮件设置，以及在收到 Outlook 语音邮件时显示特殊自定义窗体（通过该窗体，您不必启动单独的媒体播放器即可播放内联邮件）。此外，使您能够撰写语音便笺并将它们通过语音邮件来保存的功能将不可用。但是，即使不安装 Outlook 2007，您的启用了统一消息的用户仍然可以使用 OWA 2007 来访问统一消息设置（位于 OWA 选项页），以及使用 OWA 中语音邮件的自定义窗体。

问：我公司已经拥有存储区域网络 (SAN)，并且我想将 Exchange 2007 与之连接起来。但我听到关于直接附加存储 (DAS) 有许多不同看法，这使我犹豫是否应该选择这么做。您有什么看法吗？

答：对于此问题没有对错之分，这实际上要取决于贵公司的策略和方案（如果您已拥有 SAN，尤其如此）。如果您正在考虑购买新的 SAN、另添加一个或考虑升级，我们强烈建议您考虑使用 DAS。请考虑以下信息：截至 2007 年 6 月，Microsoft IT 已为 40,000 个邮箱（配额范围从 500MB 到 10GB 不等）部署了 17 个 Exchange 2007 邮箱服务器，这些服务器均通过 DAS 使用群集连续复制 (CCR)。我们计划到 9 月份为 152,500 个邮箱部署 35 个 Exchange 2007 邮箱服务器，且它们都使用 DAS。因此，如果您想知道 DAS 是否适用于企业规模，回答是完全肯定的。DAS 已成为使 Microsoft IT 在降低总存储成本的同时增加用户配额的关键因素。有关所涉及的拓扑、部署以及成本节省的详细信息，请访问 microsoft.com/technet/itshowcase/content/64bitexchange2007.mspx。
尽管将所有服务器连接到同一个 SAN 乍一看可以节省大量存储空间，但这并不是万无一失的。例如，经常发生的一个问题就与连接到 SAN 的软件具有不同使用方案有关。例如，如果您在 SAN 上拥有 HR 应用程序，该应用程序每天 5:00 PM 运行批处理，那么 I/O 峰值可能会严重影响您的 Exchange 用户。缺少确定性的 I/O 是共享 SAN 部署中的一个常见问题。
我们还认识到 DAS 的一个优点是更容易管理，因为它不需要专门的存储管理员或特殊设备。它将不断发展，并且易于购买和日后进行扩展。而且，一般来说它非常便宜，可为您节省大量资金。

问：我已经安装了第一台 Exchange 2007 服务器。现在，当我使用 Outlook 2003 尝试连接时，收到一条错误，指出管理员已阻止我的 Outlook 版本。（“您的 Exchange Server 系统管理员禁止您正在使用的 Outlook 版本。请与管理员联系以获得帮助。”）但我就是管理员，并且我从来没有阻止它。这是怎么回事？

答：这并不是异常行为。当安装 Exchange 2007 时，安装向导将询问您，在您的组织中是否有运行任何 Outlook 2003 或早期版本或者 Entourage 的客户端（请参见图 2）。如果您对此问题的回答是“否”，就会将遇到此问题。
图 2 Exchange 2007 安装旧式客户端问题
图 2 Exchange 2007 安装旧式客户端问题
要在安装完成后解决此问题，只需使用 Exchange 管理控制台或 Exchange 命令行管理程序创建一个公用文件夹存储，然后重新启动信息存储服务即可。在这种情况下重新启动信息存储服务是必需的，只有重新启动该服务后才能够将旧式客户端（Outlook 2003 及其早期版本）连接到服务器。
此外，如果您要运行 Exchange 2007 的无人参与安装，则可以使用 /EnableLegacyOutlook 开关指定您对有关旧式客户端问题的回答。

问：为什么 Exchange 2007 会关心我是否使用 Outlook 的旧版本连接到服务器？为什么创建公用文件夹存储并重新启动信息存储服务就可以解决此问题？

答：这些问题的答案都涉及到公用文件夹存储的存在。您可能还记得，早期版本的 Exchange 中的公用文件夹存储用于存储用户的闲/忙数据，此外还有一些其他功能。当旧式 Outlook 用户使用 MAPI 或 RPC over HTTP 连接到他的 Exchange 服务器并向其日历中发布内容后，有关他的闲/忙状态的信息也将被发布到服务器上一个称为 Schedule+ 文件夹的专门公用文件夹中。这是旧式 Outlook 客户端了解的将用户的闲/忙数据发布到服务器的唯一方法，实际上也是旧式 Outlook 了解的如何读取其他用户的闲/忙信息的唯一方法。
Exchange 2007 知道这一情况。这就是为什么如果没有公用文件夹存储，Exchange 2007 就会阻止早期版本的客户端的原因。如果 Exchange 2007 允许旧式客户端连接，那么客户端就会频繁地出现错误，因为 Outlook 无法连接到公用文件夹存储以发布闲/忙数据，并且由于用户想执行的闲/忙查找（例如，当尝试与他人安排会议时）不能运行，因此客户端功能会受到限制。这也就是创建公用文件夹存储能解决此问题的原因，因为这样 Exchange 2007 服务器知道旧式客户端可以使用闲/忙发布功能，所以就会允许用户登录邮箱了。
综上所述，您还可以得出这样的结论：Outlook 2007 客户端不需要公用文件夹存储来发布它们的闲/忙信息。这是正确的，但不太容易理解。
无需进行太深入的研究，让我们假设 Exchange 2007 服务器上存在公用文件夹存储，甚至 Outlook 2007 客户端也会将用户的闲/忙数据发布到其中。这样做的原因是其他客户端（其中一些客户端可能是旧式 Outlook 客户端）就可以查找 Outlook 2007 用户的闲/忙信息了；如果公用文件夹存储中没有此类信息，那么旧式客户端就看不到 Outlook 2007 用户的信息，因为尚没有任何程序将信息填充到公用文件夹存储中。但是，如果没有公用文件夹存储，Outlook 2007 客户端就不会尝试发布闲/忙数据。当没有公用存储且所有的客户端都至少是 Outlook 2007 时，将使用另一种闲/忙信息查找的机制，在该机制中将直接从用户邮箱中读取日历数据，而无需在其他地方创建此信息的副本。有关详细信息，请在服务器的帮助文件或位于 go.microsoft.com/fwlink/?LinkId=69434 的 Exchange 联机文档中查找有关可用性服务的信息。

问：我刚才阅读了知识库文章 288894，它主要讨论使用注册表项阻止 MAPI 客户端（请参见 support.microsoft.com/kb/288894）。我查看了我的服务器的注册表，但并没有设置该项。那么存储怎么会执行对旧式客户端版本的阻止呢？

答：问题提得非常好。实际上，Exchange 2007 信息存储并不是使用知识库文章中提到的“Disable MAPI Clients”注册表值来阻止旧式客户端的。其原因是有可能不存在公用文件夹存储，因此如果不存在公用文件夹存储，对注册表项做出的任何修改都不能解除对这些客户端的阻止。
阻止早于 Outlook 2007 版本的客户端的行为被直接硬编码到 Exchange 2007 信息存储。服务启动时，存储就会检查是否存在公用文件夹存储，然后确定是只有 Outlook 2007 才能够连接到它们的邮箱，还是早期版本也可以。此检查仅在服务启动时进行。这就是创建公用文件夹存储后必须重新启动信息存储服务更改才能生效的原因。

KC Lemson是 Exchange Server 的用户体验经理。她目前在一所声望很高的非获得评估认定的大学攻读博士。
Nino Bilic是 Exchange Server 的可支持性项目经理。他正在考虑成为 Forza Motorsports 2 的一名专业赛车手。


 安全观察: 用户帐户控制的长期影响
安全观察
用户帐户控制的长期影响
Jesper M. Johansson 博士

以管理员身份运行存在的问题是显而易见的：攻击用户或用户运行的应用程序的任意恶意软件都将完全控制它所感染的 90％ 以上的计算机。Windows Vista 中的用户帐户控制 (UAC) 功能是 Microsoft 应对普遍性安全挑战（即
Windows 平台上 90％ 以上的用户都使用管理权限运行这一事实）的解决方案。尽管在 Windows® XP 上可以以标准用户身份运行（我就是），但相当麻烦。例如，如果您使用 Windows XP 时经常外出旅行，就会发现作为标准用户，您无法修改系统上的时区。
UAC 是一项可为您完成所有更改的功能。实际上，这便是第一个误解。UAC 不只是一项功能，而是一个功能集，其中的大部分功能并不十分明显。我不会为您深入分析 UAC 的所有实现细节。要了解这些内容，我强烈推荐 2007 年 6 月刊《TechNet 杂志》中 Mark Russinovich 的文章，可通过 technetmagazine.com/issues/2007/06/UAC 在线查找。
而在本文中，我希望能够使您对以下内容有个客观了解：UAC 是什么、UAC 不是什么，以及它如何影响管理 Windows Vista® 系统的方式。

UAC 看起来是什么
UAC 最显著的特征是提升对话框，如图 1 所示。事实上，如果您去问一个典型的 Windows Vista 用户代表“UAC 是什么”，大部分人可能都会提到那个令人讨厌的提升对话框。
图 1 管理员批准模式中面向管理员的 UAC 审核对话框
图 1 管理员批准模式中面向管理员的 UAC 审核对话框
尽管 UAC 非常引人注目并存在很多争议，但我认为针对 UAC 的大多数讨论对了解 UAC 究竟是什么并没有太大帮助。而事实上，似乎还引起了一些严重的混淆。Pundits 曾以“Vista 最令人讨厌的功能”等为标题写过博客文章、新闻组条目和文章，这些文章武断地宣称有多少人会关闭该对话框以及它为什么如此令人讨厌。
假如只有少数人愿意费神去搞清楚 UAC 背后的基本原理，我为什么不开启这个专栏来介绍 UAC 是什么呢？

UAC 是什么
UAC 是使更多人能够以标准用户身份运行的一次尝试。从某种意义上来说，这一尝试始于版本 2.0。版本 1.0 最初随 Windows NT® 3.1 一起提供，它使用户能够以非管理员身份运行。相对于不存在任何低权限用户定义的 16 位 Windows 3.1 及其后续产品 Windows 3.11、Windows 95、Windows 98 和 Windows Me 而言，这是一次根本的转变。非管理员是否能够真正执行有用的操作取决于许多因素，但在 Windows XP 和 Windows Server® 2003 中，最低用户权限通常使用起来要么很费力，要么毫无用处。Windows Vista 引入了第一个技术集，旨在使其在涉及交互用户权限时能够更易于执行正确的操作。
尽管 UAC 的目标是为以管理员身份（而不是以非管理员身份）运行的应用程序提供一定级别的保护这种宣称是正确的，但无论如何这并非 UAC 的主要目的。UAC 的主要目的是为我们开辟一条途径，使更多用户可以以标准用户身份运行，这会迫使开发人员编写更多可以作为标准用户工作的程序，从而减少用户需要提升的情况。随着开发人员编写的 UAC 兼容的应用程序越来越多，用户得到提示的次数会减少，用户体验会更佳。在这个过程中，理想情况下，我们会实现这样一种结果：大多数用户不再以管理员身份运行，很有可能，他们开始质疑收到的一些提升提示。出现的提示越少，用户越有可能在允许它们之前仔细考虑。
理论上基本如此。是的，通过扩展可能会减少恶意软件，但这取决于用户是否一直启用 UAC，而这又取决于开发人员是否编写了适用于 UAC 的软件，以及用户是否在快速单击练习的过程中停止查看提示，而从实际考虑提升请求是否合法。
增加大部分时间都可以以非管理员身份运行的用户数量是主要目标，为了实现这一目标，UAC 旨在实现若干子目标：
  1. 减少需要提升到管理帐户的情况。
  2. 相对于以前纷杂的情况（如使用 runas.exe 或注销一个帐户，再进入另一个帐户）而言，使提升更加轻松（如果可以，执行自动提升）。换句话说，即弥补存在的缺陷，直到 ISV 修复其应用程序。
  3. 为以管理员身份运行的应用程序提供一些隔离，以防止非管理员的运行。
  4. 在任何可能的情况下，使某些公开的应用程序能够使用更低的权限运行。
其中两个目标旨在使以非管理员身份运行的用户获得尽可能良好的体验。另有两个目标用来保护特别公开的应用程序。
有趣的是，其中只有两个目标与通常被视为 UAC 的功能相关，只有一个目标用来处理实际的提升任务。然而，当应用程序请求其他权限时，提升却成了用户抱怨的对象，因为它是组成 UAC 的技术集合的唯一真实可见的形式。首要目标与提升毫不相关。其意图不过是使更多用户能够大部分时间都以非管理员身份运行。实际上，您可以坚持认为其意图是要减少提升事件的数目。
与提升任务本身相关的目标是第 2 和第 3 个目标。第 2 个目标是使提升比在 Windows XP 中更易于进行；第 3 个目标是为运行提升的应用程序提供某种级别的保护。其他目标用于解决截然不同的问题。不过，其中每个目标都需要对操作系统进行更改。前面提及的 Mark Russinovich 的文章详细介绍了这些更改，可供感兴趣的人士查看。
正如我所述，除此之外确有许许多多有关禁用 UAC 的建议。可能许多用户甚至不经任何尝试就禁用 UAC，但更多用户是从专卖店购买计算机，然后安装已禁用 UAC 的 Windows Vista 版本。我觉得分销商将禁用操作系统中重要的安全功能作为其默认部署映像的一部分是可耻的。
遗憾的是，大部分拒绝使用 UAC 的意见都基于初次体验。设置计算机时，如果您安装软件并进行一些必要的更改，则会出现大量的提示。配置计算机时，您应期待将会拥有非常不同的管理体验，而不是要其立即处于稳定状态。前几周的体验会与接下来几周的体验截然不同。如果您在处于相对稳定状态的计算机上尝试 UAC，我想您会发现它真的丝毫不受任何特别的干扰。

UAC 不是什么
UAC 并非故意设计成为 Windows 有史以来最令人讨厌的功能的。相反，此技术集旨在为我们开辟一条途径，使得用户不必再像过去几年一样经常将其系统暴露给潜在的恶意代码。
在当前形式下，UAC 还不能阻止非常厉害的攻击者或有非常厉害的攻击者协助的人员。如果攻击者无法想出任何其他方式来攻克 UAC，则几乎一定会转而利用用户来帮助他们解决此问题。假使存在“跳舞的小猪”和安全性两种选择，我们根据经验可知必定每次都会选择“跳舞的小猪”。用户已学会了关闭对话框，因此他们一直关闭对话框，除非我们设法教会他们其他操作。导致这种结果的因素很多，其中包括：警告对话框过多，其中的消息毫无意义，许多手册（无论用户购买何种设备都会随附）中都包括备注“请单击安全性警告对话框中的‘是’来关闭对话框”。
UAC 不提供可靠的安全性。事实上，它使得原来良好的本地权限提升再次成了攻击关注的对象。此类攻击的攻击性已大打折扣，因为在 Windows 上，几乎每个人在一定程度上都是管理员，因此提升到某些其他管理员毫无意义。也就是说，UAC 完全改变了此类攻击的性质，并将游戏的规则转换为更加类似于已在 UNIX 上普遍适用了 20 多年的规则。
UAC 不能阻止攻击者盗取您的个人数据。无论该用户的权限是什么，都可以访问用户的个人数据。同样，任何一种应用程序（包括恶意应用程序）都可以访问该数据。UAC 不会改变这种情况，也无法改变。它不能消除保持警惕、不信任和质疑的必要，这些都是我们应利用各种机会向我们的最终用户强化的要素。
UAC 不用于防止使用提升权限运行的应用程序受到同一登录会话中使用正常权限运行的应用程序的攻击。尽管 UAC 确实提供一些薄弱的进程隔离，但通过沙盒将应用程序彼此隔离并非 UAC 的设计目标。

宣传语
Microsoft 自身既大力宣传了 UAC，却也导致了对 UAC 功能的误解。例如，在“Windows Vista Security Guide”（Windows Vista 安全指南）中，“防御恶意软件”一章将 UAC 作为防御恶意软件的主要技术来介绍 (microsoft.com/technet/windowsvista/security/guide.mspx)。它建议大多数情况下都要在 UAC 开启的状态下防御恶意软件，并且列出了在使用 UAC 抗衡恶意软件时需考虑的若干要点。不过，其中显然缺少了一点：UAC 不会停止恶意软件，而且这也不是它的目的。
在当前的 Windows 安全性领域，世界上某些最聪明的思想者（如 Joanna Rutkowska）确实明白 UAC 的目的。正如她在 2007 年 2 月 4 日的博客文章中所述，UAC“是 Vista 中引入的全新的安全机制，其主要目标是强制用户使用受限的帐户（而非管理员）工作”(theinvisiblethings.blogspot.com/2007/02/running-vista-every-day.html)。她所说的大都正确，但我更愿意使用术语“促使”，而不用“强制”。
不过，这却意味着针对 Windows 的常见攻击的性质有了重大改变。正如我在本专栏的前面所述，本地权限扩大的漏洞（用户可从本地标准用户扩大到本地管理员）在 Windows 平台上从未受到过特别的关注。
在 Windows Vista 中，其理论是用户可以转而作为标准用户运行，这样，本地权限扩大的问题就突然变的非常有意义了。遗憾的是，在这里我们也遇到了 UAC 的一些局限。请记住，在同一个桌面上，不存在有效的隔离，不存在可隔离各种进程的安全边界。操作系统确实包括一些保护性措施，用以阻止显然没有必要的通信途径，但要完全阻止它们却是不可能的，也是不符合需要的。因此，Microsoft 不会将并不存在的安全边界突破口看作安全突破口。Mark Russinovich 在其博客文章中进行了详细说明，网址为：blogs.technet.com/markrussinovich/archive/2007/02/12/638372.aspx。
Mark 所言完全正确。Microsoft 非常明白以下事实：在同一桌面上，低级别进程和提升的进程之间并不存在安全边界。由于从未试图隔离同一桌面上的各个进程，因此在发现同一桌面上不同进程之间无隔离时，确实不能将其称为安全漏洞。很明显，这大大降低了 UAC 作为一流防范恶意软件机制的价值，但无论您在不同地方阅读到何种信息（包括某些来自 Microsoft 的信息），UAC 的设计都并非用于防止恶意软件。
从其主要目标（使更多用户在更多时间内作为标准用户运行）来考虑，这个事实是否会降低 UAC 的价值呢？不会。在恶意的低权限应用程序和提升的应用程序之间，无论是否存在密封的安全边界，都不会改变以下事实：更多用户可以有效地使用 UAC，并且可以作为标准用户运行 Windows Vista 计算机。事实上，与业界要使您相信的某些事实相反，我正是作为 Windows Vista 上的标准用户撰写本文（以及有关 Windows Vista 安全性方面与此相关的整本书）的，而且我从未收到要求我接受我所写任何内容的 UAC 提示！
UAC 不能解决所有的安全问题，或者它不具备我们许多用户（包括我自己）很希望它拥有的属性 — 一流的防范恶意软件机制，这是事实，但这并不意味着它不是一项安全技术。通过单独的用户帐户来识别用户的能力本身不能阻止恶意软件感染系统，但任何人也不能将此事实引申为用户帐户因此就不是一项安全技术。UAC 不会解决我们希望它解决的所有问题，这并不意味着它为我们解决的问题毫无价值。
UAC 会将恶意代码留给如大幅改进的 Windows 防火墙、Windows Defender 和其他防恶意软件程序等技术，以此阻止恶意代码接近您的机器，如果恶意代码通过某种方式（无论是通过狡猾的程序，还是通过“飞行的小猪”）接近了机器，则阻止其运行。上述安全技术中任何一种都不可能 100％ 成功实现其目标，不过它们都是很有价值的安全技术，都有其各自的功用。但是，正如我在前面多次提过的，即使所有的攻击途径都被关闭了，用户依然会面临攻击。如果用户通过敲击键盘选择允许恶意代码运行，那么世界上任何解决技术都爱莫能助。

最佳实践
应如何使用 UAC？在管理员批准模式中，是否应该作为管理员运行？我们已多次强调，在同一桌面上，UAC 不能阻止代码从较低权限的应用程序进入更高权限的应用程序。这意味着无论以管理员批准模式运行还是作为标准用户运行并在会话（即时权限提升）中进行提升，都不能提供有效的隔离。不过，两种解决方案中的任意一种都远远好于在 Windows XP 中或在关闭了 UAC 的 Windows Vista 中作为管理员运行。但是最终，恶意软件很可能被写入以利用交互式桌面上提升的应用程序。
这时，如何决定运行方式取决于您的风险管理哲学。如果作为标准用户运行，并使用即时权限提升来提升应用程序，则提升的应用程序的用户环境会与常规应用程序不同。这样会降低有害攻击的风险，其中恶意的非提升应用程序会攻击用户环境中已提升的应用程序，并且不必取消非提升应用程序的功能即可控制已提升的应用程序。尽管几周前运行的恶意应用程序不能轻松地攻击今天运行的已提升应用程序，但现在运行的恶意应用程序可能能够控制已提升的应用程序。在提供易于使用这一特性的前提下，您需要权衡使用管理员批准模式或即时权限提升所带来的风险。
因此，产生了一系列关于 UAC 的最佳实践，图 2 中对此进行了概括。依我看来，到目前为止，最佳的选择也是最复杂的。但是，针对真正需要保持警惕还是公开而言，最佳的选择则是作为标准用户运行，并且永远不进行提升。从某种意义上讲，在 Windows XP 下作为管理员运行，一旦运行了恶意代码，那就全完了。在 Windows Vista 下，如果运行恶意代码并在该会话中提升它，很有可能一败涂地。您可以自由选择最适合您的方法，然后提供自己觉得合适的一定程度上的保护。
Figure 2 帐户提升最佳实践 (Close Figure 2)

保护级别 | 提升方法
更遭 | 关闭 UAC。
不好 | 自动提升管理员。
良好 | 以管理员批准模式运行。
更好 | 作为标准用户运行并提升到单独的管理员帐户。
最好 | 作为标准用户运行，然后将用户切换到单独的管理员帐户，而不是使用 UAC 提升。
此外，真正的警惕用户并不信任供应商所说的其应用程序必须作为管理员运行。出现这种提示（但不正确）最明显的示例之一是 Visual Studio® 2005 Service Pack 1。启动 Visual Studio 时，系统会告诉您应作为管理员运行。不过，这种提示仅对需要执行特定任务的开发人员而言是正确的。有关详细信息，请访问 msdn2.microsoft.com/en-us/vstudio/aa972193.aspx。

为用户提供强大支持
应为用户提供强大的支持，以便他们做出更多更好的决策。安全专家为此提供了一项应急措施，他们认为应对用户隐藏安全决策。他们未说出口的理由是，用户不仅对安全性不感兴趣，同时也不具备对其进行适当处理的能力。只有依赖 Insert-YourFavoriteAntiTechnologyHere，他们才能得到适当的保护。
我没有看到技术最终如何保护用户免受针对用户的攻击。当前的大部分攻击（包括几乎所有的仿冒攻击）都是主要针对用户以及用户运行其计算机的方式，而并非针对那些计算机内部的技术。这些攻击中最有效的攻击可能是结合了针对用户和针对技术的攻击，但它们通常仍需要用户交互才能运行。因此，不要仅仅期望通过技术来防止并非针对技术的攻击。关于此问题，我以前已经写了很多：technetmagazine.com/issues/2006/07/SecurityWatch。
UAC 已强制用户做出安全决策，但仍有技术供应商承诺可提供阻止用户做出这些决策的解决方案。的确，用户非常愿意不受安全性打扰。但是，任何软件都无法洞悉其他软件的意图，这也是事实。任何入侵防护系统都无法说明某个网站要求您提供信用卡号码是为了向您发送一份 Windows Vista 安全性副本，还是为了将其自身发送到隐蔽的犯罪组织。只有最终用户才能做到这一点，并且是仅在提供了适当信息的情况下才能做到。作为软件工程师，我们需要使用户习惯他们需要做出明智的安全决策这一事实，教会他们如何做出决策，并为他们提供做出决策所需的信息。
如果我们坚持使用当前的方式，即试图阻止用户做出安全决策，我们只会发现已经无法保护他们。最终，用户对受到攻击及其隐私、银行帐户、身份、尊严和自尊受到侵害不胜其烦。出现这种情况后，他们就会停止使用这些产品，而我们需要用户购买这些产品以维持行业的发展。在高科技行业中，有些人认为如果我们隐瞒计算机和一切电子产品存在安全问题这一事实，用户就会盲目使用投放市场的任何产品。这是最荒谬不过的了。当用户最终发现我们对他们不够公开和没有做到诚信后，他们会对我们的产品完全丧失信任，从此拒绝使用，从而导致我们在一直通过隐瞒事实来努力保护的整个行业崩溃。
UAC 在支持用户负责个人系统安全性方面，迈出了令人兴奋的一步。它决不是一个完整的安全解决方案，但作为帮助用户使用最低权限运行的第一次尝试，的确是朝正确的方向迈出了重要的一步。

Jesper M. Johansson 博士是解决软件安全问题的首席安全工程师，也是《TechNet 杂志》的特约编辑。Jesper 拥有 MIS 博士学历，并且具有 20 多年计算机安全方面的经验。


 桌面文件: 使用 Windows PE 进行 PC 恢复
桌面文件
使用 Windows PE 进行 PC 恢复
Wes Miller

在前几期专栏中，我已经提及到 Windows PE 的最初目标是使其成为一种部署环境。像所有的好产品一样，Windows PE 的发展已经超出了此范围。客户（起初为 OEM）渴望构建一种用于制造和用户自我恢复的解决方案，一些公司已推出了
可同时满足这两方面需求的 Windows® PE 解决方案。
当今的大多数恢复工具都基于以下前提：通过镜像部署过程将系统返回到一个已知的正常状态。相对于 Windows XP 来说，Windows Vista® 使恢复变得更为轻松，还提供了现有的映像支持（请参阅本期《TechNet 杂志》中 Christine Fok 关于 Windows Vista 备份技术的文章）。
在本月专栏中，我将介绍如何基于 Windows PE 构建您自己的恢复解决方案。拥有 Windows 许可证的所有人都可免费获得作为 Windows 自动安装工具包 (AIK) 组件的 Windows PE 2.0。此许可证不仅可应用于部署，而且还可用于使用 Windows PE 进行恢复与故障排除。
显然，您必须根据自己的自定义需求做出相应调整，但无论您要部署 Windows XP 还是 Windows Vista，都需要记住几个基本点，本文中我将对此予以介绍。如果您熟悉映像，就已经了解我要讲述的很多内容了。
任何一个 Windows PE 恢复解决方案的主要组件都包括：
  • Windows PE
  • 映像实用程序
  • 使其合在一起的脚本粘合（或正式应用程序）
或者，您可能希望包括 SQL 支持与 Active Directory® Service Interfaces (ADSI) 支持。使用 SQL 连接，您可以间接地构建一个允许系统有各个类别的“材料单”（用来定义安装所需的内容）的解决方案。同样地，与 Active Directory 相连接便于设置每台机器帐户对象 (MAO) 的属性。
请注意，Microsoft 不支持在 Windows PE 中包含 ADSI，但是，有许多在线文章介绍了如何实现此目的，而且如果做法正确，效果会非常好。如果您不打算启用 ADSI，您可以添加 SQL 支持,并在工作流中进行构建从而作为 Windows PE 恢复工具。如果需要任何 ADSI 属性，您可以使用带有计划任务的服务器系统查询同一个 SQL Server™，然后通过 ADSI 查询 Active Directory — 本质上，它起着传递作用。
这并不是一项完美的解决方案，仍需要一些脚本或其他自动操作，但此设计将允许您通过 Windows PE 与 Active Directory 进行交互。
请注意，您也可以使用 LDIFDE 实用程序读取来自 Windows PE 内的 Active Direc-tory 信息（有关详细信息，请参阅 support.microsoft.com/kb/237677 上关于本主题的知识库文章）。例如，您可以使用以下命令：
ldifde -m -f x:\output.ldf -b <username> <domain netbiosname> <accountPassword> -s
<DC or domain name> -d "DC=contoso,DC=com" -r "(&(objectclass=<computerclassname>)
(netbuisname=<mycomputername>))" - l "<attributename>"
输入此命令会将所指定的计算机对象的某个属性提取到 x:\output.ldf，在其中可对该文件中的输出内容进行分析。

SKU、位和语言
您需要考虑需要部署的 Windows 的版本、体系结构和语言。在一个较小的区域性组织中，您可能只部署一个操作系统 — Windows XP 或 Windows Vista — 或使用新的 PC 上已安装的任何系统。这时，您可能还未打算部署很多 x64 Windows 系统（如果有）。而且，有可能您仅需要支持一种语言。但是，越是大型的全局性组织，可能需要处理的体系结构、版本和配置就越多。
在前期专栏中，我提及到您可以在同一个 Windows 映像格式 (WIM) 文件中存储 x64 和 x86 卷映像 — 但这不会节省空间。如果您正在构建一项恢复解决方案并需要考虑到这两种体系结构，则应将其分别存储在单独的 WIM 中。同样，如果您要部署和支持 Windows XP 和 Windows Vista，将这两个操作系统存储在同一个映像中不会实现节省空间的效果。您会发现，唯有在这两种部署中包含同一应用程序（例如 2007 Microsoft® Office system）的许多实例时才能实现空间节省。在这种情况下，不需要多次存储应用程序文件，但是这仍然不大可能在空间方面实现明显的节省。
Windows PE 引导方法
Windows PE 1.6
通过远程安装服务 (RIS) 进行 PXE 引导
（无 RAMDisk）
硬盘驱动器
USB 闪存驱动器
RAMDisk PXE
RAMDisk CD/DVD
RAMDisk USB 闪存驱动器
RAMDisk 硬盘驱动器

Windows PE 2.0
RAMDisk PXE
RAMDisk CD/DVD
RAMDisk USB 闪存驱动器
RAMDisk 硬盘驱动器

如果需要 PXE，通过 RIS 进行 PXE 引导 是最佳方法，但是需要注意的是相对于使用 PXE RAMDisk 来讲，此方法要花费更长的时间进行引导，而且要使用更多的网络资源。
硬盘驱动器 使用极少内存，但会锁定驱动器。如果要使用双区触发器恢复方案，此方法再理想不过了。
USB 闪存驱动器 便于引导；但是，如果引导系统没有经 OEM 验证为 UFD 可引导的，并且无 Windows Vista Capable 徽标（徽标要求确保支持 UFD 引导），则 UFD（对于 RAMDisk 和非 RAMDisk 方案）是随机的。UFD 引导需要高性能的闪存驱动器（用于读取和写入）以及受 USB 控制器和 BIOS 支持的高速 USB 支持。
RAMDisk 引导 （不管什么类型）需要更多的内存，但是，它可提供最佳性能，并且可通过将 Windows PE 置于内存中的 RAMDisk 中对其充分利用。Windows PE 1.6 的 RAMDisk 引导通常只应在至少具有 256MB RAM 的系统上使用。Windows PE 2.0（始终是 RAMDisk WIM 引导）通常只应在至少具有 384MB RAM 的系统上使用。

但是，请注意，如果将特定版本 Windows 的多个 SKU 存储在同一个 WIM 中，会节省很多空间。例如，假如您已将 Windows XP Professional 与 Windows XP Tablet PC Edition 合并或将 Windows Vista Business Edition 与 Windows Vista Ultimate Edition 合并，这些合并就会有效地利用空间，因为同一个版本和 Service Pack 级别的两个 SKU 会共享大多数相同的代码和文件。
最后，需要考虑语言。组织越大，需要考虑使用的语言就越多。对于 Windows XP，您可以选择使用本地化版本或多语言用户界面 (MUI)。对于 Windows XP 的完全本地化版本，几乎每一个小字符串都已经本地化为目标语言。另一方面，MUI 的基本语言是英语，而 MUI 语言包（和更高版本，语言界面包）已更改了尽可能多语言字符串。（MUI 在 Windows 2000 中的结果尚可，在 Windows XP 和 Windows Server 2003 中的结果更佳。）
如果您的组织使用的是 MUI，则在同一个 WIM 中合并了不同语言版本后，会获得良好效果。这是因为他们的核心使用的都是英语二进制文件。但是，对于早于 Windows Vista 的本地化版本来说，情况并非如此。因为二进制文件本身已经本地化了，所以同一个二进制文件不能跨语言匹配，这意味着您必须为每种语言存储几乎整个操作系统（和任何已本地化的应用程序）。
对于 Windows Vista，您可以认为本地化版本（本地化为带有资源的单个二进制文件的一部分）已被弃用。Windows Vista 中包括英语在内的每种语言均使用 .mui 资源文件。实际上，Windows Vista 是独立于语言的，因为所有语言信息都在 MUI 文件中。因此，在同一个 WIM 中存储一种以上语言版本的 Windows Vista 会节省更多的空间。存储两种、四种或更多种语言作为一个 WIM 意味着您不再需要显著增加映像，而且在以后可随着需求变化切换或添加语言。
简言之，构建解决方案时，您应考虑到哪种版本的 Windows 以及哪种版本的其他应用程序可共享相同的二进制文件，从而允许文件的单个实例存储。这将有助于确定整个组织所需的 WIM 文件的数量。

用户方案
一般来说，组织越大，就会越复杂。规模的大小并不是主要原因，而是由于引进的所有可变因素（您拥有了更多的用户和业务部门）带来了更多的特定要求。
我记得有一个独特的跨国组织，它拥有数万用户，并且完全从一个位置（从地理角度和组织角度来说）来管理部署过程。经营此组织的人总会面临一些非常具有挑战性的难题。例如，他曾经关注位于非洲特定地区的远程用户，他们没有良好的网络连接 — 事实上，他们中的许多人距电话线都有上百英里远。他需要了解，这些用户怎样才能在不用连续数日停机并且不用走很长路的情况下恢复他们的系统。
当您开发了某个产品后（在这个意义上，您应将自己的恢复解决方案作为一个产品），应考虑到用户因素。不仅考虑特定的业务需要，还要考虑到与不同类别的用户相关的各种复杂性。您应合并使用案例，使用简短的描述介绍您需要支持的最终用户的每种类型。这样，可帮助您识别任何无意中未包含在恢复解决方案的用户，并确保考虑到了每种类型的用户的需要。

Windows PE 的正确版本
另一个重要的决定就是确定 Windows PE 的哪个版本符合您的需要。本专栏的以前几期内容可能会有所帮助，但在此我将对此决定进行更清晰的说明。如果满足以下任一情况，您应使用 Windows PE 1.6：
  • 您只打算恢复 Windows XP（或 Windows Server 2003）
  • 您要恢复的是不符合高级配置和电源接口 (ACPI) 标准的系统
  • 您要恢复的是拥有少于 512MB RAM 的系统
  • 您要恢复的是使用少于 256MB RAM 并需要预引导执行环境 (PXE) 启动的系统
如果满足以下任一情况，您应使用 Windows PE 2.0：
  • 您只打算恢复 Windows Vista（或 Windows Server 2008）
  • 您要恢复的是 Windows Vista 以及 Windows XP
  • 您使用的是 BitLocker™
请注意，ImageX（请参阅“创建、更新和存储”部分）和大多数第三方映像解决方案都可用于 Windows PE 的任一版本。

引导 Windows PE
接下来您应该考虑的是如何引导 Windows PE。此处，用户方案发挥了主要作用。用户随身携带 CD 或 DVD 进行恢复是否现实？在旅行过程中，他们是否可将其用于便携式计算机？您如何使恢复媒体保持最新状态？可移动媒体上的恢复映像可能很快会过时。
无疑的，我所见到的最常见的方案是辅助硬盘分区。另一种方案是 PXE 引导。或者，您可能见过使用外部 USB 驱动器，甚至是 USB 闪存驱动器 (UFD) 的方案，但是请注意，相关硬件必须明确支持通过 UFD 设备的引导。
“Windows PE 引导方法”侧栏概括了引导每种版本的 Windows PE 所支持的方法，并提供了有关每种方法的一些重要注意事项。
您引导 Windows PE 的目标应该是在满足特定条件的同时启动恢复过程：
  • 需要极少的用户交互
  • 使用极少的移动部件（可移动媒体或可移动设备）
  • PC 可能不存在网络连接
  • PC 可能无法进行本地引导（Windows 引导失败）
由于担心驱动器故障，管理员经常认为将 Windows PE（平面或在 RAMDisk 中）置于硬盘上是不可行的方案。但事实上，鉴于现今磁盘的可靠性，这是可行的。实际情况是，如果物理驱动器确实出现了故障，用户将不能用任何方法恢复他们的系统。
我偏爱创建辅助分区并在其中存储恢复映像。我不太相信能隐藏分区，那只不过是迷惑用户。对它使用访问控制列表 (ACL) 也是不可行的，除非用户不是本地管理员。
通过缩减用于 Windows 的分区（请参阅侧栏“创建恢复分区”），您可以创建足够的空间来存储 Windows PE 和恢复映像。若要将 Windows PE 置于辅助分区上，您只要在恢复分区创建相应的引导扇区并将 Windows PE 置于此分区（随 Windows AIK 和 Windows PE 早期版本附带的文档中介绍了此过程，所以这里我就不详细介绍了）即可。关键是记住用于引导的分区由被标记为活动的分区确定。Diskpart 具有一个活动标记，还具有一个同样重要的不活动标记。若要从 Windows 内部（或从 Windows PE 副本内部）引导该恢复分区，请使用 diskpart 切换活动分区（请参见图 1）。以下是用于切换单个磁盘、双分区系统的 diskpart 脚本（使用 diskpart /s nameofscript.txt）的示例：
SEL DIS 0
SEL PAR 1
INACTIVE
SEL PAR 2
ACTIVE
EXIT
图 1 用于更改活动分区的 Diskpart
图 1 用于更改活动分区的 Diskpart
这是许多使用者使用恢复工具来更改分区的过程，更改分区的过程仅可针对特定分区类型（如隐藏的 OEM 分区）在 Windows PE 内部完成。有时，这些工具也将显示隐藏的 OEM 分区类型。

创建、更新和存储
创建恢复分区
只要您了解了创建恢复分区所需的步骤，则在保持 Windows 不变的同时创建恢复分区的过程就不会很困难。下面是对需要执行的操作的快速演示。请注意，此过程需要使用 Windows PE 2.0。虽然您可以不使用 Windows PE 2.0 进行部署或恢复，但完成此任务必须使用 2.0 版本。此过程也可以用于部署 Windows Vista 和创建用于 BitLocker 引导文件的引导分区，因为 BitLocker 至少需要两个分区（一个用于引导文件，一个用于 Windows 系统的其余部分）。
  1. 对磁盘进行碎片整理（此操作可帮助加快缩减进程，缩减进程会花费大量的时间）
  2. 引导到 Windows PE 2.0
  3. 运行 diskpart（如果需要，您可以根据步骤 4 到步骤 9 创建一个脚本，并将 diskpart 传递到以下参数：/s name_of_your_script
  4. SEL VOL 1（或您打算缩减的卷）
  5. SHRINK DESIRED=N MIN=N（以兆字节 (MB) 为单位进行指定，DESIRED 是目标，MIN 是您需要的绝对最低值）
  6. 完成缩减后，运行 SEL DIS 0
  7. CRE PAR PRI （如果您要指定磁盘剩余部分以外的大小，您可以指定 SIZE=N）
  8. ASSIGN LETTER=N:（此字母仅在 Windows PE 下使用）
  9. 退出 diskpart
  10. FORMAT N:/Q /Y /FS:NTFS（NTFS 格式化新分区）
  11. 运行 bootsect N：/nt60 用于 2.0，/nt52 用于 1.x）
  12. 将所需的 Windows PE 文件复制到恢复分区
  13. 关闭系统

因为 ImageX 是免费提供的解决方案，您可能已经使用映像工具一段时间了。您可以使用您最熟悉的一种工具。如果您正在考虑使用 ImageX，关于它，有几个我本人很喜欢的特性（除了免费外）值得关注一下。尤其是 ImageX 对于压缩的巨大改进。同样很棒的是，可以相对轻松地添加和编辑映像。
我也喜欢 ImageX 允许不具破坏性地映像一个或多个卷，通过将其移开即可保留用户数据。换句话说，恢复 Windows 时没必要删除整个卷。
当然，之后您需要决定存储该映像的位置。假如您的解决方案使用了恢复分区，则您可以在那里存储 WIM 或其他映像文件。您甚至可以考虑使用 Windows 部署服务 (WDS)、创建标准的 OS 映像以及将其存储到网络上。这可以实现在整个基础结构上都可用的常见恢复解决方案。毫无疑问，如果您有用户在实地工作（如上文提及的世界偏远地区的工作人员），您需要确保当他们不能连接网络时拥有自己可用的解决方案。
我之前提到您可以使用媒体（如 DVD），不过由于很多原因，我个人通常不喜欢采用这种方法。例如，映像的大小会迅速增长而超出 DVD 的容量，而且此类磁盘无法轻易更新。这并不是说光学媒体没有用途；您仅需要考虑不同类型的用户使用哪种方案最合适。如果您至今尚未确定最佳方案，我倾向将映像存储到恢复分区、USB 硬盘或闪存驱动器上（可行的话，可以使用 WDS 存储到网络上）。
使 WDS 成为炙手可热的选择，其中一个原因是能够很容易地更新集中式映像。现在您应该了解了 Windows Updates 每月发行，并且这些更新通常是关键更新。以使恢复映像尽可能保持最新的方式对您的解决方案进行设计。使用 WDS，您可以更新每台服务器上的映像，并且此映像是完整的。

关注用户数据和设置
对恢复解决方案进行设计时应记住几个问题。规划任何恢复解决方案的一个关键方面是确保用户数据的安全。您不希望看到在实地工作的用户在执行完恢复后发现在此过程中丢失了所有重要的数据。理想情况下，除非您对处理系统恢复的方式很谨慎，否则您会希望用户数据存储到 C: 分区之外的位置。
我之前提到，ImageX 允许您以非破坏性的方式还原磁盘。例如，它将现有的 Documents and Settings（或 Users）目录树移动到另一个目录，以便恢复结束后，用户或脚本能够手动恢复文件。在大多数情况下，将所有文件存储到配置文件的用户或使用漫游配置文件的用户应能在不丢失用户数据的情况下恢复系统。但是，请切记，除非您非常认真地制定了恢复解决方案或者拥有完美的备份解决方案，否则仍可能失去一些用户数据。
切记，尽管您已制定一切计划，但有些用户可能将信息存储到配置文件之外的位置。您应确保自己的解决方案考虑到可能会使用户数据意外丢失的情况，并在用户执行操作前提醒用户。
如果您使用加密文件系统 (EFS)，请确保您已执行主要恢复计划，因为您肯定不希望由于无法恢复的加密而丢失数据。与 BitLocker 相似，请确保您已准备好使用它来恢复已加密的卷。这意味着需使用 Windows PE 2.0（1.x 不能与 BitLocker 交互）。有关 BitLocker 恢复的详细信息，请参阅 blogs.msdn.com/si_team。
最后，请做好准备应对某些用户在自己的一些自定义或应用程序消失后出现不安的情况。自定义（用于应用程序和 Windows 本身）会随机存储在某些位置，而不仅仅存储在用户配置文件中。还原整个 OS 分区时，一些用户将会打电话询问“x 到哪儿去了？”或“为什么 Word 不再显示 y 了？”设置用户的预期，以便让他们了解该环境可能会与这之前的环境不完全相同。
使用 Windows PE 创建您自己的恢复解决方案需要花费时间，并且在计划解决方案和对其进行设计时需要考虑到用户。恢复解决方案不需要太过复杂，它仅需要能够帮助用户使用有限的技术支持以最少的时间完成备份。

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


 领域备注: 免费食物和培训技巧
领域备注
免费食物和培训技巧
Michael Dragone

我是一名系统工程师 在一家产权保险公司任职，该公司约有 150 名员工。实际上，我们的计算要求非常简单，因为我们主要的业务线应用程序是基于 Web 的。因此，我们主要与 Internet Explorer® 进行交互，当然还包括 Microsoft® Office。
有了这样相对简单的应用程序部署，您可能会认为我们的用户不会有什么关于使用这些应用程序方面的日常问题。在大多数情况下的确如此。客户遇到的各种问题通常普通的《TechNet 杂志》读者就可以轻而易举地解决。
由此我了解到，给予用户良好的培训是将问题保持在最低限度的关键所在。在此我想分享两点处理用户问题的经验，希望您对待用户时能采取类似的措施。
首先是培训课程。我们常常会举办培训课程，介绍安装好的新系统、要扩展部署的新应用程序和采取的新策略。同样，如果要引入一项重大的系统更改，我们会举办一次特殊的培训课程，专门介绍此更改并回答所有的问题。我们会在更改前举办此培训以便用户充分做好准备。
例如，我们计划扩展部署对电话系统的一项重大升级。虽然我们的用户可以继续像现在这样通过 Outlook® 访问他们的语音邮件，可是他们使用的软件却正在发生变化。我们计划举办一次培训课程，其中电话系统供应商会向用户演示新界面，让用户在实际扩展部署前提问。
培训也会涉及到用户现在面临的一些现有问题。如果您已经在问题记录系统上花了一些时间，就会很清楚存在哪些问题。例如，有个用户不明白为何两个单独的系统必须使用两个不同的密码。只有该用户亲眼见到 PowerPoint® 幻灯片演示过程才能恍然大悟，否则任何口头解释都没有用。
根据经验我发现，无论特定的主题是什么，免费的食物与和谐的气氛都是会议成功的关键。为用户创造一个轻松的提问氛围，即使是最简单的问题。
我的第二个技巧是多在办公室中转转。每天，我都会抽出 10 或 15 分钟和用户在一起。如果发现有人用异常的方式执行任务，我会停下来和她讨论一下她正在执行的操作和出现此情况的原因。通常，我会给她提供一种更为简单的方法。例如，有个用户经常会不经意间重新排列他的 Outlook 工具栏，却不知道如何解决此问题。他一直遭受此问题的困扰却不提出来，直到有天我发现了这种情况。于是我向他演示了如何更改工具栏，以后再遇到这种情况，他就可以将工具栏还原为首选方式。
其他用户可能有其他的问题，而由于各种原因，他们不愿向服务台或技术支持小组提出。有些人可能是因为不好意思，认为自己的问题太愚蠢不值得引起 IT 人员的关注。另一些人则只顾使用键盘或鼠标，没意识到 IT 人员随时会替换备件。通过和用户短暂的沟通就可以解决好多问题，而且会提出许多新的想法作为下次的培训内容。（还要记住免费食物是必不可少的。）
请切记在您工作的方方面面都要考虑到用户。至少您对系统、策略和程序所做的大多数（如果不是全部）更改都会对用户造成影响。每个用户都是独一无二的，因此他们对这些更改会有不同的反应。
通常，让技术精湛的我们去指导不懂技术的用户是很困难的。但是只要拥有一定的耐心和一些用户培训技能，您就可以使用户像您一样喜欢上计算机。当然，这要慢慢来。

Michael Dragone是一位系统工程师，在纽约的一家产权保险公司任职。他是一位 Microsoft 认证操作系统技术支持工程师和 Microsoft 认证信息系统工程师。工作之余，他喜欢沿着海滩散步、逗狗，或者完全修补服务器。


 Windows 机密: 已知的 DLL 平衡行为
Windows 机密
已知的 DLL 平衡行为
Raymond Chen

Windows “已知的 DLL”（非正式名称）的功能指由内核的模块加载器进行特殊处理的 DLL（动态链接库）列表。当加载器发现具有指向已知的 DLL 的加载时动态链接的程序时，就会立即使用已知的副本，而忽略通常情况下应用于模块加载的搜索算法。有人可能会将其视为一种安全功能（尽管无可否认是相当弱的安全功能），但实际上，该功能的作用并非是保障安全。实际上，已知的 DLL 确实与性能密切相关。
已知的 DLL 功能结构已随时间的推移发生了改变。在某些版本的 Windows® 中，内核使用已知 DLL 列表作为起点，然后查看这些已知 DLL 链接到的所有 DLL，接着查看这些 DLL 链接到的所有 DLL，依此类推。此过程构建了所有依赖关系的传递闭包，并且将其全部视为已知。在其他版本的 Windows 中，并未构建此传递闭包；而是仅将明确列为已知的 DLL 视为已知。在某些版本的 Windows 中，已知 DLL 在系统开始时已通过内核预加载；在其他版本中，不会发生预加载，并且内核仅使用列表来避免搜索 DLL 路径。
不仅仅是已知的 DLL 列表的解释在更改版本，KnownDLLs 注册表项的内容也随之更改。Windows 性能团队不仅更改了已知 DLL 的列表，还基于他们对应用程序如何使用 Windows 的理解更改了列表转换为一组 DLL 所依据的规则。这在设计方面很典型，它是一场权衡游戏。在系统启动时预加载已知的 DLL，可允许使用这些 DLL 的应用程序更快地启动，但这是有代价的。启动系统所花费的时间会加长，而且内存使用量会增加，因为无论是否实际使用了这些 DLL，它们都会保留在内存中。这是一个以其他组件为代价来提高某些组件的性能的游戏。达成适当的平衡是一项艰难的任务，但是正如您所见，随着使用模式的发展，它正在不断优化。
使用已知 DLL 的一个结果（可能不太明显）是已知的 DLL 优先于本地重定向 DLL（在本专栏的 2007 年 1 月版本中，我们介绍了本地重定向的 DLL）。如果考虑一下，您可能会发现这实际上不是突发事件，而是意料之中的事。毕竟，已知 DLL 列表的目的是要绕过搜索路径从而加快 DLL 加载。如果内核必须检查本地重定向的 DLL，那只会减慢进程。您可能认为仅将一个目录添加到搜索路径不会是大问题，但是当该目录可能指向跨越全球一半的网络服务器时，即使添加一个目录也可能消耗巨大的性能。
不管您是否相信，我们已经发现了依赖特定已知 DLL 的程序。在应用程序目录中，有一个包含名为 Version.dll 的文件的程序。常规情况下，Version.dll 的专用副本将覆盖系统目录中的副本；但在 Windows XP 中，已将 Version.dll 列为已知的 DLL。这意味着将忽略应用程序目录中的副本，而使用系统目录中的版本。
在 Windows Vista® 中，Version.dll 不再被列为已知的 DLL，可能是由于性能专家确定应用程序使用它并不足以节省成本。因此，在 Windows Vista 中停止了使用此程序，因为该应用程序实际上依赖于忽略 DLL 的内核，而该程序又将 DLL 安装在自己的应用程序目录中。此程序故意将 DLL 安装到搜索路径上，然后依赖 Windows 忽略它！当然，如果希望 Windows 忽略某个文件，更有效的机制是事先不安装该文件。意外的是，编写该程序的公司提出了一个 bug，声称他们发现了安全漏洞。

Raymond Chen的网站“The Old New Thing”和同名书籍 (Addison-Wesley, 2007) 讨论了 Windows 的历史和 Win32 编程。他醉心于工作，对生活细节毫不在意。