June 2008 June 2008
安全性: 精彩辩论：通过隐匿性来实现安全
通过隐匿性来实现安全涉及采取不删除攻击平台而是隐藏攻击平台的措施。一些人认为这种做法并不好，而其他人则声称大型策略的每个小细节都很重要。这次辩论相当激烈，我们的一些顶尖安全专家激励争论，解释通过隐匿性来实现安全，双方的争论僵持不下。 Jesper M. Johansson and Roger Grimes
安全性: 针对 Windows Vista 的新提升 PowerToy
Michael Murgolo 又推出了他的更新版提升 PowerToy。其中包含增强的可用于运行第三方脚本工具的“以管理员身份运行”功能，此功能可取代 Windows Vista 中已不再提供的一项便捷的 Windows XP 功能，还包含许多其他有用的工具。 Michael Murgolo
安全性: BitLocker 驱动器加密中的改进
Windows Vista SP1 和 Windows Server 2008 对 BitLocker 进行了重大更改，现已支持数据卷，并针对加密攻击改进了保护功能。Byron Hynes 将介绍这些新增功能，演示如何在服务器上使用 BitLocker，并讨论最近与 BitLocker 相关的一些媒体报导。 Byron Hynes
安全性: 使用软件限制策略锁定应用程序
应用程序锁定可避免出现与不受支持的应用程序相关的 IT 问题，从而帮助您大大降低组织中台式计算机的总体拥有成本。了解如何使用软件限制策略和组策略来控制在整个 IT 基础结构中运行的应用程序。 Chris Corio and Durga Prasad Sayana
安全性: 管理 Windows Vista 防火墙
Windows Vista 防火墙的最新更新提供了一些令人印象深刻的新功能，使它成为企业环境无法抗拒的首选。Jesper Johansson 将简要概述 Windows 防火墙的发展历程，并深入探讨管理员想进一步研究的增强功能，如新的规则和配置文件、域隔离以及加密。 Jesper M. Johansson
安全性: 使用数字证书保护电子邮件的安全
“安全多用途 Internet 邮件扩展”允许您隐藏正在传输的信息、验证发件人，并对消息进行身份验证。了解如何使用数字证书保护电子邮件的安全，以及如何解决您可能在 S/MIME 系统中遇到的问题。 Matt Clapham and Blake Hutchinson
Columns
编辑寄语: 精彩辩论: | 读者来信: 读者心声: | 工具箱: 面向 IT 专业人员的新产品:
SQL 问题与解答: I/O 错误、数据库镜像及更多内容: Paul Randal 将回答您在 SQL Server 方面的问题，为您介绍如何在测试数据库中创建损坏、帮助您避免陷入“收缩-增长-收缩-增长”的循环，并说明如何确定在保证性能的前提下最多可镜像多少个数据库。Paul S. Randal | 实用程序特别推荐: Windows Vista 升级顾问: 准备好将组织中的系统升级到 Windows Vista 了吗？了解 Windows Vista 升级顾问如何帮助您确定系统是否已准备好升级到 Windows Vista 以及您的系统支持哪些版本。Lance Whitney | 深入剖析 Sharepoint: 分散的网站管理: 了解如果将 SharePoint 网站的管理控制委派给各个部门，同时维护 SharePoint 基础结构的集中式管理控制，会带来什么好处和影响。Pav Cherny
Windows PowerShell: 前景看好: 了解如何使用 Windows PowerShell 面向对象的属性在其输出中应用格式。Don Jones | 您好，脚本专家！: 不太辛苦的工作照样也有回报: 脚本专家辛勤、快乐地工作并将数据以可读的表格格式输出到命令窗口。The Microsoft Scripting Guys | 桌面文件: 安全性与符合性: IT 专业人员经常发现自己的各项目标相互矛盾。了解一下符合性通常是如何以安全性为代价的。Wes Miller
IT 业务: 成为环境领导者的十大要素: 由于 IT 部门在企业环境努力成果中起着越来越重要的作用，IT 专业人员正在力求变革并成为其公司和行业的思想领导者。下面简要介绍了如何成为组织中有关环境和可持续发展的有效思想领导者。Michael Walsh and Eliza Walsh | 领域备注: 共享分割屏幕: 分割屏幕由 Microsoft 印度研究中心研发，允许两个用户在各自运行单独的操作系统实例时共享一个显示器。Kentaro Toyama | Windows 机密: 史上最糟糕的两台 PC: Raymond Chen 轻松追忆了使用有史以来最糟糕的两种电脑的情形。Raymond Chen


安全性
精彩辩论：通过隐匿性来实现安全
Jesper M. Johansson and Roger Grimes
概览:
  • 定义通过隐匿性来实现安全
  • 评估通过隐匿性来实现安全措施
  • 评估重命名管理员帐户的价值
  • 制定明智的风险管理决策

“通过隐匿性来实现安全”这种说法经常遭到安全性人员（特别是那些喜欢以专家自居的人）的嘲笑。他们对此不屑一顾，认为很愚蠢。
根据 Wikipedia (en.wikipedia.org/wiki/Security_through_obscurity) 的注释，通过隐匿性来实现安全体现了安全性真正有争议的一个方面。您经常可以看到一些人遭到嘲笑，他们的努力被否定为“只是通过隐匿性来实现安全”。
简而言之，通过隐匿性来实现安全违反了 Kerckhoffs 原理，该原理认为应该靠系统的设计来确保系统安全性，而不是让攻击者无法知晓系统的设计来确保系统安全性。Kerckhoffs 原理的基本前提是秘密迟早会被揭开。
Windows NT® LAN Manager (NTLM) 身份验证协议就是一个很好的例子，该协议最初被认为是设计机密。为了对基于 UNIX 操作系统实施 Samba 互操作性产品，Samba 小组不得不对该协议进行反向工程。结果导致有关 NTLM 最完备的文档全部泄露 (monyo.com/technical/samba/translation/ntlm.en.html)，同时也发现了许多错误。由于加密产生了太多安全性问题，并且很多机密设计也被揭示，因此很多安全性实践人员都认为所有信息安全性都应遵循 Kerckhoffs 原理。
但通过隐匿性来实现安全总是有害吗？在这篇文章中，我们会解释什么是通过隐匿性来实现安全，阐述为什么许多人认为这是浪费时间（另外一些人则不以为然），并向您说明为什么答案总是比最初看起来要复杂得多。

通过隐匿性来实现安全简介
Steve Riley 的观点：不要更改默认设置
对于重命名问题，我的观点是“不要更改”。这实际上不是安全性问题，而是系统管理问题。随着我在研究系统管理空间上花费的时间越来越多（因为管理和安全性已成为一体），就越来越反对进行任何有可能增加系统易受攻击性的操作。更改默认设置就是这样一种肯定会增加易受攻击性的方法。人们更改默认设置的原因有两个（喔，确切地说是三个）：
  • 通过更改可以实现某种已知的功能。
  • 认为更改可以提高安全性。
  • （警告：这是非常愚蠢的行为。）有人在杂志文章中看到过这方面的内容。
如果您基于第一个理由需要更改默认名称，完全可以这样做。这类更改通常很少造成系统不稳定，因为它们先前已经过测试。
如果您是基于第二个理由更改默认设置，请三思而后行。这些类型的更改几乎从未经软件制造商测试过，因此制造商无法预测更改后系统会有什么反应。此外，一般来说，还有更佳的替代方案可以为您提供真正的安全性。
如果攻击者刚好知道帐户名称，那该怎么办呢？这时只能靠密码和密码强度来保护系统。极力把管理员和来宾等默认帐户名称更改为不易猜测的内容，实际上往往是想逃避使用强密码和密码短语。解决真正的问题（不安全的密码），才可以避免受到攻击（更改默认名称）。

这里讨论的通过隐匿性来实现安全，并不包括对缓解问题完全没有任何实质作用的措施。例如，如果某组织在边界路由器处禁用了网络新闻传输协议 (NNTP) 以防止员工阅读新闻组，但是却允许出站 Secure Shell (SSH)，则不算是通过隐匿性来实现安全。因为 SSH 允许通过每个协议，所以问题很明显；实施的愚蠢缓解措施除了防止合法用户在不违反安全性策略的前提下完成合法任务外，没有任何意义。这样的措施不算是通过隐匿性来实现安全；它们只是愚蠢的做法，没有任何意义。
正如“通过隐匿性来实现安全”这种说法中的“安全性”所暗示的那样，您应该确实可以从这种措施中得到保护。然而，同时也暗示了实际上您并未采取任何措施来阻止对一个或多个平台的攻击，这也是问题所在。（攻击平台实质上是攻击者访问系统所采用的一种方法。）
例如，假定您有一个易受攻击的 Web 服务器，可以通过 TCP 端口 80 利用公开漏洞对此服务器进行攻击。要堵上这个漏洞，您可以修补 Web 服务器或者将其关闭；其中任一操作都将完全停止此平台。通过使用防火墙或 IPsec 来关闭除几台选定计算机之外的所有计算机的端口 80，可以在某种程度上停止攻击平台。此操作不能完全阻止攻击平台，但是可以极大地缓解问题。
另一方面，通过隐匿性来实现安全需要采取不停止攻击平台而只是隐藏它的措施。例如，您可以将 Web 服务器移动到端口 81 而不是端口 80，以便只有知道 Web 服务器所在位置的人才可以找到它。这也是争论焦点。实际上，将 Web 服务器移动到端口 81 只能停止一些攻击，主要还是给最终用户带来不便。强大的入侵者只需对大量端口运行端口扫描程序和 Web 标志获取程序即可发现位于非标准端口上的 Web 服务器。只要找到一个，就可以对服务器进行攻击，因为您实际上并未消除攻击平台，只是（临时）隐匿它而已。
这是否意味您根本不应该尝试？这要具体问题具体分析。与“信息安全性”领域的所有其他方面一样，全都与风险管理息息相关。为了理解要考虑的关键因素，我们将快速了解一下更多通过隐匿性来实现安全的措施，然后详细讨论其中一项 — 重命名管理员帐户。

评估安全策略
通过隐匿性来实现安全的例子很多。它们可以是系统和网络管理员采取的措施，也可以是由软件开发人员启动的操作。然而，它们的共同点都是通过对潜在攻击者隐藏漏洞来缓解问题。
这些做法难道一点好处也没有吗？断定通过隐匿性来实现安全都有害真的公平吗？对于其中一些措施，您肯定会找到支持者。例如，在 Windows® 的 Windows 资源管理器中隐藏驱动器名。许多环境，尤其是学校的计算机实验室，使用此技术防止用户将数据保存到硬盘驱动器。当然，多数应用程序能仍然可以将数据保存到隐藏的硬盘驱动器，因此它不能作为最终安全性措施。然而，实施这种措施的机构经常宣称它减少了硬盘驱动器中的数据。
Windows 上经常实施的另外一种类型的通过隐匿性来实现安全是关闭管理网络共享（如 C$，Admin$，等等）。这被认为可以防止攻击者从远程连接到计算机。实际上，这不仅不正确，而且，一旦攻击者知晓可使用管理共享的帐户，就可以从远程重新启用那些几乎完全相同的共享。但是许多组织却坚称禁用这些共享可以减少网络上出现的恶意软件。
对于这种把精力错放的情况，我们最津津乐道的一个示例便是 Windows 中的“允许在未登录的情况下移除”设置。如果将其设置为禁用，则将对登录屏幕隐藏“移除计算机”按钮。实施者认为这样可以防止攻击者轻松地移除计算机。当然，任何入侵者都可以轻松地将计算机和基座一同塞到袋子里带走，无论那个按钮是否可见。这种可能性甚至与通过隐匿性来实现安全毫无关系。
另一明显的示例是“允许服务器操作者安排任务”设置，顾名思义，此设置允许作为 Server Operators 组成员的用户安排任务。这是个敏感的问题，因为此类任务可以作为“本地系统”运行，并且应该只有管理员才能安排作为“本地系统”运行的任务。当然，服务器操作员可能会通过各种途径使其成为管理员，因此通过这种方式阻止系统操作员安排任务也没有多大价值。
然而许多组织喜欢此设置，因为它允许工程师作为服务器操作员而不是管理员，这意味着他们不太可能意外地损坏服务器。这本身多少有些好处。
那么结论是什么？很明显，这些问题当中有些可能非常复杂。我们花费了很多时间愉快地讨论这些类型的措施。Roger 坚定地认为这类做法有价值；Jesper 则深信大多数情况这些措施只是在浪费时间。我们来探讨一下通过隐匿性来实现安全的其中一个最常提及且最有争论的案例：重命名管理员帐户。Roger 支持此措施，Jesper 则反对。安全性方面的知名人士 Aaron Margosis 和 Steve Riley 也以辩论双方参加了这场有关“重命名管理员帐户”和“不要更改默认设置”的讨论。

隐藏管理员帐户
安全性专业人员常常建议将重命名管理员帐户 — 相对标识符 (RID) 500 — 更改为一般人不知道的名称，很多 Microsoft 强化指南中也提倡这种做法。组策略甚至包括重命名管理员帐户的设置，如图 1 所示。其理论基础是：如果重命名了管理员帐户，则攻击者就很难以真正的管理员身份登录。当然，使用组策略进行此操作的问题很明显，那就是经过重命名的管理员帐户在应用此组策略对象的每台计算机上都具有相同的名称。这无疑降低了该特定安全性措施的隐匿性价值。
图 1 重命名管理员帐户
图 1 重命名管理员帐户 (单击该图像获得较大视图)
在这里必须指出：任何使用合法帐户的用户都可以检索管理员帐户的名称，无论该帐户是否经过重命名。管理员帐户的 RID 始终为 500。只要直接搜索 RID 为 500 的帐户名称，任何拥有帐户的用户都可以看到它的真实名称，如图 2 所示。
图 2 查找重命名的管理员帐户
图 2 查找重命名的管理员帐户 (单击该图像获得较大视图)

Roger 的观点
我听到反对重命名管理员帐户的主要论据是：要将任何安全性主体帐户名称转换为相关安全标识符 (SID) 并找到它的 RID 非常简单，而且真正的管理员帐户的 RID 始终为 500。因此，如果攻击者可以很容易地将用户帐户名称转换为 SID/RID 组合，并找出 RID 500，实施攻击就太容易了！
但是事情并不那么简单。若要完成从用户帐户名称到 SID/RID 的转换，您必须具有访问 NetBIOS 或 LDAP 端口的权限。多数外围防火墙不允许通过 Internet 进行这种类型的访问，因此，除非攻击者完全绕过防火墙，否则他根本无法进行转换。此外，除了域控制器 (DC) 以外，Windows XP 以及更高的 Windows 版本并不能进行匿名 SID 转换。对于大多数面向外部的计算机（也就是风险最高的计算机），攻击者需要具有经过身份验证的凭据才能执行从名称到 SID 的转换。
因此，若要发动转换攻击，得绕过不少真正的深度防御障碍才行。即便攻击者克服了这些障碍，也不过是相当于这些帐户名称没有重命名。重命名管理员帐户只会提高安全性，而没有什么实质性的坏处。
另外一个秘密 如果攻击者不知道管理员帐户名称，它就变成了另一个“秘密”标签，跟密码类似，攻击者必须要知道才行。不可否认，用户帐户名称显然那不太可能像管理密码一样复杂，但它仍是一道障碍，极大地增加猜测/破解密码问题的复杂性。如果您曾经进行过密码渗透测试，一定知道同时猜出用户名和密码并不容易。这相当于难上加难。
阻挠自动恶意软件和脚本黑客 我研究 Windows 安全性防御至今已有 22 个年头，过去 5 年来运行了八个公开在 Internet 上的 Windows 蜜罐 (honeypot)。这段时间内，我从来没看过自动恶意软件（绝大多数的攻击都是由此构成）使用除管理员（在 *NIX 系统中称为根）以外的任何用户帐户标签。如果您重命名了管理员帐户，则所有依赖管理员名称的恶意软件会立即失效。换句话说，等于降低了安全性风险。
对于脚本黑客，情况也一样。我所知的每本“畅销”的 Windows 入侵手册都提到了将名称转换成 SID 的方法，但要是我基于某种原因同时设置了一个“假”的管理员帐户来分散注意力，在蜜罐上就完全看不到这种情况。优秀的黑客应该随时确认他们找到的管理员帐户是真正的管理员帐户 (RID 500)，但他们通常忘了这一点。我也不清楚具体原因，但应该是由于黑客的懒惰和人的本性。
大多数专业人士也不进行转换 这令大部分人感到惊讶。只要执行蜜罐几年的时间，您就可以很快区分自动攻击、脚本黑客和专业人士之间的差异。过去五年以来，系统报告了上百万次对我的蜜罐的攻击，我却从来没看过专业人士在有假管理员帐户时进行 SID 转换。
我敢肯定某些专业罪犯会进行 SID 转换，但我同样敢肯定那只是极少数人，连我专门研究此类问题的人都从来没有遇到过。为什么专业人士不这么做呢？我猜是他们觉得绝大部分的人都不这么做，他们也没有理由这么做。
简化警报 现在另一方争议，如果重命名管理员帐户开始盛行的话，则可能会失去它作为隐匿方法的价值。争论在于恶意软件、脚本黑客和专业人员会改变一贯战术，寻找管理员以外的名称。言之有理。幸运的是，它并不会改变基本情况。首先，如果未将 Windows 超级权限帐户命名为 Administrator，恶意黑客就必须多下点功夫。事实就是如此，而且如果恶意黑客必须多下点功夫的话，他就更不可能采取这种攻击途径，从而其他弥补深层防御手段能够更快地检测到恶意活动。
这就谈到了我赞同重命名的最后一个观点。如果您的管理员帐户的名称从来不是 Administrator，而且您使用该名称创建了另一个帐户，如图 3 所示，您将拥有一个良好的警报机制。如果事件监视检测到有人尝试使用默认名称登录，则会立即调查该事件。
图 3 尝试以名为 Administrator 的引诱帐户登录可能是前期攻击行为
图 3 尝试以名为 Administrator 的引诱帐户登录可能是前期攻击行为 (单击该图像获得较大视图)
我们的事件日志中记录了大量没有任何意义的“不良”登录。这通常不过是指用户（或 Windows）使用错误的密码尝试登录等类似情况。不过，如果您的管理员帐户的名称为 Administrator，如何轻松分辨正常和恶意的登录尝试呢？如果您从来没有名为 Administrator 的登录帐户名，却检测到有人尝试使用该帐户名登录，则它可能是恶意登录。争议很少的早期警告在当今的防御环境下具有重要价值。

Jesper 反驳
Aaron Margosis 对重命名管理员帐户的论点
Jesper，在理想条件下，您绝对没有错。密码的安全级别足以抵御暴力猜测，而也只有在紧急恢复时才会使用 -500 本地管理员帐户。但在现实生活中，情况并非如此。
尽管您在宣传卓越安全性方面做出了很多努力，特别是您编写的密码短语系列太棒了（“精彩辩论：密码短语与密码”第 1、2 和第 3 部分，网址分别为 go.microsoft.com/fwlink/?LinkId=113157、go.microsoft.com/fwlink/?LinkId=113159 和 go.microsoft.com/fwlink/?LinkId=113160），许多系统管理员对怎样才是强密码的理解并没有更新。
不久前，从多个字符中随机挑出八个字符构成的密码还被视为强密码，而摩尔定律证明这种情况维持不久。用户（和系统管理员）教育的欠缺是罪魁祸首，而且未来很有可能还是如此，这恐怕到密码强度成为有线电视新闻频道的热门话题时才会有所改观。
所以，假设现在猜测密码不会花费 6000 亿年的时间，通常在午餐时间即可完成，那么，我们将这段时间乘以 1000，显然时间就够长了！与许多以 Administrator 帐户为目标的自动攻击相比，将帐户重命名可使它不易受到攻击。
您可能已经注意到，重命名管理员帐户一般只需投入极少的时间和精力，它只是一项简单的 GPO 设置。事实上，美国政府的联邦桌面核心配置（Federal Desktop Core Configuration，csrc.nist.gov/fdcc）要求必须重命名 -500 帐户。重命名不过是许多必要的设置之一，而且不会花费太多的时间或精力。也没有人过高估计重命名的安全性意义 — 我还没听过有人这么说：“我们不需要补丁管理，因为我们已经重命名了管理员帐户”。
如果整个组织中将帐户重命名为相同的名称，重命名还有意义吗？意义不大，但多少还是有一点：首先，它会阻止以 Administrator 为目标的自动攻击；其次，潜在攻击者未必知道新名称。（当本地管理员帐户 — 无论是否经过重命名 — 在组织内共享公用密码时，风险更大。管理这些密码一直比较棘手，也比较重要。禁用 -500 帐户是解决这种问题的办法之一，但是这在无法使用域帐户时会封锁重要的恢复渠道。）我还要指出，我们的安全指南长期以来就建议重命名默认帐户，因此这种做法不仅经过测试，而且完全受支持。
到目前为止，我们应该都知道隐匿式措施本身所构成的防御并不充足。但它们可以强化其他安全措施，并且 Roger 的数据也清楚地阐明了这一点。只要实施的成本不高，组织就不应该把它们排除在外。

与支持重命名一样，反对重命名管理员帐户也有根据。不过，在继续讨论之前，我必须承认 Roger 的最后一个论点蛮有效力的。但是，在高度托管的环境中，应该调查任何使用管理员帐户的登录，因为除了紧急恢复的情况之外，完全不应该使用该帐户。
多此一举 重命名管理员帐户应当缓解的主要风险是有人从远程猜测它的密码。但重命名管理员帐户只会阻止在计算机上没有其他授权帐户的用户。这类攻击者通常会尝试一连串随机的密码登录管理员帐户。不过，无论攻击者是猜错帐户名还是猜错密码，都会收到相同的错误消息。
这就表明重命名管理员帐户的主要论据之一（脚本黑客会放弃）并不完全正确。他们并不会因为管理员帐户经过重命名而比使用原始名称时消失得更快，因为他们无法分辨！无论如何，他们猜测的都是一组相同的随机密码，然后继续攻击下一个对象。
这表示只要管理员帐户密码的安全级别足以击退攻击，重命名帐户就没有更多意义了。假设管理员帐户的密码包含 15 个字符，由从整个键盘挑选出的大小写字母、数字和符号组成。通过网络猜测该密码大概需要 591,310,404,907 年的时间。呵呵，比宇宙存在的时间长 43 倍。
现在，假设我们对管理员帐户进行重命名，将其命名为 1,000 个可能的值之一。这样一来，我们可将猜测密码的时间延长到 591,310,404,906,787 年，即比宇宙存在的时间长 43,161 倍。这样就比较安全吗？当然，我们安全多了。我们降低了攻击者猜测我们的密码的可能性吗？嗯，根本没有。换句话说，无论是否更改管理员帐户名，被攻击者猜测的可能性是一样的。重命名帐户会抵御尝试使用该帐户名的恶意软件，但不重命名帐户未必就会让恶意软件得逞。事实上，如果您使用强密码（您应该这么做），无论帐户名是什么，都可保证它不会得逞。
很明显，许多安全指南要求重命名管理员帐户，但这并不表示它就是有意义、甚至是有效的安全措施。它只是妨碍了您对安全性做出适当的风险管理决策。安全指南通常要求进行没有什么意义的设置，而且在许多情况下，甚至要求进行根本不存在的设置。最后，要在安全性领域中稳定前进，我们必须突破安全指南要求的限制，实际分析问题，然后评估缓解措施是否有意义。在此，要特别注意一点 — 攻击者以功能为目标本身并不足以构成修改该功能的充分理由。只有在不修改功能会使攻击得逞的情况下，才应修改功能。
如果设有强密码，那么无论是否重命名帐户，攻击成功的可能性实际上为零。因此，只要您设置强密码，就没有特定的安全性理由需要重命名帐户。此外，如果您像我一样认同“对计算机所做的调整和更改越少，计算机越稳定”这一原则，则不对管理员帐户进行重命名才是更合理的。
将注意力转移到低价值缓解措施上 通过隐匿性来实现安全的低价值缓解措施存在一个问题，就是它们可能会转移组织对高价值缓解措施的注意力。例如，在重命名管理员帐户上投入大量时间和精力后，就不能执行其他操作了。如果其他操作比重命名管理员帐户更有意义，则组织就错失了一次机会。听起来好像实际上不需要这样的代价，然而想象重命名 50,000 个管理员帐户，您就会开始产生这种想法。
更糟糕的是，一旦实施低价值缓解措施，组织的领导便会停下来休息，这种可能性非常大。管理层不一定始终能了解通过隐匿性缓解措施来实现安全的意义非常小，因此可能不再采取其他措施。这实际上为组织带来另一个重大风险，只要管理层花费一些时间和精力来了解实施的缓解措施的意义，即可在很大程度上避免这种风险。
高管理成本 最后，根据缓解措施的实施程度，管理成本可能会变得相当大。如果只是通过设置组策略对象 (GPO) 来重命名管理员帐户，则成本非常低。每个人都将知道此名称，因此部署成本几乎为零。然而，它却没什么意义，如上所述，每个拥有帐户的人都会知道此名称。因此，要真正实现此缓解措施的价值，需要对不同的主机使用不同的名称，这样管理系统的成本就会非常高。
使用类似 passgen (protectyourwindowsnetwork.com/tools.htm) 的工具对网络上的所有管理员帐户设置 100 个字符的完全随机密码并使用不同的帐户进行日常管理的效果可能会更好。考虑到管理员帐户专用于灾难恢复（Windows Small Business Server 2003 除外），这对网络管理系统不会产生任何影响。此外，攻击者正确猜测出任意管理员帐户的密码简直比大海捞针还难。设置独特的强密码最能保护系统，让脚本黑客一直猜密码去吧！

归根结底为风险管理
实际上，任何隐匿式安全措施都可以按照我们此处提供的方法进行分析。任何方案都各有利弊，适合于某个组织的正确方法不一定适合其他组织。最后，这就成了风险管理问题。风险是否超过了实施解决方案的成本？在保护信息资产方面做出的每个决策都必须是明智的风险管理决策，很少是选择黑或白这样简单的决策。
的确，已经为您做出了一些决策。例如，您当然可以选择不加密信用卡信息或存储信用卡验证代码，但这样可能让您的信用卡很快被别人破解和透支！风险太大，所以您别无选择，只能对这些信息进行加密。换句话说，这当然也是一项风险管理决策，只不过非常容易做出罢了。
同样，任何一个头脑清醒的人都不会将开放式无线网络连接到物理存储中存储网络的后端。但这并不表示此决策不是风险管理决策。它是。一个人可以选择这样做，并且如果真的做出了这样的选择，他应该承担后果（很遗憾，后果总是无人承担）。
在此，关键是清楚地表述您需要解决的问题、问题的建议解决方案以及每种方案的利与弊。然后，即可获得做出明智的风险管理决策所需的信息。如果没有这些信息，则只能凭直觉做出决策，这样的决策往往很糟糕。

Jesper M. Johansson 是研究安全软件的软件架构师，还是《TechNet 杂志》的特约编辑。他拥有管理信息系统博士学位，具有 20 多年安全方面的经验，并且是企业安全性领域的一位 Microsoft MVP。Jesper 的最新著作是《Windows Server 2008 安全资源工具包》。
Roger Grimes （CPA、CISSP、MCSE：安全性），Microsoft ACE 团队的高级安全顾问，已经编写或与人合著了八本计算机安全性方面的书籍，并且撰写了 200 多篇杂志文章。他经常在安全性会议上演讲，并且是 InfoWorld 安全性方面的专栏作家。
© 2008 Microsoft Corporation 和 CMP Media, LLC。保留所有权利；未经允许不得复制本文的部分或全部内容.


安全性
针对 Windows Vista 的新提升 PowerToy
Michael Murgolo
概览:
  • 以管理员身份运行第三方脚本工具
  • 以其他用户身份运行
  • 以系统身份在此处打开 CMD 提示符和 Windows PowerShell 提示符
  • 拖放式提升小工具
下载本文中所用的代码: Elevation2008_06.exe (197KB)

欢迎使用针对 Windows Vista 的新提升 PowerToy 的另一个版本。在 2007 年 6 月的《TechNet 杂志》期刊中，我曾详细介绍过它。现在已经过去一年了。此次，我要向您展示如何将“以管理员身份运行”功能应用于
我喜欢的一些第三方脚本工具，并演示如何取代 Windows Vista® 中已取消的一项便捷 Windows® XP 功能，另外介绍提升 PowerToy 中提供的一些便捷工具。

以管理员身份运行其他脚本工具
在上一篇文章（网址为 technet.microsoft.com/magazine/cc162321.aspx）中，我曾介绍过针对本机 Windows 脚本工具启用“以管理员身份运行”选项的主题。在本文中，我为一些第三方脚本工具创建了“以管理员身份运行”PowerToy：
  • AutoIt v3 (www.hiddensoft.com)
  • AutoHotkey (www.autohotkey.com)
  • ActivePerl (www.activestate.com)
  • KiXtart 2010 (www.kixtart.org)
上述每个工具的代码都包含在本文的下载中，可在 technetmagazine.com 中找到。实际使用的文件名分别为 ElevateAutoIt3.inf、ElevateAutoHotKey.inf、ElevatePerlScript.inf 和 ElevateKiXtart.inf。对于 AutoIt v3、AutoHotkey 和 ActivePerl 而言，安装过程非常简单。只需下载相应的应用程序并将其安装在默认位置即可。安装所需的应用程序后，即可为每个工具安装合适的“以管理员身份运行”PowerToy。
遗憾的是，KiXtart 2010 没有提供安装程序。因此，为确保将 KiXtart 安装到标准位置以使我的 PowerToy 正常工作，我提供了一个 INF 文件，此文件用于将 KiXtart 2010 (v 4.60) 安装到 Program Files\KiXtart 下，并注册 .kix 文件扩展名。
请访问 www.kixtart.org/?p=downloads 下载 KiX2010_460.zip，并将其解压到某个文件夹中。将 Install_KiXtart.inf 文件（包含在本文随附的代码下载中）复制到同一文件夹下。然后右键单击 Install_KiXtart.inf 并选择“安装”。这样，您就可以轻松安装 ElevateKiXtart.inf PowerToy 了。

“以其他用户身份运行”PowerToy
创建用户帐户控制 (UAC) 后，用户（甚至是管理员用户）可以使用标准用户权限运行大多数应用程序，从而使操作系统不易被恶意软件破坏。UAC 可以提升管理任务及其他应用程序功能。右键单击可执行文件可找到“以管理员身份运行”选项，通过该选项可实现这种提升。我在 2007 年 6 月刊中讨论的提升 PowerToy 扩展了此项功能，使其可用于其他文件和对象类型。
此功能内置于 Windows Vista 中，对于许多管理任务而言，它确实很有效。但是，Windows Vista 忽略了一种重要情形。许多 IT 部门有这样一项策略：网络管理员使用一个用户帐户执行日常任务（使用电子邮件、创建文档等），而另一个帐户专用于网络管理（或本地计算机管理）。
这样一来，如果网络管理员在执行日常任务时不慎运行了恶意软件，则不会危及整个系统（或管理员所在的域），从而可降低风险。在 Windows XP 上，这可以使用“以...身份运行”右键单击选项实现。但是 Windows Vista 中已取消此选项，而由“以管理员身份运行”选项取代。
不过，Windows Vista 中保留了 runas 命令行工具。遗憾的是，此工具无法用于最常用的双帐户任务 — 运行 Microsoft® 管理控制台 (MMC) 管理单元。例如，假设已委派您在 Active Directory® 中执行一些帐户管理任务。您正在以标准用户身份执行日常任务，并且您的网络管理帐户也是启用了 UAC 的 Windows Vista 计算机上本地管理员组中的一个成员（这样您可以根据需要安装网络管理工具）。现在，您要使用您的 Active Directory 管理帐户启动 Active Directory 用户和计算机 (ADU&C)，并尝试使用 runas 命令，如下所示：
runas /user:mydomain\admin
"mmc.exe %windir%\system32\dsa.msc"
遗憾的是，这并不能启动 ADU&C。您会收到一条 runas 错误，显示“请求的操作需要提升”。此时，MMC 可执行文件被标记为以 highestAvailable 权限级别运行。您的网络管理帐户的 highestAvailable 级别是管理员，因此以这种方式启动 ADU&C 需要提升；而 runas 不会引发提升提示，所以就发生了此项错误。
由于 Windows Vista 既没有提供“以...身份运行”上下文菜单项，也没有提供能够以需要提升的其他用户身份运行进程的内置方法，要解决此情形中出现的问题就很困难。
如果没有针对此情形的解决方案，本文会让人感到非常沮丧。幸运的是，我的一个原始的提升 PowerToy 就为解决第二个问题提供了关键的切入点；而关于第一个问题，我已经找到了另一种解决办法。（此解决方案是 Windows AppCompat 团队的 Gov Maharaj 发现的，我可不敢将这份功劳据为己有，呵呵！）
这就证明了提升命令 PowerToy 可以与 runas 命令一起使用。上一个命令无法引发提升提示，但以下命令就可以：
runas /user:mydomain\admin
"elevate mmc.exe%windir%\system32\dsa.msc"
这样，runas 就会以其他用户身份启动 elevate.cmd（从技术角度讲，正在启动的进程是 cmd.exe），而提升命令会使用提升提示启动 mmc.exe。
最后，我将此方法与针对 .exe 和 .msc 文件的文件关联结合使用，并提供了 HTML 应用程序用户界面以创建一个 PowerToy，使用该 PowerToy 即可创建通过右键单击菜单来启用的“以其他用户身份运行”选项。当选择“以其他用户身份运行”时，会出现如图 1 所示的 HTML 应用程序。
图 1 “以其他用户身份运行”工具
图 1 “以其他用户身份运行”工具 (单击该图像获得较大视图)
此处只需输入用户名和域（使用本地计算机上的帐户），选中“使用本地帐户”复选框。然后，您可以单击“运行”按钮以标准用户身份启动该应用程序，或者单击“以管理员身份运行”按钮使用提升权限启动该应用程序。单击上述任一按钮后，runas.exe 就会运行并提示您输入密码或智能卡 PIN。
此 PowerToy 要用到提升命令 PowerToy，所以需要首先安装它。然后右键单击 RunAs.inf 文件，选择“安装”，并批准提升。要卸载此工具，可使用“程序和功能”控制面板。
您会看到“管理工具”（如“计算机管理”）中的部分 .msc 文件快捷方式将使用此 PowerToy。但请注意，如果您使用 adminpak.msi 安装 Windows Server® 2003 管理工具，则创建的快捷方式不是 .msc 文件的标准快捷方式。此时将显示 Windows Installer 快捷方式，所以 Windows 资源管理器不会显示这些快捷方式的“以其他用户身份运行”选项。
对于这些快捷方式，您必须找到实际的 .msc 文件并且右键单击，或为 .msc 文件创建新的快捷方式。此外，runas 不适用于 Internet Explorer®，这是因为 Internet Explorer 针对 Windows Vista 中的保护模式进行了重新构建（在 support.microsoft.com/?id=922980 中可找到关于此问题的更多信息）。
备注：在完成这些 PowerToy 后到发表本文前的这段时间里，Windows Sysinternals 发布了一个新工具，其功能与我的“以其他用户身份运行”PowerToy 非常相似。此工具称为 ShellRunas，可从 Windows Sysinternals 的网站找到，网址为：technet.microsoft.com/sysinternals/cc300361。
因为 Sysinternals 的员工已编写了具体的代码，所以您可能更倾向于使用此工具。我决定将我的方法保留在本文中，作为一个示例，借以展示如何借助脚本代码使用 HTML 应用程序实现此特殊任务以及通常的 shell 扩展。

以系统身份在此处打开 CMD 提示符和 PowerShell 提示符
需要在本地系统上下文中运行程序的情况有多种。例如，多个软件分发工具（如系统中心配置管理器 (SCCM)）使用以本地系统身份运行的客户端代理完成任务时。
要在尝试使用 SCCM 等产品进行分发前测试以本地系统身份运行的软件安装程序的行为，使用以本地系统身份运行的命令提示符启动此安装程序将非常有帮助。因此，我决定创建自己的“以系统身份在此处打开 CMD 提示符”和“以系统身份在此处打开 PowerShell 提示符”PowerToy。
在使用 Windows XP 时，我经常使用命令 shell 脚本实现此类功能：
@echo off
sc create CmdAsSystem type= own type= interact
binPath= "cmd /c start cmd /k (cd c:\ ^& color ec ^&
title ***** SYSTEM *****)"
net start CmdAsSystem
sc delete CmdAsSystem
但是，如果您尝试在 Windows Vista 上从提升命令提示符运行它，将出现以下错误消息，并且不会出现以系统身份运行的命令提示符：
警告：服务 CmdAsSystem 被配置为交互式服务，其服务不受支持。该服务可能无法正常起作用。
问题在于此脚本将尝试创建并启动一项交互式服务，但交互式服务由于 Windows Vista 中的会话 0 隔离而无法正常工作。（有关会话 0 隔离的说明，请参见 microsoft.com/whdc/system/vista/Vista_Services.mspx 中提供的“Windows Vista 中的服务”白皮书。）
为解决此限制，我使用了 Sysinternals 开发的 Psexec 工具（请参见 technet.microsoft.com/sysinternals/bb897553.aspx）。此工具允许在系统上下文中启动进程。遗憾的是，多数 Sysinternals 工具都未提供安装程序。因此，我提供了一个 INF 文件（包含在代码下载中），用于将整个 Sysinternals 套件（包括 Psexec）安装到 Program Files\Sysinternals Suite 下。它还有另一个好处，即此 INF 文件将为套件的图形工具创建开始菜单快捷方式。
要安装套件，首先要从 technet.microsoft.com/sysinternals/bb842062.aspx 下载 SysinternalsSuite.zip，并解压到某个文件夹。将我的 INF 文件 (Install_SysinternalsSuite.inf) 复制到该文件夹，右键单击 Install_SysinternalsSuite.inf，然后选择“安装”。因为这些新的 PowerToy 使用提升命令 PowerToy，所以接下来要安装它。然后，您可以安装 CmdHereAsSystem.inf 和 PowerShellHereAsSystem.inf。安装好这些 PowerToy 后，在 Windows 资源管理器中右键单击文件和驱动器的项目，即可显示“以系统身份在此处打开 CMD 提示符”和“以系统身份在此处打开 PowerShell 提示符”选项，如图 2 所示。
图 2 “以系统身份在此处打开 CMD 提示符”和“以系统身份在此处打开 PowerShell 提示符”选项
图 2 “以系统身份在此处打开 CMD 提示符”和“以系统身份在此处打开 PowerShell 提示符”选项
图 3 显示了以系统身份运行的 CMD 提示符。我选择使用亮色来表示此提示符正在以系统身份运行，如果输入了错误的命令，将对系统执行异常（并且具有破坏性）的操作。
图 3 以系统身份运行 CMD 提示符必须小心谨慎
图 3 以系统身份运行 CMD 提示符必须小心谨慎
最后，这些 PowerToy 会向系统添加一些命令，以便在“运行”对话框或 CMD 提示符中启动这些提示符。例如，从“运行”对话框中执行以下命令将在 Windows 文件夹中以系统身份启动 CMD 提示符：
cmdassystem "c:\windows"
Windows PowerShell TM 的等效命令是 psassystem。您应该已经注意到，我还修改了在此处以管理员身份运行 CMD 和 PowerShell 提示符 PowerToy，分别为其安装了类似的命令 cmdasadmin 和 psasadmin。

提升小工具
我的大多数 PowerToy 都要求单击鼠标右键。但此更新还包含一个有用的小工具。这是一个 Windows 边栏小工具，我把它称为提升小工具（如图 4 所示）。它是一个拖放式工具，只需从定义了 runas 操作的 Windows 资源管理器中拖动可执行文件或脚本，它们就会以已提升状态启动。
图 4 拖放式提升小工具
图 4 拖放式提升小工具
如果您安装了我以前提供的提升 PowerToy，那么本次更新将适用于 Windows Script Host 脚本、Windows PowerShell 脚本、HTML 应用程序和 Windows Installer 包及修补程序（以及 Windows Vista 中默认定义了 runas 操作的可执行文件和命令外壳脚本）。此外，您还可以一次拖动多个项目（只尝试向此小工具拖动一个文件夹，观察会发生什么）。
要安装这个小工具，请双击 Elevation.gadget（包含在代码下载中）。若要查看这个小工具的代码，只需在文件名中添加 .cab 扩展名即可。这样您就可以提取 CAB 文件中的内容了。

结束语
本文的下载不仅包含新的 PowerToy，还包含以前的文章中介绍的 PowerToy。我对原来的一些 PowerToy 做了一点改动。例如，原始的“在此处以管理员身份运行 Windows PowerShell Prompt”和“提升 WSH 脚本”都安装了各自的 elevate.cmd 和 elevate.vbs 副本。因为一些新的 PowerToy 也依赖这些文件，所以我对这些工具进行了更改，要求安装提升命令 PowerToy（这样它们就可以共享该副本）。要确定 PowerToy 是否要求安装提升命令 PowerToy，请查看 INF 文件的标题。
一些其他的原始 PowerToy 也进行了细微的非功能性更改。在安装最新版本之前，请务必卸载旧版的 PowerToy。由于此工具集现已扩展为包含 17 个工具，所以我提供了一些命令壳脚本以安装和卸载整个工具集（分别为 InstallAllPowerToys.cmd 和 UninstallAllPowerToys.cmd）。您可以对其进行自定义，使其仅安装和卸载所需的工具。
您应该记住，默认情况下 InstallAllPowerToys.cmd 不会为第三方脚本工具安装“以管理员身份运行”PowerToy。您可以修改此脚本使其仅为您安装了软件的第三方脚本工具安装那些 PowerToy。运行任一工具时，都将重新启动以提升自身。UninstallAllPowerToys.cmd 还会删除这些工具的所有旧版本。
与我的所有 PowerToy 一样，这是一些不受支持、风险自担的工具。它们也不是 Microsoft 官方产品 — 都是我个人开发的。这些产品只有我和其他几位志愿者在默认语言为英语的 32 位 Windows Vista 上进行了测试。最后，其中的部分或全部 PowerToy 可能不适用于将来的 Windows 更新版本、Service Pack 或操作系统版本。

Michael Murgolo 是 Microsoft Consulting Services 的一名高级基础结构顾问。他关注的领域包括操作系统、部署、网络服务、Active Directory、系统管理、自动化和修补程序管理。他是桌面部署和迁移领域的主题事项专家。


安全性
BitLocker 驱动器加密中的改进
Byron Hynes
概览:
  • BitLocker 增强功能
  • 获取和安装 BitLocker
  • 在服务器上使用 BitLocker
  • 完整数据保护的注意事项

在去年《TechNet 杂志》的安全专刊中，我简要介绍了 Windows BitLocker 驱动器加密中的一些功能，藉以演示如何在 Windows Vista 的最初发行版中实现该功能。现在，随着
Windows Vista® Service Pack 1 和新版 Windows Server® 2008 操作系统的发布，我们需要再次讨论 BitLocker®。
在本文中，我将介绍最新版本中涉及的一些更改，概述如何在服务器上安装并使用 BitLocker，并提到一些值得注意的近期要点报告。（此外，要阅读去年的文章“使用 BitLocker 驱动器加密以保护数据的密钥”，请访问 technet.microsoft.com/magazine/cc138009.aspx。）

新增功能
此 BitLocker 版本引入的更改带来了全新的灵活性，而且没有更改任何基本操作。我要讲述的更改包括：支持数据卷，允许对计算机访问进行三重身份验证，支持统一的可扩展固件接口 (UEFI)，适用于 64 位系统的新行业标准固件，能够更有效地防止针对卷元数据的加密攻击，以及受信任的平台模块 (TPM) 的增强用途。

数据卷
首次发布 Windows Vista 时，BitLocker 控制面板只允许对 Windows® 操作系统卷（通常是 C:驱动器）启用加密。对于大多数用户而言，此功能就已足够了，因为家庭计算机通常将用户的所有数据和程序与操作系统存储在同一个卷上。但在企业中通常却并非如此，更不用说服务器了。因此，客户最常提出的一个请求就是能够对数据卷加密。数据卷是指计算机上安装的除操作系统卷以外的卷（请注意，BitLocker 不适用于加密可移动媒体）。
如图 1 所示，我在此计算机上有三个可用的卷。（如果包括用于启动的小型活动分区，则实际上有四个。）我的操作系统安装在驱动器 C:（实际显示为带有 Windows“徽标”的图标）上，另外还有两个数据卷 E:和 P:。数据卷 P:已使用 BitLocker 加密，并且当前处于锁定状态。数据卷 E:尚未加密。在 Windows Vista SP1 和 Windows Server 2008 中，我可以使用 BitLocker 控制面板小程序加密和解除锁定这些数据卷。
图 1 Bitlocker 界面
图 1 Bitlocker 界面 (单击该图像获得较大视图)
如果已使用 BitLocker 对操作系统卷加密，则默认行为是在解除操作系统卷的锁定时，同时解除对加密的数据卷的锁定。如果使用控制面板解除对数据卷的锁定，您就可以看到此选项显示为一个复选框，如图 2 所示。
图 2 保存用于自动解除锁定的密钥
图 2 保存用于自动解除锁定的密钥 (单击该图像获得较大视图)
若要启用或禁用数据卷的“自动解除锁定”功能，请使用 manage-bde.wsf 命令行工具。Manage-bde.wsf 是 Windows 随附的一个功能强大的脚本，它使用随 BitLocker 一同安装的基础 Windows Management Instrumentation (WMI) 提供程序。
例如，若要标记数据卷 P:，使它必须以手动方式解除锁定，请使用以下命令：
manage-bde.wsf –autounlock –disable P:
若要再次启用 P: 的自动解除锁定，请使用：
manage-bde.wsf –autounlock –enable P:
BitLocker 控制面板并未显示使用 BitLocker 和数据卷可执行的所有操作，因此您应该使用 -?选项来探索 manage-bde.wsf 命令。manage-bde.wsf 语法在“Windows BitLocker 驱动器加密设计指南”和“Windows BitLocker 部署指南”中也有介绍，这两个指南可从 Microsoft 下载中心 go.microsoft.com/fwlink/?LinkId=115215 获得。

TPM+USB+PIN
客户也希望能够将其他身份验证要素与 BitLocker 配合使用。BitLocker 在您的计算机中使用 TPM 芯片以验证平台的完整性，即确定早期的启动组件（包括 BIOS）是否已被篡改或损坏。不过，自从 Windows Vista 发布以后，您现在还可以要求输入 PIN 或出示在启用 BitLocker 时创建的包含密钥的 USB 闪存驱动器。
现在借助 Windows Server 2008 和 Windows Vista SP1，您可以将上述三项结合使用。TPM 继续用于验证平台的完整性，USB 密钥代表“拥有的内容”，PIN 代表“知道的内容”。此配置提供了非常强大的防护功能，可防止未经授权的用户启动计算机和为受 BitLocker 保护的驱动器解除锁定。
不过就像在安全性中常见的情况一样，这也代表着取舍。显然，按这种方式配置 BitLocker 时，计算机将无法自动重新启动。以服务器为例，您必须决定哪个更重要：顺畅的重新启动还是更高级的保护功能。

UEFI 支持
在 Windows Server 2008 和 Windows Vista SP1 中，现已支持随附了统一的可扩展固件接口 (UEFI) 的计算机。UEFI 是一种规范，代表大多数计算机在启动时使用的传统 BIOS 的现代化。有关 UEFI 规范的详细信息，请访问 www.uefi.org。

增强的保护功能
当 BitLocker 检测到系统已被更改，或是启动时未提供必需的 PIN 或 USB 密钥时，BitLocker 将进入恢复模式。在恢复模式下，启用 BitLocker 的卷将保持锁定，并向用户显示一个称为恢复控制台的文本模式对话框。
若要解除对驱动器的锁定，用户必须使用键盘或从 USB 闪存驱动器输入恢复密码（一个包含 48 位的数字）。（如果是存储在 USB 闪存驱动器中，则此密码有时称为恢复密钥，因为它是二进制格式，而非文本格式。）
BitLocker 使用恢复密码解密存储在卷元数据中的密钥 — 卷主密钥 (VMK)，然后解密全卷加密密钥 (FVEK) 以解除对驱动器的锁定。若要成功完成恢复，必须有恢复密码的副本。
因此，除用户进行存储（如存储在 USB 闪存驱动器中）外，强烈建议您也集中存储恢复密码。操作系统提供了在 Active Directory® 域服务 (ADDS) 中存储密码的功能。
存储在卷元数据中的密钥（如 VMK）将进行加密，并且整个卷元数据的完整性将以加密形式予以保护。如果 BitLocker 检测到卷元数据已被篡改，它将拒绝使用任何元数据，并且不会解除对任何受保护卷的锁定。请注意，在此状态下仅使用恢复密码不能解除对驱动器的锁定。
我必须强调，这种情况只在计算机遭受蓄意的安全攻击时才会发生。如果发生这种情况，则您的计算机很可能已落入破坏者之手，而不再受您的控制。如果只是无意中更改了平台或忘记了 PIN，则不会引发这种情况。
若要解除对卷的锁定，您需要使用以下三个项目：
  • 恢复密码（可以是键入的文本，也可以位于 USB 闪存驱动器上）
  • 包含加密版本的 FVEK 和 VMK 的二进制密钥包
  • BitLocker 修复工具
简而言之，您需要确保您的企业始终能够访问上述所有项目。
恢复密码可以手动备份，也可以自动备份。建议使用组策略设置将恢复密码自动备份到 Active Directory 域服务。
当您配置此设置（如图 3 所示）时，需包括备份二进制密钥包的选项。二进制密钥包包括加密版本的 VMK 和 FVEK，允许您根据需要使用 BitLocker 修复工具。
图 3 配置组策略以在恢复信息中包含密钥包
图 3 配置组策略以在恢复信息中包含密钥包 (单击该图像获得较大视图)
BitLocker 修复工具设计用于帮助您从启用了 BitLocker 的损坏磁盘中恢复数据。请注意，这是一个高级工具，旨在供经验丰富的管理员使用。有关 BitLocker 修复工具的详细信息，请访问 support.microsoft.com/kb/928201 阅读 Microsoft 知识库文章，或观看我的网络广播“企业中的 Microsoft BitLocker：让生活更加轻松的 BitLocker 工具”（包括视频演示），网址为 go.microsoft.com/fwlink/?LinkId=114985。
在此，需明确指出 BitLocker 不能代替备份数据的需求。如果磁盘损坏或受到蓄意攻击，则 BitLocker 修复工具完全不能保证能够恢复任何数据，更不用说所有数据。

TPM 更广泛的用途
从技术上讲，这并不是一项 BitLocker 更改，但它非常棒，完全值得一提。在 SP1 之前，BitLocker 是 Windows 操作系统中唯一使用 TPM 的部分，但现在 TPM 还可用于其他一些功能。例如，当 Windows 知道 TPM 可用时，便会在生成随机数字时使用 TPM 作为增加平均信息量的来源。这样，可提高各种加密的品质（甚至可能让游戏玩得更顺畅）。
但是，这也意味着事件查看器中显示的与 TPM 相关的事件不一定都与 BitLocker 相关。作为 IT 专业人员，您必须注意其他系统组件（可能是来自其他供应商的软件）可能并且将会使用 TPM，这就会记录一些其他事件。

Windows Server 2008 中的 BitLocker
由于 Windows Vista 和 Windows Server 2008 共用基本代码，所以 SP1 中出现的 BitLocker 更改也是 Windows Server 2008 中不可或缺的部分。但是为什么 BitLocker 在服务器上非常重要呢？毕竟，BitLocker 的设计目的就是保护计算机免受脱机攻击。换句话说，BitLocker 无法对正在运行的系统提供保护，而服务器通常会一直保持运行状态。
实际上，服务器或服务器的硬盘还是有可能遭受脱机攻击。即使从未发生过这种情况，当取消服务器或硬盘配置时，BitLocker 仍然大有帮助，接下来我们就会提到。首先，我们来看一下如何在服务器上安装和运行 BitLocker。

获取和安装 BitLocker
Windows Server 2008 的所有版本中都包含 BitLocker，但它是可选组件或功能，必须从服务器管理器或命令行安装。BitLocker 将作为 NTFS 筛选器驱动程序的一部分实现。安装此筛选器驱动程序需要重新启动计算机，因此请记住，在服务器上激活 BitLocker 需要重新启动。此外，就像 Windows Vista 一样，BitLocker 需要进行拆分加载配置，其中用于启动计算机的活动分区将保持未加密状态。如果来自制造商的服务器未预先配置，可使用 BitLocker Drive Preparation Tool 帮助您正确配置硬盘以支持 BitLocker。不过，如果您非常熟悉硬盘驱动器分区，当然可以手动配置硬盘。
若要将 BitLocker 安装到 Windows Server 2008 中，你可以使用服务器管理器图形界面从功能列表中选择 BitLocker（如图 4 所示），也可以通过发出命令来使用服务器管理器命令行接口：
图 4 在服务器管理器中选择 BitLocker
图 4 在服务器管理器中选择 BitLocker (单击该图像获得较大视图)
ServerManagerCmd –install BitLocker –restart
使用服务器管理器时，它将安装 BitLocker 和 BitLocker 的管理工具。您还可以不安装 BitLocker，而只安装管理组件。这样就无需重新启动计算机，因为筛选器驱动程序未包含在内。此组件的名称是“RSAT-BitLocker”。
BitLocker 在运行服务器核心安装选项的计算机上运行正常，但您无法使用服务器管理器将 BitLocker 安装到服务器核心上，或使用图形用户界面在服务器核心上管理 BitLocker。因此，若要安装组件，请改用命令行工具 pkgmgr 或 ocsetup。
当安装好 BitLocker 二进制文件，并在必要的拆分加载配置中配置好磁盘后，您就可以在操作系统卷上启用 BitLocker。BitLocker 控制面板小程序在 Windows Server 2008 和 Windows Vista SP1 中使用相同的图标和选项。若要启用 BitLocker 的高级模式，您需要使用本地策略编辑器或适用于服务器的组策略对象来调整默认设置。
在服务器核心上，或者您只是不想使用控制面板时，可以使用 manage-bde.wsf 来启用 BitLocker。若要在驱动器 C: 上启用 BitLocker，请键入
manage-bde.wsf –on C: -RecoveryPassword –RecoveryKey F:\
其中，C:是要加密的卷，F:\ 是 USB 密钥或将用于存储恢复密钥副本（二进制格式）的另一个卷。您也可以使用 UNC 路径在网络驱动器上存储恢复密钥。还会生成并显示恢复密码（数值文本格式）。如果确定硬件平台符合所有 BitLocker 要求，您可能希望添加 –skiphardwaretest 参数。这可以避免一次重新启动。

服务器方案
现在，我们来讨论一些 BitLocker 在服务器中派上用场的具体方案。请记住，我曾经提到过 BitLocker 旨在帮助保护免受脱机攻击，这种攻击在 Windows 未运行时发生。
分公司 BitLocker 在服务器上最重要和最明显的用途之一就是作为 Windows Server 2008 分公司策略一部分。有四分之一到三分之一的服务器安装在分公司 — 也就是物理安全性较低、对 IT 支持的访问权限较低，并且到数据中心的连接能力可能也较差的办公室。分公司也是易受攻击的目标。如果将 BitLocker 与只读域控制器 (RODC) 等功能结合使用，则可以帮助保护那些必须存储在分公司使用、但无法提供像数据中心一样的物理安全性的敏感数据。
这时，正好可以思考一下适当的保护级别。防止未经授权而访问数据和要求立即备份服务器且不发生中断，哪个更重要？我的建议是，在许多分公司中，要求输入 PIN 来重新启动服务器是可接受的，但是各家公司必须自行决定。
运送磁盘 您经常会需要将硬盘上的数据传送到很远的地方。可能是传送单张磁盘，也可能是预配置并运送整个服务器。在运送期间，这些磁盘上的数据将不受控制，并可能丢失、被复制或被窃取。
要降低风险，请在运送前对计算机上的卷启用 BitLocker，然后移除所有密钥保护程序，但保留恢复密钥或恢复密码。此密钥或密码可以与服务器分开携带，甚至可以通过电话或加密的电子邮件告知接收方员工。一旦收到计算机或磁盘后，便可使用恢复密码解除对驱动器的锁定。驱动器可以保持加密状态（再次加入其他密钥保护程序），也可以在交付之后完全解密（如果需要）。
若要为分公司预先设置域控制器或服务器，这种方法将非常有效。
服务器的失窃风险 正如上一部分所述，服务器（特别是域控制器）要面对被窃取的实际危险。窃贼可能会借机窃取便携式计算机，但对服务器的窃取可能是精心设计的。如果将 BitLocker 配置为仅需要 TPM 完整性检查，那么窃取的服务器可能轻易就被启动和引导。相反，如果服务器中的驱动器受 BitLocker 保护，且 BitLocker 是以高级模式配置的（需要 USB 密钥、PIN 或两者），则窃贼就很难在合理的时间内获得任何有用的信息。
磁盘的失窃风险 但是反过来说，如果只有磁盘被窃，TPM 仍可提供高度的保护。只有使用原始服务器的 TPM 才能为受 BitLocker 保护的驱动器解除锁定，因此无法直接将磁盘插入到另一台计算机进行读取。
降低风险 通过订购包含 TPM 芯片的服务器硬件并使用 BitLocker 平台完整性检查，可以增强对某些形式的恶意软件的防御能力。尤其是，BitLocker 将检测在 Windows 脱机时所做的更改或对早期启动组件所作的更改，特别是当恶意软件（如 rootkit）需要重新启动才能安装时。这并不是全面的解决方案，但与某些功能（如 Windows 代码完整性）和产品（如 Microsoft® ForefrontTM Client Security）结合后，即可提供另一层级的深层防御能力。
安全取消配置 BitLocker 最实用的一个方案就是在服务器或磁盘的生命周期的结束时。您是否常听说服务器或服务器上的磁盘未经妥善地取消配置便被弃置？您是否知道在拍卖场上，使用过的硬盘驱动器有时比新硬盘驱动器售价还高，因为不正当的买家希望从那些磁盘中获取有用的信息？
幸好，BitLocker 提供了另一种方法，而无需采取昂贵又耗时的过程来清理磁盘上有用的数据。基本上，没有任何信息会以有用的格式写入磁盘。由于加密的数据已无法使用，因此可以快速、轻松地移除所有关键信息。这样，无论以后如何处置磁盘硬件 — 可能被出售、回收、另作他用，都不必担心数据会被不当使用。
在 Windows Vista 和 Windows Server 2008 中，已将格式命令更新为清除 BitLocker 密钥（包括多次覆盖）。现在，您可以使用简单而有效的方式来取消驱动器的配置。

最新消息
当我撰写本文时，也就是您读到本出版物的数周前，许多最新的文章、论文和新闻报告讨论了一些有趣的硬件特性，以及这些特性对 BitLocker、其他 Windows 安全功能及来自不同供应商的加密产品有何影响。我想花点时间来讨论其中的一些新发现。
其中一项发现是由普林斯顿大学的研究人员发表的，他们展示了（令人印象非常深刻！）现代计算机内存的一个特性，有时称为“DRAM 剩磁”（可从 citp.princeton.edu/pub/coldboot.pdf 中找到文章）。简单来讲，就是可以在移除内存电源后的一段时间内访问计算机内存的内容。当然，BitLocker 是在 Windows 运行时将解密数据的密钥保存在内存中的，问题在于密钥可能会被未经授权用户获得。
Adam Boileau 的另一项演示 (security-assessment.com/files/presentations/ab_firewire_rux2k6-final.pdf) 展示了 IEEE 1394（通常称为 FireWire）如何允许直接内存访问 (DMA)，这可用于获取 Windows 上的机密信息，例如密码或解密密钥。有趣之处在于 DMA 几乎等于点 1394；但这不是缺陷，而是 Firewire 原本的设计。
不过，这两种攻击的共同之处在于它们都需要能够对正在运行的（或至少刚刚运行过的）计算机进行物理访问。BitLocker 并非针对联机攻击防护而设计，而且也不能免除一定程度的物理安全性需求。适当的深层防御需要使用多种工具和功能、创建物理安全性的环境、拟定基本的公司策略并持续对用户进行培训。
当然，这些都不是新发现。这些方法已经流传了一段时间，并且实际上就记录在 Microsoft® 数据加密工具包 (DET) 中。DET 中提供的风险分析旨在协助客户在安全性、可用性以及实施和管理成本之间取得平衡。这不容忽视。我们相信只有受过良好培训的用户才最能权衡安全性、可用性和成本以做出决策。
除 DET 之外，我的几位同事也提供了一些出色的评论和指导。首先，Russ Humphries 在其博客文章 go.microsoft.com/fwlink/?LinkId=115217 中讨论了 DRAM 剩磁环境中的安全性取舍。此外，Douglas MacIver 在 System Integrity (SI) 团队博客 go.microsoft.com/fwlink/?LinkId=115218 上撰写了其他的具体配置步骤和当今可采取的对策。强烈建议您抽时间阅读一下这两篇实用的博客文章。您还应该阅读 DET。
这些建议事项的关键在于使用高级模式（即需要 USB 密钥或 PIN 的模式），并且不要使计算机在无人看管的情况下进入睡眠模式（请改用休眠）。

结束语
BitLocker 仍然是 Windows Vista 最有用的功能之一。随着 SP1 的发布，BitLocker 也得到了增强，可直接回应客户反馈，能够启用更多方案，并符合数据保护的更广泛需求。将空闲数据保护机制扩展到 Windows Server 2008 中可为您提供更多方法来保护数据和维护符合性，而无论这些数据是存储在服务器、客户端工作站、数据中心、分公司中，还是由移动工作人员保管。

Byron Hynes 是 Microsoft“企业和合作伙伴组 (EPG)”的企业技术规划师，主要研究安全功能和产品。在加入 EPG 之前，他在 Windows Server 部门工作，并于 2005 年开始认真研究 BitLocker（系统完整性）。欢迎您提出意见和问题。请通过 Tech•Ed 2008 或发送电子邮件至 bhynes@microsoft.com 与他联系。


安全性
使用软件限制策略锁定应用程序
Chris Corio and Durga Prasad Sayana
概览:
  • 软件限制策略运行方式
  • 清点环境中的应用程序
  • 创建和实施策略

当 IT 专业人员希望降低其台式计算机的总体拥有成本（简称 TCO）时，可以考虑采用两种关键策略。第一种是将台式计算机
用户的帐户移出 Administrators 组。第二种是限制用户可运行的应用程序。在企业环境中解决这些问题非常困难，但 Windows Vista® 提供了一些技术，可帮助您实现这些目标。
Windows Vista 及其用户帐户控制 (UAC) 功能在帮助 IT 专业人员以 Users 组成员（标准用户）身份运行其企业用户方面迈出了很大一步。UAC 将所有应用程序的默认安全上下文更改为属于 User，而不是 Administrator。迁移至 Users 组任务也非常艰巨，但随着该行业逐渐适应这种新方式，此项任务也会渐渐变得越来越容易。
在仔细分析将用户移至 Users 组（或有时在此过程中）可能会遇到哪些困难后，许多管理员记录下其用户需要运行的应用程序，并考虑需要执行哪些步骤才能仅允许运行这些应用程序。软件限制策略功能正是为帮助 IT 专业人员完成上述任务而设计的。
您只需指定允许运行的应用程序，然后使用组策略部署该策略即可。在整个企业范围内实施这一策略可降低总体拥有成本，因为此锁定可避免产生与不受支持的应用程序相关的问题。（您还可以一些有趣和特定的方式使用软件限制策略，在侧栏“基本软件限制策略”中将进行介绍。）

软件限制策略运行方式
软件限制策略旨在准确控制用户在 Windows Vista 计算机上可执行的代码。作为管理员，您可以创建一个策略，用于定义在您的环境中可以（或无法）运行哪些应用程序。无论何时何地，只要可能执行代码，就会评估此策略。这包括创建处理期间、调用 ShellExecute 过程中以及脚本运行时。（稍后，我们将更加详细地介绍此策略。）
如果确定允许运行某一应用程序，则该应用程序可以启动。但是，如果确定不允许运行某一应用程序，则会阻止该应用程序并向用户发出通知。例如，如果您尝试从“开始”菜单运行 Solitaire，但该应用程序不允许运行，则您会收到一个对话框，如图 1 所示。
图 1 应用程序被阻止时出现一个对话框
图 1 应用程序被阻止时出现一个对话框 (单击该图像获得较大视图)
组策略对象编辑器 (GPOE) 中将显示用于定义软件限制策略的用户界面，可在其中编写锁定策略。可使用多种方法来定义可以（和无法）运行的代码。完成并测试策略后，即可对其进行部署。

定义软件限制策略
第一个要做的重大决策是选择默认规则类型，该决策将显著影响软件限制策略在您的环境中的运行方式。部署软件限制策略可以采用以下两种模式之一：允许列表或拒绝列表。实际上，您需要选择是希望创建描述允许在您的环境中运行的各个应用程序的策略，还是创建用于定义无法运行的各个应用程序的策略。
在“允许列表”模式中，策略中的默认规则是“受限制”，将阻止所有未显式允许运行的应用程序。在“拒绝列表”模式中，默认规则是“不受限制”，将仅限制您已显式列出的应用程序。
您可能会猜到，如果希望通过应用程序锁定来大幅降低总体拥有成本并提高安全性效果，使用“拒绝列表”模式是不切实际的。创建能够阻止所有恶意软件及其他存在问题的应用程序的广泛列表并进行维护几乎不可能实现；因此，我们建议以“允许列表”模式实施软件限制策略，即采用默认规则“受限制”。

清点环境中的应用程序
如果打算设计一个指定可以运行的应用程序的策略，则您需要准确确定用户需要哪些应用程序。软件限制策略功能通过一个非常简单的策略提供了一项高级日志记录功能，以便确切了解您的环境中正在运行哪些应用程序。
在您环境中的一组示例计算机上，部署默认规则设置为“不受限制”的软件限制策略并确保删除所有其他规则。将启动软件限制策略，但不允许它限制应用程序，而是仅用它来监视正在运行的应用程序。
接下来，创建以下注册表值，以便启用高级日志记录功能，并设置写入日志文件的路径：
"HKLM\SOFTWARE\Policies\Microsoft\Windows\Safer\
CodeIdentifiers"
String Value: LogFileName, <path to a log file>
现在，当运行应用程序和评估软件限制策略（即使它允许运行所有应用程序，也会对其进行评估）时，将在日志文件中写入一个条目。
每个日志条目都包括软件限制策略的调用方、调用进程的进程 ID (PID)、评估目标、选用的软件限制策略规则的类型以及规则标识符。以下是用户双击 notepad.exe 时写入的条目示例：
explorer.exe (PID = 3268) identified
C:\Windows\system32\notepad.exe as Unrestricted using
path rule, Guid =
{191cd7fa-f240-4a17-8986-94d480a6c8ca}
此日志文件提供了启用软件限制策略并将其设置为阻止应用程序时，将检查的所有可执行代码。也就是说，您必须确定允许列表中是否要包括日志文件中的所有条目。请注意，您会看到几个正在检查的二进制文件，这些文件是 Windows® 的一部分，同时也是系统运行的必需文件。
我们在此介绍的日志记录技术为您提供了一种简便方法，使您能够确切了解软件限制策略将在您的环境中遇到哪些应用程序。但它并不是完成此项任务的唯一方法。
Inventory Collector 是 Microsoft® 应用程序兼容性工具包 5.0 的一部分，可使您能够清点环境中正在使用的应用程序。此工具为您提供了多种不同的方法来了解环境中安装了哪些应用程序，并可将结果合并到中心数据库中。

编写其他规则
现在，您拥有一个您的环境中必须允许运行的应用程序列表，并且已准备好创建允许这些应用程序运行的实际规则。软件限制策略功能使用两种方式来标识策略：一种方式基于应用程序的加密属性（如，它的哈希）；另一种方式可定义受信任的路径或受信任应用程序所在的文件夹。
图 2 显示了添加规则的位置，这些规则允许应用程序在 GPOE (gpedit.msc) 的“软件限制策略”节点中运行。在您的环境中定义应用程序的最简单方法是，为在日志记录过程中遇到的每个二进制文件创建哈希规则。
图 2 使用 gpedit.msc 编写软件限制策略
图 2 使用 gpedit.msc 编写软件限制策略 (单击该图像获得较大视图)
由于一组特定位返回的哈希值是唯一的，因此策略中每个二进制文件的哈希值将各不相同。此方法非常安全，并且将仅允许运行策略中特定的二进制文件。
当然，此方法也存在一些美中不足之处。例如，您的环境很可能包含数千个二进制文件。在软件限制策略用户界面中编写所有这些规则非常困难，并且由于规则数目庞大，还可能会影响性能。此外，更新环境中的每个应用程序都需要在该环境中部署一个或多个新的哈希规则。更新应用程序时更新如此大的策略，可能会造成巨大的负担。
幸运的是，可以通过其他两种标识规则的方法来避免此项负担，以便更加轻松地在您的环境中使用软件限制策略。通过深入研究加密安全路由，您可以创建一个规则来允许运行由特定证书签名的任何二进制文件。
执行这一操作有助于简化策略列表维护，因为更新某一应用程序后，新的二进制文件通常将由先前二进制文件签名的同一证书签名。不过，如果您不希望在您的环境中运行先前版本的二进制文件，可以添加一个“受限制”哈希规则来阻止允许文件运行。
默认情况下，软件限制策略将禁用证书规则评估。必须禁用证书规则评估有两个原因。
第一个原因是，软件限制策略中的证书规则由系统的“受信任的发行者”存储所包含的内容定义。因为“受信任的发行者”存储不仅用于软件限制策略规则，还有许多其他用途，因此在用于软件限制策略功能时需要花费更多时间，并且需要考虑其他注意事项。
第二个原因是，为了确定文件签名是否有效，您必须获得该文件的哈希并将其与签名信息比较。对文件进行哈希处理成本很高 － 必须从磁盘上读取整个文件并对其进行处理以计算此哈希。
为了启用证书规则，请导航至“软件限制策略”节点并在结果窗格中选择“实施对象”。然后，双击以打开其属性对话框并选中实施证书规则单选选项。
标识代码的其他常用方法是使用本地计算机上的代码路径。这项技术非常实际且相当有效，但它有一个缺点 — 必须非常谨慎才能确保正确设置该文件夹的安全设置。
如果添加了特定的路径规则，并且此路径允许用户在该位置写入文件（例如，写入到桌面），则通过在该文件夹中放入可执行文件，即可执行用户希望执行的任何操作。但是，如果您的用户不是 Administrators 组成员，则通常无法修改“程序文件”或 Windows 目录中的任何内容。也就是说，如果您所有的应用程序都位于“程序文件”目录且您的用户不是 Administrators 组成员，则应该查看路径规则以编写一个非常简单且有效的策略。
路径规则提供了部分其他功能，以使其更适用于某些环境。它允许使用通配符并允许您使用环境变量，以便更轻松地定义适用于您的环境的规则 — 毕竟，对于每个用户来说，%systemdrive% 并不一定都是 c:\。
就性能和维护方面而言，这很可能是最简单的代码标识方法。路径规则确实是值得考虑的一方面，但还需要注意其他安全事项。

网络区域规则
软件限制策略还包括一种名为网络区域规则的规则类型，尽管此类型的规则正逐渐被淘汰。这些规则的初始意图基于以下构想：如果特定可执行代码的源代码可识别并且受信任，则允许该代码运行。遗憾的是，这项任务非常难以实现，并且效果也不尽人意。目前，软件限制策略入口点的大部分位置都没有实施此类规则。
如果大多数应用程序都安装在 %Program Files% 目录，但有一些其他可执行文件安装到了其他位置并已使用特定证书进行签名，则可以使用不同类型的规则。使用一些哈希规则和一些路径规则，您会发现它们非常适合自己的策略。
请记住，规则按顺序进行处理（如图 3 所示）。证书规则最具体，哈希规则次之，之后是路径规则，最后是包含通配符的路径规则。因此，如果一段代码同时由哈希规则和路径规则标识，则哈希规则的安全级别较优先。
图 3 规则处理顺序
图 3 规则处理顺序 (单击该图像获得较大视图)

策略实施
软件限制策略功能对目标系统提供了广泛的保护。也就是说，应将可在其中执行代码的位置范围与软件限制策略集成起来；同样，也应检查该策略以确定是否允许运行可执行代码。
虽然可在多处检查软件限制策略，但最直接的入口点是 CreateProcess。在 CreateProcess 中，对策略进行检查以确定是否允许执行代表该应用程序的二进制文件。此项策略检查由 SaferIdentifyLevel API 完成，这在公开的资料中有说明。图 4 中描述了常规过程。（稍后，我们将更加详细地讨论 SaferIdentifyLevel。）
图 4 使用 SaferIdentifyLevel 确定二进制文件是否可执行
图 4 使用 SaferIdentifyLevel 确定二进制文件是否可执行 (单击该图像获得较大视图)
ShellExecute 也是实施软件限制策略最常用的 API 之一，仅次于 CreateProcess。当用户单击“开始”菜单中的某一应用程序或双击桌面某处时，将调用此 API。
可对多种不同格式的文件调用 ShellExecute。例如，对 .txt 文件调用 ShellExecute 实际上并不会导致执行该文件。当然，从技术上讲，确实打开了该文件。为此，软件限制策略包含一个可执行文件类型的列表，以便控制调用 ShellExecute 时要检查的文件类型。在软件限制策略用户界面中，可自定义此可执行文件类型列表。
除 CreateProcess 和 ShellExecute 之外，还有两个其他关键集成点：LoadLibrary 和脚本宿主。很显然，LoadLibrary 是检查可执行代码的一个重要位置，但遗憾的是，LoadLibrary 存在一些特殊约束。
大多数应用程序包含一个可执行文件和多个加载的 DLL，并且系统上通常会运行许多应用程序。这就意味着 LoadLibrary 将需要检查大量策略。根据您用于标识代码的策略，这个入口点的实施成本可能非常昂贵 — 想象一下，检查系统上加载的每个 DLL 的哈希，包括对二进制文件进行哈希处理，然后将其与列表上可能成千上万个哈希比较。
默认情况下，此功能处于禁用状态，但可以手动启用它。要执行此操作，请导航至 gpedit.msc 中的“软件限制策略”节点，并双击“实施”。然后，选择“所有软件文件”单选按钮。
我们在前文中提到过，软件限制策略已与系统中的大多数脚本宿主集成，其中包括 cmd、VBScript、Cscript 和 JScript®。这些入口点以及其他入口点均使用主软件限制策略实施 API：SaferIdentifyLevel。
SaferIdentifyLevel API 通过查看相关软件限制策略中的标识信息，来确定是否应允许运行指定的可执行文件。这是公开记录的 API。第三方脚本宿主和可执行环境可以并应该使用该 API 与软件限制策略实现集成，以便该策略能够确定是否应允许运行可执行代码。

以标准用户身份运行
软件限制策略还可以在某些应用程序启动时筛选它们的权限，但这一功能鲜为人知。在 Windows XP 中已引入此功能，但直到 Windows Vista，才在软件限制策略用户界面中予以显示。
从这方面讲，它可谓是 Windows Vista UAC 的先驱者，因为即使该用户是 Administrators 组的成员，您也可以通过此功能以标准用户身份运行应用程序。当您创建一个规则，然后在其他规则用户界面中将其安全级别设置为“普通用户”时，就会发生这种情况。
UAC 的令牌筛选功能和软件限制策略的正常用户均使用底层 API，该 API 可与 CreateRestrictedToken API 实现相同的行为。不过，整体架构在技术方面相差悬殊。UAC 与软件限制策略存在以下几个主要区别。
首先，在启用了 UAC 的 Windows Vista 中，默认情况下每个应用程序都使用类似于 Users 组成员的安全令牌启动，即使该用户是 Administrator。这可以通过软件限制策略实现，但无法以用户的实际 Administrator 令牌来启动应用程序。例如，当用户需要安装应用程序时。UAC 的主要优点是可以更改默认安全上下文，以及可轻松访问用户的完整管理员令牌。
第二个区别在于，以可执行文件为例，代码本身可提供正常运行所需的权限级别。这是一项重要区别，因为独立软件供应商 (ISV) 和开发人员都了解其代码的需求。例如，如果控制面板应用程序需要编辑某些需要管理员权限的内容，它可以在其指令清单中指定该项需求。因此，ISV 可以描述应用程序所需的权限，而不能将某一权限级别强加给它以致无法更改此级别。
目前来说，除非您确实了解正常用户规则的运行方式，否则最好避免使用它。UAC 是帮助将台式计算机用户移出 Administrators 组的很好方法，但您应认真考虑是否仅在企业环境中保留 UAC。

当今使用的软件限制策略
使用软件限制策略时，还应考虑许多可变因素。但与您想象的并不完全相同，事实上，您可能现已在使用软件限制策略，而自己却没有意识到。例如，如果您在 Windows Vista 系统上运行“家长控制”，则此时您就是在使用软件限制策略控制应用程序的执行。
当软件限制策略最初被引入 Windows XP 中时，它可谓是一项重要的技术开发，而应用程序锁定却是此时才开始受到 IT 专业人员关注。
Windows Vista 中的软件限制策略功能仍有一些方面需要改进，但很清楚的是，管理员希望能够借此增强对其环境中所运行的应用程序的控制。对于我们所有人而言幸运的是，此项技术将会不断改进，并使 IT 专业人员能够更轻松地管理他们的系统并降低运行 Microsoft Windows 环境的成本。
基本软件限制策略
软件限制策略的一种应用是创建将 Windows 锁定到展台模式的策略。Microsoft 实际上推出了一个名为 SteadyState™ 的工具包，用于创建此展台。不过，如果您只是想锁定可以运行的应用程序，则可以很轻松地实现。
要只允许少量必需的应用程序登录到 Windows Vista，请创建允许从 %windir%\system32 运行 logonui.exe 和 userinit.exe 的策略。大多数用户可能还需要允许下列应用程序运行：
dllhost.exe, rundll32.exe, control.exe (also under %windir%\system32)....
如果需要使用默认的 Windows 外壳，则可能还需要添加 %windir%\explorer.exe。
或者，您可以选择直接开机进入应用程序，如 Internet Explorer ®。在这种情况下，有必要列出 iexplore.exe 而不是 explorer.exe。
这种基本策略的另一方面是，您的用户不应位于 Administrators 组。这点很重要，如此一来，他们就无法跳过此策略。不过，由于用户只能执行一组非常基本的应用程序，而且没有 Administrator 的权限，所以他们将无权安装应用程序或维护系统。
对于这些计算机，您需要使用其他方式完成上述操作。如果您打算使用 Administrator 帐户本地登录来更新和维护这些计算机，则应选择将软件限制策略应用到所有用户（本地管理员除外）的单选按钮。该策略还应包括 consent.exe 和 cmd.exe。这将允许 Administrator 从 Administrator 命令提示符下启动任何管理选项。
请注意，UAC 在默认情况下会限制用户的安全令牌权限，以致使其看起来不像是 Administrators 组成员的令牌。即使您将上述设置设为不将策略应用于 Administrators，它还是会应用于用户。只有亲身经历了 UAC 提升体验，Administrators 才会真正获得完整的管理员权限，也才不会应用软件限制策略。

Chris CorioChris Corio 曾在 Microsoft 的 Windows 安全团队工作过五年多。他在 Microsoft 主要负责开发应用程序安全技术和管理技术以确保 Windows 安全。您可通过 winsecurity@chriscorio.com 与 Chris 联系。
Durga Prasad SayanaDurga Prasad Sayana 是 Windows 核心安全团队的软件设计工程师兼软件测试工程师。他主要关注安全技术和软件测试。您可通过 durgas@microsoft.com 与 Durga 联系。


安全性
管理 Windows Vista 防火墙
Jesper M. Johansson
概览:
  • 规则类型和方案
  • 防火墙配置文件
  • 域隔离规则
  • 出站筛选问题

不久前，我在博客中写了一篇关于 Windows Vista 防火墙的文章。那篇文章仅指出了一些不错的功能，但是未提供多少部署建议。
在本文中，我将详细说明 Windows Vista® 防火墙中专为简化企业管理而设计的一些功能，并针对如何利用这些功能来简化任务和确保用户安全提供一些建议。
随着近期 Windows Vista SP1 的发布，您可能预料企业也将随之部署 Windows Vista。（通常企业会等待第一个 Service Pack 发布之后，再迁移到新的操作系统。）如果您是一位要针对企业环境认真了解 Windows Vista 的 IT 专业人员，就应该好好研究一下防火墙。了解 Windows Vista 防火墙的功能之后，您可能会重新协商第三方安全套件的协议以从软件包中删除防火墙。

Windows 防火墙的今与昔
虽然最初的 Windows® XP 版本中的防火墙有很多需要改善的地方，但足以应付当时基于商务主机的防火墙的安全性功能需求，所以并未进行任何新增或创新。
然而到了 Windows XP SP2，防火墙就已经全面改观了，此时的防火墙专门针对简化企业管理而设计。Windows XP SP2 防火墙是一种反入侵的轻型高效防火墙，并可进行集中管理，因此相当吸引人。不过最吸引人的可能还是：Windows XP SP2 防火墙能够在启动时保护系统。
最后这一点非常关键。过去我见过许多系统在启动时中毒，即使已经打开防火墙也无法幸免。实际上，在 Blaster（冲击波）病毒传播的高峰期，攻击率高达每四分钟一次。换句话说，如果将一台未采取保护措施的计算机暴露在 Internet 中，那么平均每隔四分钟该计算机就会被感染一次。如果您所依赖的防火墙未能在启动时保护系统，那么重新启动时，每 12 个系统中就会有一个被感染。面对这么严峻的形势，Microsoft 推出了可确保在启动时保护系统的 Windows XP SP2 防火墙。
到了 Windows Vista，防火墙又进行了一次全面革新。从管理角度来看，最明显的改变是将 Internet 协议安全 (IPsec) 和防火墙的管理界面合而为一。这是一项颇具逻辑性的更改。IPsec 和防火墙的用途都是将不允许的内容阻止在外。二者的区别在于，防火墙中负责定义允许内容的参数不够严密，而通过 IPsec 阻止或允许大量地址空间也相当麻烦。
将两种功能放在同一个管理界面中之后，管理员就可以无缝地使用这两种技术，而无需考虑某个部分是需要应用 IPsec 规则，还是应该应用防火墙筛选器。也就是说，您只有一个系统网络攻击面视图，这可以将犯错的风险降到最低。
Windows Vista SP1 在防火墙功能中添加了一些可靠性增强功能，同时也为 IPsec 添加了一些新算法，特别是 Suite B 算法。这是一组与加密相关的算法，包括高级加密系统 (AES)、椭圆曲线密码 (ECC) 以及安全哈希算法 (SHA) 256 和 384。
但最重要的是，Service Pack 1 添加了对网络访问保护 (NAP) 的支持。NAP 是一种策略实施工具，它可以在托管客户端和尚未泄露的客户端获准连接网络之前，利用最新的安全策略、更新和反恶意软件定义确保它们保持最新状态。虽然 NAP 无法阻止恶意主机连接到网络，但只要所有托管主机没有被主动泄露，就可以确保它们完全受到保护。
Windows Server® 2008 也采用了 Windows Vista 防火墙，即称为具有高级安全性的 Windows 防火墙。所有功能都可以实现远程管理，而且可以使用组策略进行跨网络配置。

规则类型和方案
在管理界面中合并防火墙和 IPsec 功能意味着现在有两种不同类型的规则：定向规则和连接规则。定向规则是标准的防火墙规则，用于定义允许哪些流量通往适当的方向。连接规则用于为计算机之间的连接定义保护参数。如果要画出相似关系图的话，方向规则有点类似您所熟悉的旧版防火墙规则，而连接规则比较类似与 Windows XP SP2 防火墙一起使用的 IPsec 规则。
将防火墙和 IPsec 合并到同一界面后，发生了许多有趣的情况。例如，将网络上的系统彼此隔离是目前最有用的安全性观念之一。Microsoft 称之为“服务器和域隔离”。
服务器和域隔离同时使用 IPsec 和防火墙功能。认识到这一点后，新的防火墙管理界面中即包含了针对隔离规则的特定功能。如果您希望根据源系统或目标系统的属性（如域成员身份）限制连接，则这些规则会很适用。
如图 1 所示，“新建连接安全规则向导”首先询问要创建的规则类型。如果选择“隔离”，向导会预先配置适合隔离规则的特定设置。
图 1 使用“新建连接安全规则向导”创建隔离规则
图 1 使用“新建连接安全规则向导”创建隔离规则 (单击该图像获得较大视图)
您可能会发现图 1 中的隔离规则涉及到了运行状态。服务器和域隔离所用的规则实际上与您在 NAP 中使用的规则相同。
对于某些类型的流量，您无法强制执行身份验证。例如，您可能不希望对 DNS 解析进行身份验证。对于此类流量的端点，您需要一个身份验证例外规则。顾名思义，身份验证例外规则可让流量免受 IPsec 要求的限制。
服务器到服务器规则就有点名不符实了。此规则虽然较常用于服务器，但也适用于客户端。服务器到服务器规则只配置一个要求身份验证的连接。这与隔离规则不同，因为隔离规则不仅要求身份验证，还需要满足一些额外的条件，如域成员身份或运行状态。
隧道规则主要定义网关之间的站点对站点虚拟专用网络 (VPN) 和隧道。隧道规则很少与 Windows Vista 一起使用，因为您不可能在网关容量中使用 Windows Vista。您可以创建完全自定义的规则，从而自定义规则的各个参数。

规则排序
乍一看，规则排序有些复杂。要了解规则排序，最关键的是要先忘记排序。与其说规则排序讲的是排序，不如说它在讲述匹配选择。下面以入站流量为例进行说明。如果入站流量不符合接受它的任何规则，则默认情况下该流量将被阻止。您可能将其视为一种“首先考虑允许规则”的排序，但这种假定是不正确的。如果某个具体数据包同时符合允许规则和阻止规则，则应用阻止规则。简单来说，这意味着匹配的内容为：
  1. 阻止规则。如果数据包或连接符合其中一项，它将被放弃。
  2. 允许规则。如果数据包或连接符合其中一项，它将被允许。
  3. 默认的定向配置文件行为。如果不符合任何阻止或允许规则，则会根据被指定为该配置文件中该方向的流量默认值的行为，来决定如何对待流量。如果所有配置文件都是入站方向，则阻止默认配置中的流量。默认情况下，如果是出站方向，则允许默认配置中的流量。
匹配过程由经过身份验证的跳过 (IPsec) 规则进行调节。如果使用该类型的规则，则对于所有经过身份验证的流量，只要符合该规则的其他参数就会得到允许，而不管该流量是否符合任何其他规则。经过身份验证的跳过规则就是选中了“替代阻止规则”选项的定向规则，如图 2 所示。优先考虑此类规则是为了让经过身份验证的流量都能到达系统。这就说明了您为什么可以轻松接受来自经过身份验证的主机的流量，但会阻止其他流量。在排序时，您可以将这个规则视为第 0 位。因此，完整的规则排序列表如下所示：
图 2 选中“替代阻止规则”选项以配置经过身份验证的跳过规则
图 2 选中“替代阻止规则”选项以配置经过身份验证的跳过规则 (单击该图像获得较大视图)

0. 经过身份验证的跳过规则
1. 阻止规则
2. 允许规则
3. 默认的定向配置文件行为

每个类别中是否包含多个符合流量模式的规则，其实并不重要。只要找到了与流量匹配的规则，规则处理就会停止。

公共、专用和在域上
网络资源
  • TechNet 安全中心
  • 使用 Netsh Advfirewall 命令行工具
  • Windows Vista 和 Windows Server 2008 中，用于 Windows 防火墙和基于 IPsec 的连接的安全规则
  • 在 Windows Server 2008 上使用 SCW 进行的安全观察

新的防火墙包含三个配置文件：公共配置文件、专用配置文件和域配置文件。Windows XP SP2 防火墙包含两个网络配置文件：标准配置文件和域配置文件。如果计算机能够找到域控制器，则将自动调用域配置文件。在 Windows XP 中，对其他情况使用标准配置文件。这个方法为安全管理员提供了强大的功能。当管理员位于公司的网络中时，可以在计算机漫游时完全锁定计算机，同时仍允许执行所有必需的远程管理功能。但是此方法会为某些用户带来一定的麻烦，尤其是在家使用个人网络的用户。因为如果系统找不到域控制器，就一定会使用标准设置文件，这就会从用户的家中锁定系统。
Windows Vista 中包含的新专用配置文件可帮助解决此问题。现在，当您将系统连接到新网络时，它会询问该网络是公共（这只是前一标准配置文件的新名称）还是专用，然后适当地配置系统。系统每次连接到该网络时，都会根据网络上的基础结构服务器提供给它的网络参数记住网络性质。虽然这并非万无一失的做法，不过因为它允许更多网络接受更妥善的锁定，所以还是有一定帮助的。
确定系统是否位于域上的检测逻辑也已经得到改进。因此转换操作比以前更快速、更可靠，而且当系统实际位于域上时，很少需要考虑应该使用公共配置文件还是专用配置文件。
您可以将规则连接到特定类型的网络，以防止系统自发提供过多信息，并且防止它们尝试连接到不受信任的网络上的系统。此时，防火墙和 IPsec 的集成将开始发挥效用。
使用这些新规则，您可以提供一些以前不可能实施的限制。例如，多年来攻击者不断尝试“引诱攻击”，使用户将 Windows 网络使用的服务器消息块 (SMB) 连接到不受信任的主机，以强迫身份验证序列为其提供“质询-响应”对来破解密码。过去他们也会利用此类攻击，将身份验证降级为纯文本身份验证，或者将用户的“质询-响应”对返回原始计算机。前一种技术已于多年前被舍弃，后一种技术则随着 Windows XP SP2 一起迁移，但别忘了，自发的“质询-响应”对仍有所欠缺。
为防止这种情况发生，您可以使用 Windows Vista 防火墙中的另一种新功能 — 出站筛选。例如，管理员可以决定阻止公共配置文件中的所有出站 SMB 连接（在端口 TCP 135、139、445 和 UDP 137、138、445 终止的连接）。这样就可以更有效地防止有人在引诱攻击中利用您的系统获得“质询-响应”对，或者访问 Internet 上不受信任的 Windows 文件共享。
同样，这也并非万全之策。例如，如果系统已遭到攻击，此规则可能无法阻止系统与外界通信，因为攻击者只要禁用该规则，我们就束手无策了。不过，它倒是可以保护那些运行正常但有暴露可能的系统。
此处必须提及的一点是，与 Windows XP SP2 相同，在 Windows Vista 和 Windows Server 2008 中一次只能有一个配置文件处于活动状态。如果系统中有两个活动网络接口，其中一个在域上，另一个在公共网络上，则二者都将应用公共防火墙配置文件。这是因为应用的一定是限制最严格的配置文件。您可能已经猜到，公共配置文件的限制比专用配置文件严格，而专用配置文件的限制又比域配置文件严格。因此请注意，出站 SMB 阻止规则可能会中断许多通过 VPN 连接传送的流量。
当计算机使用公共或专用网络时，若要通过 VPN 连接传送流量，可以创建专用于 VPN 接口的定向规则。要使此规格正常工作，Windows 必须能够识别 VPN 接口。如果未使用 Microsoft® 路由和远程访问服务 VPN 服务器，请先测试这项功能，再推广部署。这个问题主要发生于指向客户端的入站流量，以及您创建的所有自定义出站规则。

构建防火墙规则
在新防火墙中构建防火墙规则要容易得多。如图 3 所示，“新建规则向导”允许您定义所有常见类型的规则，其中包括针对特定服务的预定义规则。
图 3 “新建规则向导”中的预定义规则
图 3 “新建规则向导”中的预定义规则 (单击该图像获得较大视图)
预定义规则非常重要。服务器隔离主要用于限制服务，以便只允许需要使用这些服务的系统使用它们。可以在服务器产品上使用 Windows 安全配置向导 (SCW) 来简化操作，但简化效果也不够明显。（我曾在 2008 年 3 月的《TechNet 杂志》期刊中讨论过 SCW。）
直到现在，Windows 的客户端版本才刚刚提供了类似的功能。当您使用预定义的规则类型时，它会为您完成大部分有一定难度的任务，即确定服务要使用哪些端点。防火墙不仅能感知应用程序（因为它知道“iSCSI Service”代表哪一个程序)，而且包含可描述特定功能的预定义规则。因此，您可以专心确定规则需涵盖哪些计算机。虽然此任务仍然艰巨且非常耗时，但至少是针对您的具体环境的任务。
另外，还有一个自定义规则（被图 3 中的下拉列表遮住了）可为您提供身份验证防火墙能够提供的所有灵活性。例如，如果您希望规则只允许 IPsec 加密的流量，则可在图 2 所示向导中的“操作”页上选择仅允许安全连接的选项。
选择此选项的同时，会为您提供一个启用加密的选项。如果将该选项保留为空，流量将使用 ESP-NULL（使用 NULL 密钥的封装式安全措施负载）。建议以这种方式使用 IPsec 进行身份验证。由于流量可以毫无阻碍地周游网络，因此它允许大部分网络管理工具保持工作。如果希望进行加密，只需选中此框。
在许多情况下，对网络流量进行加密还不如拒绝来自恶意主机的流量。因为对网络上的流量进行加密只能阻止已取得网络本身访问权限的攻击者看到数据包中的内容，而要求身份验证可以防止您传送数据包，进而免遭攻击。当然，在很多情况下都必须进行网络级加密，但也有很多时候只需进行身份验证即可。

构建域隔离规则
在大多数环境中，您都希望只有一定数量的计算机可以将流量发送到工作站。至少，所有工作站都应使用域隔离规则进行配置。这在 Windows XP 中有点复杂，但在 Windows Vista 中却很简单。
首先，打开您选择的管理工具，选择“连接安全规则”节点，然后右键单击该节点，选择“新建规则”，您会看到如图 1 中所示的对话框。选择“隔离”规则，然后单击“下一步”。现在，您必须选择是否强制执行该规则。如果是在工作站上，大多数情况下您会要求对入站流量进行身份验证。这可防止任何未加入域的计算机将流量发送到工作站。但是，为从基础结构服务中请求服务，系统必须允许一些出站流量自由通行。因此，最佳选择是要求对入站连接和出站连接都进行身份验证。
接下来，选择身份验证方法。默认选择显而易见，就称为“默认”。您可以使用 IPsec 属性（右键单击“具有高级安全性的 Windows 防火墙”节点，然后选择属性）逐台计算机配置默认身份验证方法。默认的身份验证方法始终是 Kerberos，因为这是最简单、最安全的方法。但为了清晰起见，我建议您在构建规则时实际选择它。通常，您只希望对计算机进行身份验证，而不会对用户进行身份验证。如果两者都需要进行身份验证，您就可能无法接受某些类型的管理流量，如匿名传输的 SNMP 流量。
选择身份验证方法后，只需选择可将此规则用于哪些配置文件即可。因为此规则适用于加入域的计算机，可以提供 Kerberos 票证，因此无需在专用或公共配置文件中专门进行此操作。接下来只要保存此规则，就大功告成了。
基本隔离规则已经不像以前那么复杂了。但是，要利用 IPsec 的功能进行隔离，您需要实施服务器隔离，即使在工作站上也是如此。这样，可以防止工作站侦听其他客户端，它们应该只响应适当的管理工作站。想象一下，仅让客户端系统拒绝侦听其他客户端，就可以减少多少因各种恶意软件爆发而造成的影响。

编写防火墙脚本
新的防火墙随附了一个相当好用的 API，您可以使用它来编写部署和评估脚本。理想情况下，应使用组策略进行部署，但是由于组策略并非始终可用，所以一定要有一组适当的 API 来配置防火墙才行。API 按照其 INetFWPolicy2 组进行分组。虽然软件开发工具包和 MSDN® Library 包含较为完整的使用方法详细信息，但只有少数示例可以说明这一点。
其中一个常见示例是需要确定是否要打开一组规则。例如，应用程序或管理员需要确定是否允许来自系统的文件和打印机共享，这可以使用 INetFWPolicy2::IsRuleGroupCurrentlyEnabled 实现。图 4 提供了说明此功能的 VBScript 示例。
Figure 4 使用 INetFWPolicy2::IsRuleGroupCurrentlyEnabled
' Create the FwPolicy2 object.
Dim fwPolicy2
Set fwPolicy2 = CreateObject("HNetCfg.FwPolicy2")

' Get the Rules object
Dim RulesObject
Set RulesObject = fwPolicy2.Rules

'Create a profile object
Dim CurrentProfile
CurrentProfile = fwPolicy2.CurrentProfileTypes

'Check whether File and Printer Sharing is on, and turn it on if not
if fwPolicy2.IsRuleGroupEnabled(CurrentProfile, "File and Printer Sharing") <> TRUE then
    fwPolicy2.EnableRuleGroup CurrentProfile, "File and Printer Sharing", TRUE
end if
现在，如果文件和打印机共享处于关闭状态，而您需要将其打开，则首先要确保此操作可行，而且不会被组策略覆盖。这可以使用 INetFWPolicy2::LocalPolicyModifyState API 实现。下面是可以填写实际代码的大纲：
Const NET_FW_MODIFY_STATE_OK = 0
Const NET_FW_MODIFY_STATE_GP_OVERRIDE = 1
Const NET_FW_MODIFY_STATE_NO_EXCEPTIONS = 2

Dim PolicyModifyState
PolicyModifyState = fwPolicy2.LocalPolicyModifyState
Select Case PolicyModifyState
  Case NET_FW_MODIFY_STATE_OK
  Case NET_FW_MODIFY_STATE_GP_OVERRIDE
  Case NET_FW_MODIFY_STATE_NO_EXCEPTIONS
End Select

命令行和接口类型
没有适当的命令行进行管理，就不可能有完整的防火墙。Netsh 下有一个子上下文，称为 advfirewall。Advfirewall 上下文可对您授予命令行访问权限，访问您在图形 UI 中执行的所有内容。例如，如果您希望在端口 445 上实现出站拦截，可以从已提升的命令提示符处运行以下命令：
netsh advfirewall firewall add rule name="Block CIFS Out in the Public profile"
dir=out action=block enable=yes profile=public
localIP=any remoteIP=any remoteport=445 protocol=TCP interfacetype=any
然后，您需要运行同一命令（不过要将 TCP 替换为 UDP），从而完成拦截。此时，即已实现此规则。
防火墙中有一个很酷的功能，能够根据网络接口类型配置规则。前面曾提到，有些规则可能会影响 VPN 连接。只要 Windows 将接口识别为 VPN 接口，您就可以使用此类型的规则放过该接口上的流量：
netsh advfirewall firewall add rule name="Allow CIFS on VPN interfaces"
dir=out action=allow enable=yes profile=public localIP=any
remoteIP=any remoteport=445 protocol=TCP interfacetype=RAS
您也可以在 GUI 中执行此操作，但必须先创建规则。然后必须右键单击此规则，选择“属性”，并单击“高级”选项卡。该选项卡上有一个接口类型部分，您可以在其中选择正确的接口类型。

出站筛选
Windows XP SP2 防火墙中缺少出站筛选是内置防火墙缺乏安全性的主要原因。过去不知道有多少篇文章将 Windows XP SP2 防火墙的安全性不足归咎于缺少出站筛选。其实真正的原因是 Windows XP 上没有一个防火墙可以安全提供出站筛选。
Windows XP 根本无法将出站筛选变成一项有用的安全性功能 — 我之前用过的策略强制工具不过是限制了速度罢了。但是，Windows Vista 中确实存在这种功能。因此，新的防火墙自然可以利用这项功能。默认情况下，该功能将阻止大部分入站流量，而允许大部分出站流量。
默认情况下，新 Windows Vista 防火墙中的出站筛选只阻止来自服务的不必要流量。实际上，这足以防止提供出站筛选器的主机泄露，因此在 Windows XP 中执行此操作根本毫无意义。
Windows Vista 中的服务可以使用严格限制的令牌运行。基本上，每项服务都有自己唯一的安全标识符 (SID)。此服务 SID 可用于限制对资源（如网络端口）的访问。这与我们之前研究限制传送给用户的流量时所看到的功能一样。也就是说，即使您以 NetworkService 身份运行两个服务，也无法管理彼此的进程，不过您可以将防火墙配置为只允许其中一个与外界通信。如果阻止的服务受到攻击，它也无法劫持允许的服务并使用已接受的端口向外传播，因为这个端口受服务 SID 的限制。
这是 Windows Vista 中新增的另一项很棒的安全性功能，新的防火墙可以使用它来通过出站防火墙筛选实际提供真正的安全值。
实际上，新的防火墙默认启用对服务 SID 的防火墙筛选。遗憾的是，无法使用 GUI 对其进行配置。规则是在 HKLM\System\CurrentControlSet\services\sharedaccess\parameters\firewallpolicy\RestrictedServices 注册表项中预定义的。不过，手动修改此注册表项时应非常小心，因为系统并不支持此操作。

出站筛选可以提供多少安全性？
关于出站筛选实际可以提供多少安全性的问题，安全社区一直存有一个极大的误解。到目前为止，我已提过两个通过出站筛选提供安全性的方案，但是这两个方案都依赖于 Windows Vista 中以前没有的新功能。尽管如此，人们仍认为出站筛选整体来说相当不错，并应作为购买防火墙时的主要考虑因素。
令人啼笑皆非的是，许多公司在购买防火墙时以出站筛选为准绳，但在实施防火墙之后，出站筛选却根本派不上用场。这种误导使信息安全组白白浪费了不少资金和精力。但是，有时候采取一些与安全性相关的操作，让大家得到心理上的安慰，反而比实际分析真正的威胁更能主导人们的决策。通常，决策是由人们对此类“安全性表现”的需要所主导，而不是由实际情况所主导。
这是关于出站筛选的一个非常简单的事实，但拥护者们却没有考虑这一点。基于主机的防火墙供应商的常见论调是：如果系统受到攻击（无论是蠕虫还是恶意的交互用户），出站筛选都会阻止蠕虫感染其他系统，或者阻止入侵者向外传播。实际情况并非如此。
事实上，在其他条件不变的情况下，出站筛选可以阻止一些曾经出现过的恶意软件。但是，如果 Windows XP 附带了出站筛选，那么我们到目前为止所看到过的蠕虫，很可能早已关闭或绕过此功能。
在 Windows XP（以及早期的 Windows 版本）中，任何假冒服务身份运行的蠕虫（以及所有在对话中出现并假冒服务身份运行的常见蠕虫）都可能会停用出站筛选。如果它们不这么做，唯一的理由就是根本没有使用出站筛选的环境，因此也不必停用它。在交互式攻击中，攻击者可随心所欲地避开出站筛选器。如果攻击者能够运行任意代码，此目的将很容易实现。但是如果需要，攻击者还可以引诱用户避开出站筛选器。
避开基于主机的出站防火墙筛选器的方法有很多种，具体取决于实际的攻击方案。最简单的方法是“请”具有过高权限的用户帮忙。现在有太多环境的用户仍以管理员身份运行，因此那些用户有权随心所欲地避开安全策略。用户面对攻击者提供的充满诱惑力的东西（如流行的流氓兔）时，很少想到无形和非直接的安全利益。
用户因为看多了这类对话框，常常不假思索就按下去，根本没有仔细了解上面的内容，结果就中招了。这是出站筛选的第一个问题。也就是说，安全性和诱人的奖品（如流氓兔），两者中胜出的一定是流氓兔，因为大部分要求用户做出安全性决策的对话框都缺乏足以让用户做出安全决定的参考信息。
然而，要提供附上充分的决策参考信息的对话框来请用户做出安全性决策，谈何容易。因为安全性产品（如防火墙）不仅需要了解端口、协议以及发出请求的应用程序，还要了解请求的真正目的，以及此目的对用户的意义。这些信息很难以编程的方式提供。例如，对于 Microsoft Word 中的链接，人们往往对单击该连接会执行什么操作感兴趣，而忽视单击该链接也会建立出站连接！
我们需要做的是减少（而不是增加）无意义的对话框，但是出站筛选防火墙没办法帮助我们做到这点。为了解现况，向用户提供有价值的信息，我找出一家知名的基于主机的防火墙供应商的销售文档。那些图文并茂的文档阐述了防火墙的出站筛选能力和建议能力。建议能力可检测用户想要做什么，然后提供适当的建议。至少理论上如此。宣传手册中的文本还附了一张屏幕快照，内容是：“本程序尚无相关建议。请选择下面的项目，或者单击‘更多信息’获取帮助。”即使在市场营销材料中，供应商好像也无法提供参考性的对话框。
由于用户没有足够的信息做出适当的安全性决策，管理员只好负责配置所有出站筛选，因为最终用户没办法这么做。可这么一来，就等于无限制地加重了管理员的管理负担。
即使在防火墙询问时，用户单击了“否。稍后再提醒我”，恶意软件还是有办法绕过防火墙。只要被恶意代码冒充的用户可以在某个端口打开出站连接，恶意代码就可以使用那个端口。因此，任何进程都可以通过现有的进程执行。旧版的操作系统就接受这种做法。但是从 Windows Vista 开始，进程会受到适当的限制。因此，在默认情况下，受限制的服务默认由出站筛选加以阻止。
遗憾的是，大部分人都认为基于主机的出站防火墙筛选会阻止已受到攻击的对象攻击其他对象。这是不可能的。在已受到攻击的对象上实施保护措施，并且要求它不攻击其他任何对象，这根本就是不可能的。保护措施是对要保护的对象实施的，而不是对已经遭到破坏的对象！强盗已经进门了，再要求他们不要搞破坏，似乎太晚了；事先将他们拒之门外更务实一些。

Jesper M. Johansson 是研究安全软件的软件架构师，还是《TechNet 杂志》的特约编辑。他拥有管理信息系统博士学位，具有 20 多年安全方面的经验，并且是企业安全性领域的 Microsoft MVP。他的最新著作是《Windows Server 2008 安全资源工具包》。


安全性
使用数字证书保护电子邮件的安全
Matt Clapham and Blake Hutchinson
概览:
  • 创建可验证的身份
  • 更新证书状态
  • 获得和交换证书
  • S/MIME 系统疑难解答

很长时间以来，人们采用了各种不同的方法来隐藏正在传输的信息、验证发件人，并对消息进行身份验证。随着文明的发展，人们开发出了同时完成这三项任务的方法，并且正在迅速普及。“安全多用途 Internet 邮件扩展”
(S/MIME) 是一套使用加密和数字签名安全发送电子邮件的系统。
目前的加密（隐藏）技术分为两大类：对称（秘密）密钥算法，如数据加密标准 (DES) 或高级加密标准 (AES)；以及非对称（公开/私密）密钥算法，如 RSA 或椭圆曲线加密 (ECC)。现代的发件人验证工具是单向的算术函数，称为哈希，它可以生成唯一的签名。消息摘要算法 5 (MD5) 和安全哈希算法 (SHA) 是两种常用的哈希方法。计算机可以使用这些算法来生成与单个源文本对应的唯一哈希或数字（相同的源文本会哈希成相同的值）。运用和结合这些简单的工具可以构建公共密钥基础结构 (PKI) 系统。

可验证的身份
证书颁发机构资源
  • 针对加密文件服务使用证书颁发机构
  • 证书颁发机构服务器无法重命名或从网络中删除
  • 如何从域中的计算机内删除受信任的证书颁发机构
  • 如何取消 Windows 企业证书颁发机构以及如何从 Windows Server 2003 和 Windows 2000 Server 中删除所有相关对象
  • 如何将证书颁发机构移动到域控制器上运行的新服务器中

PKI 系统中的身份通过数字证书进行管理，这跟大多数人跨国界时携带的政府身份识别 — 护照 — 并没有什么不同。数字证书世界的护照标准是 X.509 格式，这种格式广泛用于各种技术中的签名和加密操作，例如 S/MIME、Internet 协议安全性 (IPsec)、安全外壳 (SSH)、无线网络安全性、虚拟专用网 (VPN)，甚至安全服务器通信（例如 SSL 网站）也包括在内。
证书是以非对称加密和哈希为基础构建而成。若要创建证书，请求者（等候一些较高颁发机构签署的密钥的实体）会生成一个私钥。该密钥会被锁定起来，这样一来它的真实性永远不会受到质疑。生成私钥的同时还会生成一个对应的公钥。顾名思义，这个密钥对的公开部分并不是秘密，而且会公开发布，但在某种程度上还是会确保它的真实性。
这个密钥对允许进行两项基本的操作。首先，任何人都可以使用公钥来加密只有私钥可以解密的内容，其次，公钥可用来解密以私钥加密的内容。这对于验证只有私钥可能创建的签名很重要。
对证书颁发机构提出的请求包括各种详细信息，例如密钥的目标人员或计算机的身份、算法类型和强度，以及密钥对的公开部分。证书颁发机构 (CA) 会接收请求中的信息并对其进行验证，并使用哈希算法创建与该信息相对应的唯一标识符。
CA 会使用它的私钥加密信息的哈希，并把它组合成标准格式（例如 X.509），然后创建与原始要求相对应的证书。X.509 证书将包含声明列表，包括证书（主体）的身份、有效期限、公钥，以及可使用证书进行的操作等。然后将证书返回给请求者，证书事实上是个令牌，表明：“我，CA，担保这个公钥，以及与之对应的私密部分，仅作为此处所描述的这些用途”。
对于根 CA（位于信任链最高级别），证书是自签名的。大部分可接受的根 CA 都会预安装在基本操作系统或应用程序中，但可通过程序包或企业配置进行更新或更改。在根 CA 和叶节点（通常是指个体或系统）之间，可以有一或多个中间 CA。
信任链包括所有节点以及其中先前内嵌的所有证书，由 CA 在该级别签名。尝试验证证书的第三方可以检查本地计算的哈希，并将其与从证书解密（使用该特定 CA 或个体的相应公钥）的哈希进行比较。就是这么一回事 — 从叶到根经过完整验证的信任链 — 当然前提是假设根是受信任的。

更新证书状态
每个良好的 CA 都有方法可以分发不应该再受信任的证书清单。这份证书吊销列表 (CRL) 说明 CA 特别取消了哪些已颁发的证书。方便的是，CRL 的位置通常是 CA 证书的属性。
CA 会基于以下两项不断颁发 CRL：计划（也许是每两个星期）或事件（表明颁发的证书不应该再受信任的一些情况）。CA 会在发布颁发的 CRL 时对其进行签署。当接收系统评估信任链的有效性时，它通常会尝试取得信任链中每个颁发 CA 的 CRL（通过证书本身内嵌的详细信息，或是通过一些预先定义的受信任分发机制）。如果存在无法获取的 CRL，客户端可能会改用最近成功缓存的副本，只要此副本没有超过指定的 CRL 更新期限。不过，如果连这样都办不到的话，客户端系统通常会显示某种错误，指明证书看似有效但无法确认吊销状态。
许多应用程序如果无法验证信任链，或信任链中每个节点的 CRL，则需要花费很长一段时间加载证书。视证书所保护的内容而定，用户不一定会需要信任它。每个 CA 必须要有定期更新、广泛可用的 CRL 发布点，尤其是对那些公共根 CA 来说更是如此。
根 CA 是证书链的基础，而链结是所有证书层次结构的基石。大部分客户端系统或应用程序只会在叶节点链结回信任的根 CA 时，才认为叶节点证书有效。这可以是企业 CA，由特定公司所拥有或经营的 CA，也可以是公共根 CA（例如 VeriSign）。
对于公共根 CA，为了确保完整性，必须具备丰富的操作专业知识。企业对于内部运营也应该努力达成相同的等级，因为根 CA 的安全性在那样的环境下也同样重要。为了获得最好的保护，根 CA 实际上应该保持脱机状态，而且只用于颁发证书和更新 CRL。有关 CA 操作最佳实践的详细信息，请参阅“证书颁发机构资源”侧栏中所列文章。
密钥恢复是需要考虑的一个重要方面。为了方便调查，并确保数据不会被用户锁定而无法恢复，企业应该将所有用户发布的密钥进行备份。而且这些备份副本应该保存在安全的存储库中。这样一来，即使用户的密钥不见了，类似于智能卡被丢在出租车里，该用户仍然可以访问密钥保护的所有内容。
最后，每个良好的加密系统中都有生命周期管理的概念。随着计算机的速度越来越快，算法也变得越来越薄弱。每个良好的加密系统都必须能够自行更新，并随着时间转换到新算法和密钥大小。在识别出加密弱点，以及逐步采用或停止特定功能时，应该相应更新 CA。

实施 S/MIME
使用 S/MIME 启动、撰写、发送和接收经过签名或加密电子邮件分为几个阶段。我们会在介绍典型的 S/MIME 案例时，讲述相关细节、问题和可能的解决方案：两名用户从两个不同的 Active Directory® 林和不同的证书颁发机构链（也就是从独立的操作实体，不管是否属于同一公司），使用 Microsoft® Office Outlook® 2007 相互发送经过签名和/或加密的电子邮件。
我们将假设必要的基础结构已经就位，随时可以开始我们即将介绍的操作。在我们的案例中，使用的是集成 Active Directory 的企业证书服务器。

获得证书
第一项任务是获得相应的证书。为此，请打开“证书管理器”MMC (certmgr.msc)，右键单击“个人”文件夹，在弹出列表上选择“所有任务”，然后从列表中选择“申请新证书”。
这将启动“证书注册”向导，如图 1 所示。默认情况下，将显示几个以企业为中心的选项，但重要的是“用户证书”。稍后将用它来开始签名和加密流程。证书必须能够用于：
图 1 请求证书
图 1 请求证书 (单击该图像获得较大视图)
  • 数字签名（创建消息，创建者密封了真实性）
  • 密钥加密（对于诸如“加密文件系统”这样的技术，使用一个密钥保护另一个密钥）
  • 保护邮件（只有拥有相应私钥的目标收件人才能阅读加密邮件）
发送 S/MIME 签名的电子邮件时并不需要密钥加密属性。但在发送或接收加密邮件时则需要这个属性，但不需要签名属性。默认情况下，Windows® 证书服务中的模板启用这三个属性。如果不允许用户申请新证书，则向导启动时三个属性都不会显示。如果没有任何企业 CA 可用，会向用户显示“注册错误”，指明无法联系域或 CA。对于此演练，我们将假设单一证书同时允许签名和加密。

交换证书
两个用户开始发送加密电子邮件的最简单方法就是彼此直接传送已签名的邮件。撰写好邮件之后，用户可单击“签名”按钮。（有时候除非至少用过一次，否则在 Outlook 中会默认隐藏这个按钮。可以通过依次单击新邮件的“选项”设置、“安全设置”按钮，然后选中“安全属性”对话框上的“为此邮件添加数字签名”框找到该按钮）。签名按钮（带有红色缎带的黄色小信封，写着“签名”）会将数字签名添加到邮件中以建立它的来源真实性。
按下“发送”按钮之后，可能会提示用户提供另外持有的密钥令牌，如插入智能卡或输入 PIN。这会视组织中所采用的特定密钥保护方法而定。
收到 S/MIME 签名邮件的用户需要查看并右键单击发件人名称（发件人: 之后），然后从上下文菜单中选择“添加到 Outlook 联系人”来添加新的联系人项或更新现有联系人。证书随后会与该特定的联系人项建立关联。请注意，在常见的 Active Directory 环境中（两个用户位于相同的林或公司中），公用用户证书分发是通过用户的 Active Directory 对象中的属性自动完成的。
交换证书的另一种方法是每个用户以附件的形式发送其 S/MIME 证书。为此，双方都必须将其证书导出为 CER 文件。用户需要查看证书，并遵循我们即将讨论的导出过程，注意不要使用该导出过程导出私钥，如图 2 所示。
图 2 交换证书时， 不要导出私钥
图 2 交换证书时， 不要导出私钥 (单击该图像获得较大视图)
每个收件人接下来会在 Outlook 中手动创建联系人项，然后将证书添加到该发件人项中。两个用户交换证书后，他们就能够彼此交换加密的电子邮件了。

疑难解答
有时收件人会无法打开加密的邮件。对于在这个领域中出现的问题，最有可能的三个原因分别是根 CA 不受信任、无法验证中间 CA 以及无法使用 CRL。
不受信任的根 CA 通常会在 Outlook 中显示为与签名相关联的错误消息：“该签名有问题。单击签名按钮可获取详细信息。”若要解决问题，请从 Outlook 中打开证书，然后单击弹出对话框中的“查看证书颁发机构”按钮。查看证书属性对话框“常规”选项卡上的消息。如果消息指示 CA 根证书不受信任，而且需要安装，请转到“详细信息”选项卡。单击“复制到文件...”按钮，并按照向导说明进行操作，接受所有默认设置并在收到提示时提供文件名和文件夹。
现在以计算机管理员的身份打开一个新的 Microsoft 管理控制台 (MMC)。转到“文件”|“添加/删除管理单元 (Ctrl+M)”，选择“证书”，并添加它以用于计算机帐户，在提示时选择“本地计算机”。接下来，在左边树状结构中展开“证书”节点，然后对“受信任的根证书颁发机构”执行相同的操作。右键单击并从弹出菜单中选择“所有任务”|“导入”。将前述导出的证书文件导入到“受信任的根证书颁发机构”并单击“完成”。然后让受影响的用户重新启动 Outlook。
应该仅使用上述说明添加已知的受信任根 CA。并不是创建的所有根 CA 都是平等的。请先审慎考虑是谁拥有和操作根 CA，再使用该方法将根证书添加到整个系统的存储区。如果企业通过组策略控制受信任的根 CA 列表，则会将配置推送到客户端系统。在这种情况下，上述的说明可能并不适用。如果事实如此，您可能需要探索其他替代办法，如确保网站或服务器的安全以交换数据，因为使用电子邮件的体验并不顺畅，也不会受到保护。
上面提出的第二个问题，即无法验证中间 CA，通常在两种情况下发生：尝试验证证书的客户端无法到达证书中所定义的颁发机构信息访问 (AIA) 位置，或者客户端所拥有的中间 CA 证书版本与 CA 所颁发的版本不符（客户端通常晚于一两个版本）。这些情况在 Outlook 用户界面中看起来十分类似。我们只在非常特殊的情形下看到过这种情况，就是当信任链中的中层 CA 已过期，并在它颁发的其他从属证书到期之前重新颁发。
基本上，这个问题发生在信任链中存在中断的情况下。有些父证书可能不具备完善的详细资料或者没有适当内嵌在叶节点中，进而使整个情况更加复杂。
若要解决此问题，发件人需要打开新邮件，并依次单击新邮件的“选项”、“安全设置”按钮以及“更改设置”按钮。现在单击适用于签名证书的“选择”按钮，然后单击弹出对话框上的“查看证书”按钮。转到“证书路径”选项卡，选择叶节点的颁发者（也就是在信任链中往上一层），然后单击“查看证书”按钮。依次单击“详细信息”选项卡、“复制到文件...”按钮，然后完成导出向导，选择 PKCS #7 (.P7B)。确定已选中“包括证书路径中所有证书”选项，如图 3 所示。最后，将导出的信任链文件发送到目标收件人。
图 3 修正证书链中的中断
图 3 修正证书链中的中断 (单击该图像获得较大视图)
获得导出的证书链后，收件人需要打开并导出信任链，做法跟我们之前导入根证书相似。一个区别是所选的存储文件夹应该是“中间证书颁发机构”。如果邮件已打开并且证书在 Outlook 中显示为有效，则一切都会适当运作。
至于第三个问题，即无法使用 CRL，解决方法相对简单。Outlook 的最初响应看起来与前一个问题非常相似。不过，即使根或中间签名 CA 是受信任的，也会显示错误。对于证书链中叶节点以上的每个级别，请依次打开证书的属性和“详细信息”选项卡，然后查看称为“CRL 分发点”的字段。
对于列出的每个 CRL 分发点（尤其是 Internet 可以访问的分发点），确保 CRL 文件 URL 可以打开。验证完每个级别则在信任链中向上移动一个级别。如果有任何 CRL 无法获得，则它可能是问题的根源。若要解决问题，您应该确认本地网络策略并没有阻止您的访问。否则，请尝试与拥有 CA 的公司联系或等待 CA 的 CRL 分发点恢复正常运作状态。

分发证书
分发是非常简单的过程。基本上，已签名的邮件传输到邮件服务器，该服务器然后通过可靠的方法（即 SMTP）将它从一个位置传送到另一个位置。对于传输中的已签名或已加密邮件，我们发现的一个问题是，有些邮件系统会拒绝或中断通过它们的已签名或已加密邮件。解决方法是与系统的 IT 经理合作来允许这些邮件类型。当然，您可能不得不接受某些邮件类型会被阻止的事实。接收方可能有正当的理由在特定的操作环境下不允许加密邮件。

加密回复
若要创建加密回复（假设上述启动过程已完成），发件人只需要新建邮件，然后在邮件撰写窗口中单击“加密”按钮（带有蓝色锁的黄色小信封，写着“加密”）。如果“加密”按钮不可用，请按照发送已签名邮件的步骤（最后一步除外），选中“加密邮件内容和附件”复选框。
将加密邮件发送到收件人并不需要 S/MIME 签名，但是两者搭配也无妨，因为签名可使读者验证发件人（加密功能并不会对发件人进行任何声明）。加密过程将尝试使用所有收件人已知的公钥来加密邮件。如果系统无法找到某些指定收件人的证书，则会在弹出对话框中将其标示出来，建议向其发送未加密邮件，如图 4 所示。
图 4 如果您 使用证书时遇到问题，可决定发送未加密的邮件
图 4 如果您 使用证书时遇到问题，可决定发送未加密的邮件 (单击该图像获得较大视图)
默认情况下，签名和加密应该与其他同等配置的客户端系统搭配使用，但是如果哈希或加密算法不支持下层的话，有时跨版本加密或签名邮件可能会产生问题。我们在将经过签名的电子邮件（使用 SHA-512 作为哈希算法）发送到运行 Windows XP SP2 的用户时，会遇到这样的问题。因为接收系统并不支持哈希，所以用户无法验证签名或阅读邮件。但是，除非 Outlook 默认值有所更改，否则用户不可能在这个阶段遇到太多问题。
收到邮件后，假如与共用证书相关联的私钥可用，目标收件人应该能够打开邮件。此外，用户可能需要提供其他令牌以证明持有私钥，具体取决于私钥的部署方式。已完成类似启动过程的其他用户可与发件人进行类似的签名和加密通信。如果用户更改了他的私钥（也许是因为计算机遗失），他必须重新请求证书，然后将签名邮件或证书文件重新分发到想要交换加密邮件的其他人。

结束语
使两个不同目录或组织中的两名用户之间能够进行签名和加密的 S/MIME 通常不会比我们刚刚所讨论的复杂多少。签名在使用得当时非常实用，因为它可增加邮件的真实性。对于敏感的详细信息，加密邮件为传输中的数据提供另外一个级别的安全保护。两者结合可实现来源的真实性和数据的秘密性。通过我们在本文中对过程的介绍，对于大多数用户来说，利用这些功能应该不成问题。

Matt Clapham是 CISSP，并在 Microsoft IT 担任安全性工程师。他白天对 LOB 应用程序进行安全性审查，晚上则涉猎技术、游戏、计算机音乐，或安全性。他偶尔会在 Puget Sound IT 安全性社区发表演讲。可通过电子邮件 matt.clapham@microsoft.com 与他联系。
Blake Hutchinson 在 Microsoft 的商务在线服务小组（Business Online Services Group，BOSG）担任支持分析师一职。他的职责包括为 BOSG 企业客户内部建立的 LOB 工具提供操作支持和项目审查。Blake 热衷于摄影、滑雪和计算机游戏。可通过电子邮件 blakeh@microsoft.com 与他联系。


编辑寄语 精彩辩论
Joshua Hoffman

我喜欢精彩的辩论。 我指的不是纯粹的意见分歧，否则，不同的看法和强烈的个性只会导致毫无意义的争吵。多么浪费时间啊！真正精彩的辩论应该是各持己见的聪明人聚在一起，充满激情地陈述各自的看法供大家考虑。这是一件令人兴奋盎然的事情，一种启发式思考，一种苏格拉底式思考。
本月，我们将向您展示一场 IT 行业中真正精彩的辩论 — 通过隐匿性来实现安全。在此，我想解释一下这个概念，不过，我想你们绝大多数人看到这几个字后已经有了自己的看法，并且很可能已大声说了出来。我基本上可以肯定你们大部分都会归入两大阵营：一些人声称“这种安全性根本没有用”，另一些人则认为“它对安全性应该有点用”。
本月，我们邀请了著名的安全性专家 Jesper Johansson 和 Roger Grimes 来分别代表辩论的甲乙双方。此外，我们还邀请了其他两位知识渊博的专家 Aaron Margosis 和 Steve Riley，分别对各方代表进行精彩的支持性解说。对我们发布的所有内容，我都感到相当自豪；但不得不承认，这篇文章是很久以来我最喜欢的文章之一。无论您支持这场精彩辩论的哪一方，我都希望您能够以开放的心态来阅读这部分内容。我确信您会喜欢它。
这是我们的年度安全性问题，当然，还包含许多其他内容。我们首先回顾去年介绍过的一些主题。去年最受关注的文章之一讨论了一组脚本提升 Power Toy，它们有助于在提升的上下文中结合 Windows Vista 的用户帐户控制功能运行 VBScript 或 Windows PowerShell 脚本，该文章的作者是特约编辑 Michael Murgolo。后来，Michael 收到了大量关于该文章的正面反馈，所以今年他又推出了一套全新的实用工具来扩展其功能。我强烈推荐您尝试一下这些功能强大的工具。
去年，Byron Hynes 也在我们的队伍中，他介绍了 Windows Vista 中的 BitLocker 驱动器加密功能。今年，Byron 继续发表高见，介绍发布的 Windows Vista SP1 和 Windows Server 2008 中 BitLocker 发生的变化。此外，我们还提供了一些文章，涉及软件限制策略、Windows Vista 防火墙管理、S/MIME 故障排除、新“深入剖析 SharePoint”专栏第二版、优化可持续计算的商业观点等。请尽情体验吧！—Joshua Hoffman

衷心感谢以下 Microsoft 技术专家： Troy Funk、Aaron Margosis、Michael Murgolo、Steve Peschka、Steve Riley、Mark Russinovich、Jon Schwartz 和 Jim Truher。


读者来信 读者心声

Windows 备份
看了您对 Windows Server® 2008 的介绍（《TechNet 杂志》，2008 年 3 月，technet.microsoft.com/magazine/cc268370），我非常兴奋，立即动手为家庭网络制作了一个副本。安装过程一切顺利。但是，备份时遇到了麻烦。
NT 备份已经删除，虽然操作系统支持磁带驱动器，但新的 Windows Server 备份却不支持它。（我在磁带驱动器中备份了个人数据，包括 Active Directory® 和 Exchange Server 2007。）
我按照网站上的提示下载了 Microsoft® Data Protection Manager (DPM)，尽管 DPM 可能会影响我的安装。但是，DPM 无法安装在 Windows Server 2008 上，按照手动安装说明进行操作也没有用。我该执行哪些小型安装才能完成备份呢？
—Ravi S.

DPM 确实是用于磁带备份的解决方案，未能成功是因为 Windows Server 2008 中的新解决方案已针对基于磁盘的存储进行了优化。在未来两个月内，DPM 将正式支持 Windows Server 2008。
—Karandeep Anand，Microsoft 高级项目经理主管

调查工作流
在 2008 年 2 月期刊的文章“构建强大的调查基础结构”(technet.microsoft.com/magazine/cc194407) 中，“单独使用 WSS”部分有下面一句话：“您还可以选择为调查分配一个工作流。”
我觉得 Windows® SharePoint® Services 3.0 (WSS) 和 Microsoft Office SharePoint Server 2007 (MOSS) 不支持与调查答复相关联的工作流。我曾尝试将工作流与调查答复相关联，尽管 SharePoint Designer 允许关联，但该工作流始终出现“启动失败”错误。在知识库文章 (support.microsoft.com/kb/926370) 中，清楚地阐明了不支持与调查答复相关联的工作流。
我知道可以将事件接收器链接到某个调查并启动一些其他进程，但实际上这并非 SharePoint 中通常引用的工作流。请问是这句话错误，还是我忽略了什么？
—Matt B.

所引段落讨论的是 WSS 如何为创建调查提供分步指导，并在其中介绍了各个选项（分支逻辑、公开/不公开的问题等）。
分配工作流是向导实际提供的选项之一；因此，在一定程度上，“您还可以选择为调查分配一个工作流”并非完全错误。您可以分配一个工作流。不过，就像您指出的那样，调查中的工作流确实无法运行，即使由于某种原因包括了该选项。让我来解释一下为什么会出现这种情况。
将工作流与调查相关联并尝试启动此工作流后，会收到“启动失败”错误。此活动的日志将显示如下内容：
RunWorkflow: System.ArgumentException: Invalid field name.
{<<< GUID>>>} at ...
GUID 表示该工作流实例它看起来能够确保触发正确的工作流，但“调查”列表类型不支持此工作流属性。这是由于没有编写相应代码造成的。因此，当尝试使用 MakeActivation 方法激活该工作流时，将执行如下操作：
internal static void MakeActivation(SPWorkflow workflow, SPWorkflowEvent e)
{e.EventData = new object[ ] { workflow.InstanceId, new SPWorkflowActivation
Properties(workflow, e.RunAsUserId, associationData, initiationData) };
...
}
它调用 SPWorkflowActivationProperties，如下所示：
internal SPWorkflowActivationProperties(SPWorkflow workflow,
int runAsUserId, string associationData, string initiationData)
{
...
this.m_itemGuid = new Guid((string)
this.Item[SPBuiltInFieldId.GUID]);
...
}
因此，如果希望将 GUID 字符串作为调查中的一个属性（显然应该采用内置形式），而调查中没有工作流 GUID 的属性，那么它将永远无法运行。
此问题有一种可行的解决方法，因此您的思路并没有错。解决方法是创建一个可触发工作流的自定义列表，并使用 ItemEventReceiver 将事件接收器链接到调查。此事件接收器会在自定义列表中创建一个项目，继而该项目即可触发工作流。但就像您说的，实际上这并不相同。简而言之，就是说您的理解完全正确，工作流实际上并没有用。
—Pav Cherny，《TechNet 杂志》“深入剖析 SharePoint”的专栏作家


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

通过网络发表公告
NetSupport Notify
www.netsupportnotify.com
基于 PC 的工作环境在办公场所几乎随处可见。大多数用户每天都面对电脑屏幕，并连接到您所管理的网络。除了为共享资源、应用程序以及 Internet 提供传输途径外，公司网络还可以作为组织策略的一部分，用于向用户传递重要消息。有一种工具可以帮助您通过局域网 (LAN) 和广域网 (WAN) 将消息传递给用户，这种工具就是 NetSupport 公司推出的 NetSupport Notify。
这个轻型应用程序服务器可为您提供快速、可靠的广播消息支持。例如，您可以轻松警告用户共享资源出现异常的服务丢失，告知用户他们听到的安全警报是由意外所触发的，或者通知员工大楼紧急事件。
您可能已经使用过某些简单的广播消息工具，但这些工具只能用于所安装的 LAN。而 NetSupport Notify 以代理为基础，拥有自己的通知网关组件，可以轻松遍历您的网络拓扑，到达 Windows® 客户端和 Mac 客户端 — 无论这些客户端是直接连接、经由无线连接、还是通过虚拟专用网络进行连接的。
通知服务作为 Windows 服务运行，您可以通过管理通知控制台（可安装在同一计算机或不同的计算机上）连接到此服务。来自服务的通知分为三种严重程度级别：消息、警报或重要。客户端收到消息后，便建立一个事件日志条目，并通知服务器已收到消息。其他消息选项包括除显示窗口外还播放嘟嘟声、强制此通知始终可见，以及对消息设置自动超时以便自行关闭。
您还可以选择仅以特定的通知组为目标。通知控制台可以连接到多个通知服务器，因此，一个控制台可以成为消息广播中心。
除服务器和控制台之外，NetSupport Notify 还包含部署工具，使您可以远程为最终用户部署代理，而无需再访问用户的桌面。您可以利用 IP 地址范围或经由 Windows 网络域和工作组探索功能来指定目标计算机。
部署控制台上会显示已安装的代理版本以及重要部分（如 DNS 名称、MAC 地址、IP 地址、平台）和控制台是否有权访问远程计算机，借助于部署控制台，您还可以快速检视自己的网络。如果您使用的是 Active Directory®，则可以通过组策略管理配置和部署。
为了防范未经授权的广播（如“大家好，我的办公室 4 点会举办一个聚会！”），代理和控制台采用类似于 Windows 管理规范 (WMI) 密钥字符串的安全代码。此外，您可以控制通过 Active Directory 策略发送警报的功能。
价格： 75-用户许可证起价 180 美元。
使用 NetSupport Notify 向您的员工发送通告
使用 NetSupport Notify 向您的员工发送通告 (单击该图像获得较大视图)

监控您的网络
NetOptics：Teeny Tap
www.netoptics.com
与良好的监控应用程序配合使用，被动网络分流器也可以当作一个重要的工具来排除不可靠的网络、修复异常的应用程序，以及减轻对基础结构的潜在威胁。我注意到有一个不错的 10/100 网络分流器，即 NetOptics 推出的携带极其方便的 Teeny Tap。
这个 3.125 英寸乘 1.5 英寸的“迷你”设备，从第 1 层起提供全双工流量监控，可使您轻松抽查或持续监控 10/100 网络的流量。这个设备利用两个监控 RJ45 端口实现全双工监控功能，使您可以深入了解在这两个端口都连接到网络监控器、协议分析、IDS/IPS 或其他探测器时，流经这两个网络端口的两端的流量。
Teeny Tap 不需要 IP 地址。通过将您与网络隔离，您可以保持处于不可见状态，以免有人在看到您后停止对网络的恶意使用。同时，Zero Delay 功能可确保分流器断电时不会影响通过分流器的通信流量 — 分流器处不应出现延迟或数据包丢失的情况。
分流器可以通过 USB 充电或使用其随附的电源，或者同时使用两者当作后备资源，这么小的设备具有这样的功能是很了不起的。Teeny Tap 也与基于 Power over Ethernet 的服务兼容，如网络照相机和 IP 电话。因此，您还可以监控此类服务的流量以确保通信安全。
Teeny Tap 工具包中含带分流器、通用电源、两个跳线和两条直通型 RJ45 缆线及一个手提箱。如果您的环境中需要更多的动力，您可能希望挑选 NetOptics 提供的其他网络分流器产品。产品系列涉及从小型办公室网络到大型企业环境的整个范围，从 10MB 到 10GB 的产品都有，既有适用于铜缆网络的产品，也有适用于光纤网络的产品。
价格： 325 美元（直销价）。
使用 Teeny Tap 监控您的网络
使用 Teeny Tap 监控您的网络 (单击该图像获得较大视图)

优化您的计算机
DTweak 专业人员
www.daoisoft.com
作为 IT 专业人员（和一般的技术发烧友），您肯定希望改良自己的系统，尽可能提高日常作业的效能，改善自定义体验。市面上有许多工具都能帮助您优化和自定义用户在运行 Windows Vista® 的计算机方面的体验。如果追求成本低廉，则 Daoisoft 推出的 DTweak Pro 是一个不错的选择。（此外也提供了适用于 Windows® XP 和 Windows Server® 2003 的版本。）
此应用程序提供了大量视图，可以快速查看 Windows Vista 中不同的工具和自定义。例如，在“日常工具”部分，您可以运行注册表清理程序、文件清理实用程序、注册表和磁盘碎片整理工具和硬盘性能监视器。
通过 DTweak，您还可以轻松查看和按需定制启动项目、获取 CPU 信息（包括 CPU ID、总线速度和时钟速度）以及收集计算机信息，如供应商、启动状态、内存配置和系统类型。您甚至还可以调整 I/O 缓存内存及等待结束崩溃程序和挂起服务的时长。
GUI 的工具部分提供指向内置 Windows Vista 工具（包括 diskpart 和系统还原）的链接和指向便捷网络工具（如 finger、ping、netstat 和 nslookup）的链接。其他网络调整包括：调整您最大的传输单位、TCP/IP TTL 和 DNS 超时设置，以及使用 QoS 数据包计划程序服务限制带宽。
价格： 29.95 美元（直接下载）。
使用 DTweak 调整和优化您的系统
使用 DTweak 调整和优化您的系统 (单击该图像获得较大视图)

书讯
Microsoft Exchange Server 2007 Administrator's Companion
www.microsoft.com/mspress
电子邮件可以说是一头挑剔的怪兽。例如，您无法真正控制传入消息的流量。如果您试图通过挂起 SMTP 服务器直到队列减少的方式击退传入的洪流，则发件人很可能会收到“无法递送消息”的通知。用排水系统比喻这种情况非常恰当 — 水不停地流，如果您关闭某一段的管阀，就存在另一段管阀会爆裂的危险。如果您希望整个企业运作平稳，那么规划完善、经过良好优化而又灵活的电子邮件基础结构就非常重要。
很显然，Microsoft Exchange Server® 2007 旨在处理大量的邮件，而且它的设计允许您量身定制基础结构以满足组织现在和以后的需求。但在 Exchange 2007 部署中，可选用的选项和决策非常多。而且 Exchange 涵盖的内容不只是电子邮件，这使您要完成的任务更加复杂。
您确实需要一两种参考资料来帮助您创建正确的体系结构和制定管理决策。其中一种不可或缺的参考资料是《Microsoft Exchange Server 2007 Administrator's Companion》。
该书涵盖了从规划和部署到维护和安全性的整个产品部署生命周期。书中还讨论了适用于 Exchange 2007 的各种客户端和客户端连接选项。书中首先概述了各版本之间的差异和 Exchange 2007 的新功能。您还可以全面了解 Exchange Server 2007 的各种体系结构组件。
接下来的章节介绍如何规划部署 Exchange，并说明了如何计算存储需求、服务器和处理器需求以及如何添加容错。书中继续讨论介绍实际的安装和部署过程，说明如何针对 Exchange 准备服务器以及如何安装该软件的不同组件。您甚至可以读到有关群集 Exchange 服务的深层参考资料，以获得更高级别的可用性。
该书接着介绍大量供您使用的管理工具，例如 Exchange MMC 面板和新增的基于 Windows PowerShell™ 的 Exchange 命令行管理程序。本书包含各种知识，从创建邮箱到创建存储组的方法以及备份和还原操作的相关内容。此部分的另一亮点是向您展示如何使用管理 GUI 及通过 Windows PowerShell 的命令行执行所有这些操作。
Exchange 2007 具有大量的统一消息功能，通过这些功能，您可以使用一个系统同时管理数据和语音通信，本书还介绍了如何设置和使用语音消息、传真消息和基于语音的收件箱访问，这里只是举几个例子。
在深入探讨维护的部分，本书介绍了基本的故障排除技术和工具、损坏和灾难恢复以及性能调整。显然，对任何统一消息系统来说，安全性都应该是首要考虑因素 — 本书深入介绍了可以保证部署安全性的信息。您可以学习到安全策略和指南、防病毒和反垃圾邮件功能以及公钥基础结构。
最后，本书介绍了 Exchange 客户端和如何支持组织中的其他 POP3 与 Internet 消息访问协议客户端。总之，无论管理员是希望规划、维护 Exchange Server 2007 服务器统一消息平台还是只是对 Exchange Server 2007 服务器统一消息平台感兴趣，这本书对他们来说都是不错的一般性参考资料。
价格： 49.99 美元（定价）。
(单击该图像获得较大视图)

Greg Steen 是一位技术专家和企业家，酷爱钻研技术。他总是在寻找各种新工具，以帮助 IT 专业人员更轻松地进行操作、完成 QA（质量保证）工作和开发。


SQL 问题与解答 I/O 错误、数据库镜像及更多内容
Paul S. Randal

问：我一直在对自己管理的数据库运行常规一致性检查，甚至还添加了一些 SQL 代理警报以捕捉用户查询遇到的任何 I/O 错误。但是，我不知道自己针对检查和警报实现的逻辑是否起作用，因为所有数据库都没有出现过损坏问题。我如何在测试数据库中创建一些损坏，以便确认做出的每项设置都能正常工作？此外，是否还应使用其他方法来检测 I/O 错误？
答：在 SQL Server® 2000 中，创建供测试用的损坏数据库的传统方法是手动从测试数据库的 sysindexes 表中删除一行。但在 SQL Server 2005 中，以这种方式损坏系统表非常困难。自己损坏测试数据库的最佳方式是在数据库关闭时，使用十六进制编辑器更改数据文件。操作步骤如下：
  • 关闭数据库，以解除对数据文件的锁定。（但请注意不要拆离数据库，因为如果损坏的页面出错，可能无法将其还原。）
  • 在文件中选取若干页的偏移（例如 100 页，至少 819200 个字节），但要确保它不超过 8192 字节的边界（页边界）。这样就不会波及重要的元数据页面和分配位图，使您能够启动数据库并对其运行 DBCC CHECKDB。
  • 在文件中所选的偏移处写入几个字节，内容全部为零。通常使用这种方法来确保引入一些页眉损坏错误。
也就是说，创建损坏的测试数据库的最快捷方式就是使用别人已创建好的数据库。我的博客（网址是 go.microsoft.com/fwlink/?LinkId=115151）上提供了损坏的 SQL Server 2000 和 SQL Server 2005 数据库的示例（包括说明）。
您的第二个问题是应执行哪些操作来检测 I/O 错误 — 应启用页面校验和。SQL Server 2005 中引入了此功能，以防止整个数据库页出现由子系统带来的 I/O 错误。
基本上，将某页写入磁盘后，SQL Server 要做的最后一件事就是计算整个 8KB 页面的校验和并在该页上标记此校验和。从磁盘中读取某页时，如果该页具有页面校验和，则会重新计算校验和，并将此值与该页上存储的值进行比较。如果二者不符，则表示此页在 SQL Server 外部被损坏，并会引发 824 错误。此错误将在读取此页的连接过程中出现，并记录到 SQL Server 错误日志和 Windows® 应用程序事件日志中。
默认情况下，在 SQL Server 2005 和 SQL Server 2008 上创建的所有数据库的页面校验和功能都处于启用状态。但对于从 SQL Server 早期版本升级而来的数据库，则必须手动启用。您可以使用以下代码来启用页面校验和：
ALTER DATABASE mydb SET PAGE_VERIFY CHECKSUM;

提示：更改默认的 SQL Server 端口
默认情况下，为 SQL Server 实例配置的端口是 1433。一旦此端口被某个实例占用，则无法再供其他实例使用。因此，如果您安装了另一个（已命名）实例用于侦听使用 tcp 的网络，则还需要另外一个端口。而且在某些情况下，管理员可能为了避免混乱而更改端口（尽管这种混乱微不足道，可以通过端口扫描程序轻松解决）。当然，此后您必须将客户端配置为使用其他端口。常用的方法有以下三种。
第一种方法，假设管理员将某个实例的端口更改为 5555，您可以轻松地使用语法 MyServername,5555 在要连接到的机器名中指定此实例的端口号。如果端口再次更改，则客户端也必须再次更改其 connectionStrings。
第二种方法是使用客户端上配置的 SQL Server 别名。除指定别名外，还必须指定服务器名称、端口名称和协议。配置好后，即可使用此别名连接数据库实例，连接方法与使用服务器名方式相同。此方法的好处在于域管理员可以部署服务器配置更改，因为这些设置都存储在注册表中。
第三种方法是使用 SQL Server Browser 服务，适用于已命名实例。在这种情况下，用户只知道实例名称，并在 connectionString 中使用 MachineName\InstanceName 指定该名称。此方法在 SQL Server 2000 中已作为运行服务的一部分实现。但在 SQL Server 2005 中，SQL Server Browser 服务作为一项单独服务构建。除了对计算机执行实例发现外，它还会在端口 1434 上使用所请求实例的相应端口号应答传入用户数据报协议 (UDP) 请求，从而实现客户端的重定向并支持透明连接。
—Jens K. Suessmeyer，Microsoft 的数据库顾问

问：为了消除数据库中的所有碎片，我设置了一个夜间维护计划，重新构建在 SQL Server 2005 Enterprise Edition SP2 上运行的生产数据库中的所有索引。我注意到此方法会导致数据库过度增长，因此添加了一个缩减所有额外空间的步骤，因为磁盘上剩余的空间已不足。但现在，重新生成操作似乎不起作用了。这是怎么回事？
答：这是人们设置维护计划时经常遇到的一个问题。您陷入了“收缩-增长-收缩-增长”循环。
在重新生成索引时，会在原有索引删除前创建该索引的一个新副本。此过程需要占用数据库文件中的额外空间 — 通常与当前索引占用的空间量相同。在 SQL Server 2000 中，排序索引行也需要额外的空间（大约为索引大小的 20%），但在 SQL Server 2005 中仅重新生成索引已不再有此项要求。
有时，管理员希望删除重新生成索引时产生的额外空间，因此会在维护计划中的重新生成步骤后添加一个收缩操作。但是，人们并不知道此收缩操作会由于算法本身的原因导致索引碎片。这意味着，最近重新生成且经过碎片整理的索引会立即变成碎片，从而使之前重新构建索引的努力毁于一旦。
假设数据库文件只在下次重新生成索引时才会再次增长，则最好允许数据库中留有额外空间并完全避免运行收缩操作。（此外，连续增长和收缩数据库文件还会导致操作系统级别的文件碎片 — 此类碎片会像索引碎片一样降低系统性能。）
最后，您还可能要考虑降低重新生成索引的频率，甚至可能需要尝试使用其他方法，例如使用我为 SQL Server 2000 编写的旧 DBCC INDEXDEFRAG，或 SQL Server 2005 和 SQL Server 2008 中较新的 ALTER INDEX REORGANIZE 语法。
有一本白皮书用途很大，其中介绍了索引碎片并针对何时消除碎片提供了指导（网址是 go.microsoft.com/fwlink/?LinkId=115154）。虽然此书是针对 SQL Server 2000 编写的，但其中的概念仍然适用。

问：我们一直在组织内尝试灾难恢复策略，并且认为数据库镜像非常适合我们的情况。我尝试保护的服务器中有很多无关数据库（由前期服务器合并项目导致），但是希望对所有这些数据库使用数据库镜像。我想知道，在保证性能的前提下最多能镜像多少个数据库？
答：这个问题的答案就是我常说的：视情况而定！已发布的指南中指出，对每个实例进行镜像的数据库不得超过 10 个，这只是根据大部分用户的情况所做的粗略估计。您需要针对硬件设置考虑以下因素：
  • 主实例和镜像实例的内存多大？（理想情况下，二者应该相同。）
  • 主实例和镜像实例的处理能力如何？（二者也应相同。）
  • I/O 子系统在镜像实例上的带宽是多少？（应与在主实例上的带宽相同。）
  • 每个数据库上的工作负荷生成的事务日志量是多大？
  • 主实例和镜像实例之间有多少可用网络带宽？
最后两个因素是最重要的。如果两个实例之间的可用网络带宽不足，无法处理要镜像的所有数据库每秒生成的所有事务日志，则主数据库的性能将下降。SQL Server 2008 可使用日志流帮助减轻部分负担。
接下来要考虑的重点是镜像的内存和线程要求。每个镜像数据库都会占用一个线程和部分内存。如果服务器的功耗比较低，则众多镜像数据库与常规工作负荷加起来，会导致服务器负载过重。
您还需要考虑运行数据库镜像的方式。在同步模式下，只有将所有事务日志记录复制到镜像数据库的事务日志后，才能提交主数据库上的事务。因此，由网络超负载引起的任何延迟都会导致主数据库出现工作负荷性能问题。
在异步模式下，主数据库上的事务不必等待即可提交，但是网络延迟可能会导致等待发送到镜像的事务日志量增加。这会导致事务日志大小方面的问题。更糟糕的是，如果出现失败，尚未发送的所有事务日志都将丢失。因此，未发送的事务日志越多，在恢复过程中丢失数据的可能性就越大。
应用方案可能相差很大，我曾在实际生产环境中看到过一些有趣的例子。例如，我曾见过包含 150 个数据库的环境，每个数据库中的活动量较少，而且并非始终同时活动。这 150 个数据库都能够成功进行镜像。
相反，我还曾看到过只包含三个高负载数据库的设置，但网络连接不好。在该方案中，只能对一个数据库进行镜像，否则就会由于网络带宽不足而导致工作负荷下降。
成功镜像的关键在于先计算出日志生成量。如果计算结果表明可用网络带宽能够支持要镜像的数据库数目，则可能会成功。在投入生产前需测试您的配置，确保包括可能生成事务日志的所有操作，尤其是您可能执行的所有数据库维护操作。

Paul S. Randal 是 SQLskills.com 的主管，也是 SQL Server 的 MVP 之一。从 1999 年到 2007 年，他一直在 Microsoft 的 SQL Server 存储引擎团队工作。Paul 曾编写 DBCC CHECKDB 来修复 SQL Server 2005，并在 SQL Server 2008 开发过程中负责核心存储引擎部分。Paul 是灾难恢复、高可用性和数据库维护方面的专家，经常出席一些会议。他的博客地址是 SQLskills.com/blogs/paul。


实用程序特别推荐 Windows Vista 升级顾问
Lance Whitney

现在应该计划 将组织中的系统升级到 Windows Vista® 了。像所有升级一样，您需要解决几个问题。您的网络客户端满足硬件和软件要求吗？您将面临哪些兼容性问题？为了帮助您解答上述问题及一些其他问题，Microsoft 提供了免费的 Windows Vista 升级顾问。此实用程序将扫描 PC 上配置的所有硬件和软件，以确定升级是否可行。如果可行，顾问会向您推荐最佳的 Windows Vista 版本，并显示在升级之前需要解决的所有问题。
升级顾问扫描通常需要几分钟。在扫描过程中，会出现一个图表，其中列出了 Windows Vista 的不同版本，并对各个版本的功能进行了比较。您还可以选择一个特定版本（Ultimate、Home Premium、Business 或 Home Basic）查看其简要说明和重要功能列表。扫描完成后，报告详细屏幕将显示您的 PC 是否能够升级到 Windows Vista，以及建议升级到哪个版本。详细信息包括：
系统要求 说明您的硬件（CPU、RAM、视频内存和 CD/DVD 驱动器）是否符合要求。如果不符合，将显示升级您的 PC 所需改进的硬件配置，例如需要增加多少内存。
设备 检查所有外部设备和驱动程序，包括调制解调器、打印机、扫描器、声卡、显示器和视频卡。如果某个设备未通过兼容性测试，则报告中将说明需要执行的操作，例如从制造商网站下载最新的驱动程序。为方便您操作，报告中将提供指向该网站的链接。
升级顾问将报告已知的兼容性问题并提供建议的解决方法 (单击该图像获得较大视图)
程序 分析已安装的软件。您将了解哪些应用程序可以在 Windows Vista 下正常运行，哪些应用程序与此系统不兼容或需要升级才能通过测试。
如果某个组件无法通过某个功能比较强大的 Windows Vista 版本（如 Ultimate）的兼容性测试，您可以返回到介绍性屏幕选择其他版本（如 Business）。然后，您就会看到您的 PC 是否符合该版本的所有要求。
最后，会出现一个任务列表，其中描述了您的 PC 的硬件配置，并分项列出了您在安装 Windows Vista 前后需要执行的任务。该表还总结了前面几个屏幕中的项目并提供了一些附加建议，如屏幕快照所示。您可以打印该任务列表，也可以将其另存为 HTML 文件。
升级顾问需要在 32 位 Windows Vista 或 Windows® XP Service Pack 2 环境下运行，并需要 Microsoft® .NET Framework 2.0 和 MSXML 6.0。要了解详细信息并下载此工具，请浏览到 microsoft.com/windows/products/windowsvista/buyorupgrade/upgradeadvisor.mspx。

Lance Whitney 是一位 IT 顾问、培训师和技术撰稿人。他投入了很多的时间和精力来改进 Windows 工作站和服务器。15 年前，当他还是一名记者时，就开始涉足 IT 世界。


深入剖析 Sharepoint 分散的网站管理
Pav Cherny

下载本文中所用的代码: SharePoint2008_06.exe (1160KB)

Microsoft Windows SharePoint Services (WSS) 3.0 和 Microsoft Office SharePoint Server (MOSS) 2007 支持灵活的管理和安全模型，使 IT 组织可以集中控制基础结构组件，如 Web 服务器和数据库服务器，并通过托管分散控制
网站集和网站。集中的 SharePoint® 基础结构有助于减少维护开销、统一业务逻辑，提供对 SharePoint 资源的单一访问点，并避免不必要的技术投资。
同时，分散的网站管理可确保各部门保留对各自 SharePoint 网站集、网站、文档库、列表、工作流解决方案和其他 SharePoint 资源的自主控制。不过，将网站管理委派给各个部门有一个副作用，即增加了 IT 部门的维护难度。例如，如果无法访问环境内的网站集和网站，如何跟踪资源使用情况、过期的 SharePoint 网站和集中式基础结构中的过时内容？
在本文中，我将讨论 WSS 3.0 的安全模型，包括将 SharePoint 网站的管理控制委派给各个部门同时维护 SharePoint 基础结构的集中式管理控制时，会带来什么好处和影响。我介绍的内容包括：委派的网站管理如何运作；网站、列表和项目级别的访问权限和安全修整如何帮助维护既安全又易用的工作环境；以及 Web 场管理员如何在不提高 SharePoint 权限的情况下访问必要的网站统计信息。
如果要在测试实验室中参照我的介绍，请从 technetmagazine.com 下载本专栏的随附材料。材料包括基于 Windows Server® 2008 Web 场的详细部署说明，这些内容合理反映了一家具有多个部门的公司的生产环境。

SharePoint 基础结构和网站集管理
您可以根据单一服务器部署或 Web 场部署构建 SharePoint 基础结构。实际上，许多公司兼有上述两种情况。单一服务器部署适用于需要直接快速的协作解决方案的各个部门。性能和可靠性要求最低。如果部门的 SharePoint 服务器（通常部署在工作站硬件上）不可用，用户比较容易谅解，因为部门本身要负起系统维护责任，而该部门内的用户毕竟不是 IT 管理员。
如果是由 IT 部门维护服务器资源，情形便会完全不同。性能和可靠性成为关键因素，用户经常要求部署高可用性解决方案以确保遵循服务级别协议 (SLA)。负载平衡的 Web 场部署、SQL Server® 故障转移群集以及存储在存储区域网络 (SAN) 中的数据库都有助于满足公司的性能和高可用性需求。参见图 1 提供的体系结构说明。
图 1 SharePoint 基础结构与 SQL Server 故障转移群集和 SAN
图 1 SharePoint 基础结构与 SQL Server 故障转移群集和 SAN (单击该图像获得较大视图)
如图 1 所示，在集中式 SharePoint 基础结构中，多种类型的管理员必须相互合作来维护资源，但这些管理员会从不同的角度观察环境。例如，网站集管理员不会注意到基础结构中的服务器。网站集管理员使用标准 SharePoint 用户界面进行工作。无论是将网站承载到在办公室中运行 WSS 3.0 的计算机上还是在数据中心的 Web 场上，此界面都不会改变。
数据库管理员和 SAN 存储工程师也不会看到 SharePoint 基础结构。对这些管理员来说，SharePoint 数据库与其他 SQL Server 数据库没什么不同，而且 SQL Server 故障转移群集的逻辑单元号 (LUN) 与其他 LUN 也没什么不同。Web 场管理员是与 SharePoint 基础结构最直接相关的管理员，不过他并不能控制网站集、数据库或 LUN。
也可以这样说，部门的网站集管理员通常不了解基础结构的详细信息。毕竟，在部门中设置网站和授予团队和组访问权限并不需要知道这些细节。创建新网站和开始协作的过程很简单，很少会出现与 SAN 技术相关联的高存储成本等问题。
在每个项目与计划中，新工作组网站出现、过期网站滞留、过时内容未删除，而且 SharePoint 环境迅速增长，直到范围大到系统管理员无法再忽视为止。例如，在 2006 年 Microsoft IT 发起简化计划前，Microsoft 内部的 SharePoint 环境包含的网站一度超过 180,000 个。
网站集管理员学习相关知识有助于控制集中式 SharePoint 基础结构中的情况。应用网站集配额和锁定也很有用，但是在处理浪费宝贵存储空间和备份资源的过时工作组网站和内容时，效果不是很明显。
过时内容不一定会使网站集超过其配额。当然，您可以使用 SharePoint 3.0 管理中心网站中的“网站使用确认与删除”功能，将 SharePoint 配置为向网站集所有者发送电子邮件通知并在指定期间后自动删除未使用的网站集，但这项功能对个别网站级别不起作用。网站集可以包含当前网站和过时网站，但“网站使用确认与删除”功能在此粒度级别不起作用。
稍后我将介绍如何通过检查文档和列表项目的上次修改日期来识别未使用的网站和过时的内容，即使没有对网站集的访问权限也无妨。此报告功能并非直接提供，但幸好实现方法并不困难。

分散的 SharePoint 网站管理
委派 SharePoint 网站管理特权非常简单。通过使用 SharePoint 3.0 管理中心网站、命令行工具 Stsadm.exe 或自定义设置工具，您可以在基础结构中创建 Web 应用程序、托管路径和网站集。作为 Web 场管理员，您可以在创建网站集时指定主要和辅助网站集管理员。这些网站集管理员可以是常规的域用户。他们不需要 Web 场或其他基础结构服务器的管理权限。这些管理员在 SharePoint 用户界面中直接使用其 Web 浏览器执行网站管理任务。
图 2 显示委派的网站管理，您可以在随附材料的工作表中找到分步说明。在本例中，Web 场管理员为 HR 部门 (http://sharepoint/hr) 和 IT 部门 (http://sharepoint/it) 设置单独的网站集。
图 2 委派的 SharePoint 网站管理
图 2 委派的 SharePoint 网站管理 (单击该图像获得较大视图)
然后，HR 和 IT 管理员可以使用 SharePoint 用户界面中“网站操作”菜单下的“网站和工作区”功能创建子级网站，而且可以应用父网站的权限，或针对子级网站定义新的管理和用户权限。注意，除非显式配置，否则 Web 场管理员无法访问任何顶级或子级网站，HR 管理员无法访问 IT 网站，而 IT 管理员无法访问 HR 网站，虽然所有网站都承载在同一 SharePoint 环境中。
网站集和网站层次结构的设计取决于组织需求。在图 2 示例中，我并未在 http://sharepoint/hr 和 http://sharepoint/it 上创建主网站。换句话说，http://sharepoint 路径上没有网站集。不过，您可以轻松地在此路径中或使用其他托管路径创建网站集，如 http://sharepoint/sites/hr 和 http://sharepoint/sites/it。
您也可以为 HR 和 IT 创建单独的 Web 应用程序，以便建立更直观的基础 URL（如 http://hr 和 http://it），针对各部门设置常规门户网站，然后使用汇总 Web 部件列出这些主网站的子级网站信息。单独的网站集可促进自我管理；有助于限制对部门信息的访问；为母版页、页面布局、模板、Web 部件和导航控制提供个别自定义功能；而且可用于在专属内容数据库中放置机密数据，以区别于其他网站集和内容数据库。

角色、网站权限和安全修整
如果存在网站集并已委派管理权限，则网站集管理员就可以打开顶级网站，并使用“网站操作”菜单下的“网站设置”功能来管理网站集。这包括添加（或删除）具有网站集中所有网站的完全权限的其他网站集管理员、创建组、使这些组与角色关联，以及将用户添加到这些组以获取读取和参与者权限。它还包括设置子级组网站和工作组网站的功能。
虽然您可以分别为用户授予 SharePoint 权限，但最好根据特定角色创建 SharePoint 组。例如，SharePoint 包含针对访问者、参与者和所有者角色的三个默认组。访问者拥有只读访问权限；参与者可以将项目添加到列表和文档库，也可以个性化网页；所有者拥有完全控制权限。
有一项功能值得一提，就是 SharePoint 会根据用户角色执行安全修整，这意味着用户在用户界面中看到的链接和项目仅限于他们实际上有权访问的链接和项目。如果禁止用户访问某项资源，如某列表（通过在“列表设置”下配置显式权限）或所选列表项（通过使用项目上下文菜单中的“管理权限”命令），该列表或项将消失。如果用户在浏览器中直接指定项目的 URL，用户就会看到“错误：拒绝访问”页面。
图 3 显示安全修整的运行情况。HR 管理员具有完全权限，并且能够使用“网站操作”菜单执行管理任务。另一方面，HR 访问者只有网站集的只读权限，而且看不到此菜单。
图 3 SharePoint 界面中基于用户角色的安全修整
图 3 SharePoint 界面中基于用户角色的安全修整 (单击该图像获得较大视图)
安全修整非常有用，因为它会隐藏无法访问的功能、链接和项目，但这也意味着 Web 场管理员如果没有访问权限，就无法使用 SharePoint 用户界面列出网站和网站资源。您将无法在网页或 Web 部件中看到这些资源。此外，无法访问的资源不会显示在搜索结果中，因为 SharePoint Enterprise 搜索会根据提交查询的用户的身份来运行安全修整。

那命令行呢？
如果图形用户界面无法在不提高网站集级别权限的情况下提供访问所需信息的方法，也许命令行工具 Stsadm.exe 能提供解决方案。例如，您可能认为可以使用命令
Stsadm -o enumsites -url http://sharepoint
列出 http://sharepoint Web 应用程序中的所有网站集和所有者。然后，您应该可以使用以下命令列出所有子网站：
Stsadm -o enumsubwebs -url <site collection>
但是，在 Web 场环境中，Stsadm.exe 的响应往往是一条错误消息，指示缺少该数据库的访问权限。即使您是 Web 场管理员，而且可以管理 SharePoint 3.0 管理中心中的网站集，Stsadm.exe 也还是无法枚举网站集。如果您在没有 SQL Server 访问权限的情况下在 Web 场上使用 Stsadm.exe，则会收到以下错误消息：
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\BIN>stsadm -o enumsites -url http://sharepoint
<Sites Count="2">
<Site Error="Cannot open database &quot;WSS_Content&quot; requested by the login.The login failed.&#xD;&#xA;Login failed for user 'CONTOSO\SPAdmin'.">
<Site Error="Cannot open database &quot;WSS_Content&quot; requested by the login.The login failed.&#xD;&#xA;Login failed for user 'CONTOSO\SPAdmin'."/>
Web 场管理员之所以会收到此错误消息，是因为 Stsadm.exe 在已登录用户（如 CONTOSO\SPAdmin）的环境中运行，而 SharePoint 3.0 管理中心网站是在与 SharePoint 管理中心 v3 应用程序池相关联的系统帐户（如 CONTOSO\WssConfigAdmin）的环境中访问 SharePoint 数据库。虽然授予您在 SQL Server 内容数据库中的 db_owner 帐户权限可让您运行 Stsadm -o enumsites -url http://sharepoint 命令，但您仍无法枚举网站集中的子级网站。命令 Stsadm -o enumsubwebs -url <site collection> 返回访问被拒绝。（HRESULT 发生异常：0x80070005 (E_ACCESSDENIED)），您又得重新开始。不过，有一个更好更有效的方法，该方法无需提高 SQL Server 权限。

内容数据库中的网站信息
如果无法通过标准 SharePoint 界面和工具获取所需信息，则必须直接使用 SharePoint 内容数据库。不过先要提醒您 — 这是最后一招！内容数据库依靠专属架构和数据库结构，而 Microsoft 只在 WSS 3.0 SDK 中记录部分专属架构和数据库结构，旨在劝阻客户直接使用数据库。您应该尽可能使用 SharePoint 用户界面、命令行工具、对象模型或 Web 服务来访问所需信息。
如果没有其他选择，必须直接使用数据库，则您至少要将解决方案限制为只读访问。不要试图修改数据库架构或数据库结构，否则会导致严重问题，使得您必须从备份还原网站集或重新安装 SharePoint Web 场。
实现报告解决方案来直接访问内容数据库还有一个替代方案，就是将 Web 场管理员帐户指定为网站集配置中的辅助所有者。Web 场管理员可以在 SharePoint 3.0 管理中心网站中执行这个步骤。您可以在“应用程序管理”页的“SharePoint 网站管理”下找到对应的“网站集管理员”链接。
作为辅助网站集管理员，您可以在 Web 浏览器中打开网站集，显示“网站设置”，然后单击“网站管理”下的“网站使用率报告”链接（前提是您在 SharePoint 3.0 管理中心内启用了“使用率分析处理”）。如果要跟踪 SharePoint 服务器上日志文件中的使用率数据，请参考“操作”页面上的“日志记录和报告”。默认情况下，“网站使用率报告”功能处于禁用状态。
但是，如果环境中有大量网站集或严格要求，使您无法对 Web 场管理员授予必要的权限，那么针对各个网站集手动创建“网站使用率报告”就不切实际了。更务实的方法是实现直接 ASP.NET 报告应用程序，从内容数据库列出所有网站集和网站，同时也列出重要的统计信息，如项目数量、所有项目的总大小以及项目的上次修改日期，如图 4 所示。
图 4 直接从内容数据库获取网站统计信息
图 4 直接从内容数据库获取网站统计信息 (单击该图像获得较大视图)
如果您以 SharePoint 管理中心 v3 应用程序池帐户的身份来运行此应用程序，则可以访问内容数据库，而无需提高 SQL Server 权限。如前所述，管理中心帐户已经具备必需的 SQL Server 权限。
随附材料包含对 SQL 服务器的内容数据库使用 SELECT 查询的简单报告解决方案，还包含在 Web 服务器上部署此解决方案的分步说明。务必注意，我并未实现任何安全性检查。此解决方案会通过匿名验证运行。
管理中心帐户提供必需的安全上下文以访问内容数据库，因此无需验证用户。对于解决方案的网站，我使用了自定义端口，通过 Windows Server 2008 的 Windows® 防火墙进行了锁定，因此只有本地用户才能打开 Web 应用程序。这样可满足测试环境的安全性需求，但是在生产环境中，您应该进一步加强安全性，如启用 Windows 验证和针对 ASP.NET 应用程序的虚拟目录配置受限的访问权限。

结束语
SharePoint 提供了灵活的网站集和网站管理功能，使您可以集中处理 SharePoint 基础结构，同时根据公司的特定需求分散网站管理。集中式基础结构对于任何规模的公司都有帮助，因为统一的环境有很多优点：有助于降低成本；促进部门内部和跨部门的信息共享；提供应用专业知识的基础，使用目标方法维护环境的高安全性、可靠性和可伸缩性；以及为用户提供公司网络中网站与 SharePoint 资源的单一访问点。
同时，各个部门和业务部门仍可以继续控制其 SharePoint 资源。Web 场管理员可以指定网站集管理员，然后这些管理员会在其责任范围内执行网站管理任务，而无需 IT 部门介入。
然而，将控制权交给各部门的同时，Web 场管理员也丧失了使用标准 SharePoint 功能和工具监视基础结构中资源使用情况的能力。对内容数据库应用配额、向网站集管理员发送电子邮件提醒以及基于报告目的跟踪使用率数据，这些方法都能帮助减缓问题；但是，若要有效管理 SharePoint 基础结构，Web 场管理员还需要其他工具才能以只读方式直接从内容数据库检索所需的网站元数据。
可选的方法包括使用 SQL Server 2005 Reporting Services 或类似的企业级报告解决方案。如随附材料中的示例所示，您也可以使用 SQL Server SELECT 查询获取必需的信息。

Pav Cherny 是一位 IT 专家兼撰稿人，专门研究 Microsoft 协作与统一通信技术。他的作品包括白皮书、产品手册和书籍，其内容主要介绍 IT 运营和系统管理。Pav 是 Biblioso Corporation 的总裁，该公司主要经营托管文档和本地化服务。


Windows PowerShell 前景看好
Don Jones

我们往往希望脚本生成规范的输出，也经常有人问我怎样才是生成规范输出（如表）的最好方法。这种方法的确有很多种。第一步是编写脚本，将要以格式化形式显示的任何数据放置在
$data1、$data2 和 $data3 变量中。现在，可以着手格式化数据。

文本方式
网上
是否正在寻找本月 Windows PowerShell 专栏中讨论的技术快速演示？请转到 technetmagazine.com/video 以查看 Don Jones 对这些 cmdlet 的演示。

人们处理此任务最常见的方式就是像使用一种语言（如 VBScript、Perl、KiXtart 或其他面向文本的语言）对其进行处理一样。首先，我可以在屏幕上写出一组列标题：
Write-Host "ColumnA'tColumnB'tColumnC"
请注意，在 Windows PowerShellTM 中，`t 是一个特殊转义符序列，表示插入一个制表符。要编写表的每一行（如前所述，我的数据位于 $data1、$data2 和 $data3），我有多种方法可供选择。一种方法是只写入变量，依赖 shell 的功能用双引号内的内容替换变量：
Write-Host "$data1't$data2't$data3"
另外一种稍微吸引人的方法是使用 f 运算符来实现。此方法将格式与数据分开，可以用以下更加易读和维护的代码行来表示：
Write-Host "{0}'t{1}'t{3}" –f $data1,$data2,$data3
不过，整个方法有一些重大问题。首先，如果依靠控制台窗口中的固定制表位，则我必须自己处理一些奇怪的格式。例如，如果第一列中某个特殊表行有一个包含 20 个字符的值，则我不得不对该行全部应用这种格式。此外，由于我使用 Write-Host 输出这些文本，因此几乎只能看到控制台显示。
将输出发送到文件或将其放在其他格式中并没有简单方法，尽管我一直期望有这样的简单方法。最重要的是，这种基于文本的方法完全忽略了我正在使用的在本质上基于对象的 shell，从而无法利用 Windows PowerShell 提供的各种强大的技术和功能。

Windows PowerShell 方式
Windows PowerShell 是面向对象的 shell。这就意味着在理想情况下，您处理的所有内容都应该在对象中，从而 shell 可以在需要时将其转换为文本显示。但是，如何为任意数据片段创建对象？
仍采用我的示例，我首先创建一个空白自定义对象并将其存储在变量中：
$obj = New-Object PSObject
这样，我们就获得了一个全新的空白对象。然后，以属性形式向该对象中添加数据。为此，我仅将对象以管道形式传递到 Add-Member cmdlet 中。我添加了一个名为 NoteProperty 的属性并为该属性命名（最好使用列标题作为属性名称），然后，插入数据作为属性值：
$obj | Add-Member NotePropertyColumnA $data1
$obj | Add-Member NotePropertyColumnB $data2
$obj | Add-Member NotePropertyColumnC $data3
现在，仅将该对象输出到管道（而不是控制台）：
Write-Output $obj
然后，可以对需要输出的每个表行重复这些步骤。以下简短函数的作用是接受一个字符串并输出其大写字母和小写字母版本以及原始字符串：
functionStringVersions {
param([string]$inputString)
  $obj = New-Object PSObject
  $obj | Add-Member NoteProperty Original($inputString)
  $obj | Add-Member NoteProperty Uppercase($inputString.ToUpper())
  $obj | Add-Member NoteProperty Lowercase($inputString.ToLower())
  Write-Output $obj
}
$strings = @("one","two","three")
foreach ($item in $strings) {
StringVersions $item
}
以字符串变量的数组开始，一次处理一个变量并将其发送到函数中。该函数的输出被写入管道中。
请注意，此代码可以编写得更简单些，但以上代码更能清楚地说明我阐述的要点。其结果是一个格式相当完美的表，如图 1 中所示。这是因为 shell 已经知道如何在表中格式化对象。
图 1 以表形式显示的 Windows PowerShell 输出
图 1 以表形式显示的 Windows PowerShell 输出 (单击该图像获得较大视图)
只要对象有四个或更少的属性，Windows PowerShell 就会自动选择表。因此，我无需自己执行任何操作，就获得了一个规范的表。

不过，请等一下，还有其他功能！
本月 Cmdlet：Get-Command
我相信您曾使用过一两次 Get-Command 或其简单的别名 (gcm) 来查看可用的 Windows PowerShell cmdlet 的列表。但是，您可能不知道 gcm 有多么灵活。例如，如果要查看 Windows PowerShell 可对一项服务执行的所有操作，请运行 gcm -noun service。或者，如果要查看所有的 Windows PowerShell 导出选项，请尝试 gcm -verb export。如果只需查看由特殊管理单元（如 PowerShell Community Extensions）添加的 cmdlet，请尝试 gcm -pssnapin pscx。（用任何管理单元的名称替换“pscx”，即可查看该管理单元的 cmdlet。）
您可以看到，Get-Command 在 Windows PowerShell 的识别能力中发挥着重要作用。通过此命令，您无需参考手册即可了解哪些功能是可用的。另请注意，与使用 Help * 等命令相比，gcm 能够更精确地发现功能。Help 功能仅列出可用的帮助主题。帮助中未附带的任一 cmdlet 都不会显示在帮助列表中 — 但在需要时您可以调用这些 cmdlet。

这种方法的优点远不止是生成规范的表。只要您使用对象，Windows PowerShell 就可以帮助您做很多事情。要将您的数据放在 CSV 文件中？使用 Export-CSV。喜欢使用 HTML 表？将对象以管道形式传送到 ConvertTo-HTML 中。需要列表格式？以管道形式将其传送到 Format-List。通过使用对象，您可以利用 shell 已提供的所有功能。以下是修改后的示例：
functionStringVersions {
  PROCESS {
   $obj = New-Object PSObject
   $obj | Add-Member NoteProperty Original($_)
   $obj | Add-Member NoteProperty Uppercase($_.ToUpper())
   $obj | Add-Member NoteProperty Lowercase($_.ToLower())
   Write-Output $obj
}
}
这次，我修改了函数以接受管道输入（使用对象时最好这样做）并输出到管道中。
现在，该函数在 PROCESS 脚本块内部有自己的代码。这意味着函数将接受管道输入，并为管道送入的每个对象执行一次 PROCESS 脚本块。
在 PROCESS 脚本块中，特殊的 $_ 变量引用当前处理的管道对象。这样的实际结果是现在可以直接传送一个字符串数组：
@("one","two","three") | StringVersions
因为此函数将其输出放到管道中，所以我获得了一个表。在管道的末尾，shell 知道调用其格式化子系统，该子系统决定使用一个表，因为管道中对象的属性少于五个（默认情况下，如果有更多属性，shell 将使用列表）。
但是我不必依靠默认行为。我可以直接将这些对象传送到另一个 cmdlet 以便同时完成一些其他操作：
@("one","two","three") | StringVersions | Format-List
@("one","two","three") | StringVersions | ConvertTo-HTML | Out-File "strings.html"
@("one","two","three") | StringVersions | Export-CSV "strings.csv"
@("one","two","three") | StringVersions | Select Uppercase,Lowercase -unique
图 2 显示了 Web 浏览器中显示的第二个示例的结果 HTML。通过直接在对象中表示输出数据，而不是将其作为简单文本表示，即可完全访问 shell 中内置的丰富功能：各种格式化布局、HTML 转换、导出选项，以及排序、筛选和组合等。
图 2 HTML 格式的 Windows PowerShell 数据输出
图 2 HTML 格式的 Windows PowerShell 数据输出 (单击该图像获得较大视图)
这是功能非常强大的素材。实际上，我甚至建议您写的每个脚本都应该产生对象作为它的输出，这样一来，您就可以用尽可能多的方法来利用该输出 — 而根本不必再写一行代码。

Don Jones 是 Windows 管理自动化的专家并已著有《Windows PowerShell:TFM》和《VBScript, WMI, and ADSI Unleashed》等书籍。您可以通过 ScriptingAnswers.com 论坛与他联系。


您好，脚本专家！ 不太辛苦的工作照样也有回报
The Microsoft Scripting Guys

下载本文中所用的代码: HeyScriptingGuy2008_06.exe (150KB)

数百年来， 人们一直深信辛勤劳动终有回报；真正的满足来自勤恳的工作；真正的快乐源自结果，而不是过程；对，您能明白就好。任劳任怨地工作（像灰姑娘一样），终有一天会获得回报。
备注：这是真的吗？如果辛勤工作，不仅会更加快乐，而且总有一天会因为自己的努力而得到回报吗？为什么要问这种问题？
当然，灰姑娘非常幸运；毕竟，与邪恶的继母和两个坏心眼的异母姐姐生活在一起，肯定会遇到各种各样的艰辛。但如果您不像她那么“幸运”呢？如果您没有与邪恶的继母和两个坏心眼的异母姐姐生活在一起，又该怎么办呢？假设您面对毫无尽头、令人精疲力尽又吃力不讨好的工作，该如何度日呢？您将如何寻找真正的快乐？
如果您终日淹没在无穷无尽的工作中，脚本专家建议您尝试编写一个脚本，使其以精致、简洁的表格格式输出数据，如图 1 所示。
图 1 表格输出
图 1 表格输出 (单击该图像获得较大视图)
我们说过，灰姑娘非常幸运：她必须将房子打扫得一尘不染，完成后还要坐在充满烟尘的壁炉边。但是，说到编写以表格格式显示数据的脚本，即使是灰姑娘也会望而怯步。坐在煤灰中是一回事，而编写以表格格式输出数据的脚本是另一回事。
备注：除非您必须坐在壁炉旁边编写脚本，它们才是一回事，呵呵。
为什么这项任务会让灰姑娘望而怯步？因为它相当困难。在 VBScript 中以表格格式显示数据的唯一方法是执行如下操作：
  • 首先，确定每列的最大大小。例如，您可能希望服务的显示名称最多占据 52 个字符空间。
  • 据此，可以计算一段数据的字符数。例如，显示名称 Adobe LM Service 有 16 个字符。
  • 如果显示名称超出 52 个字符的限制，要确定需要从字符串末尾去除多少个字符，才能适合分配的空间。如果显示名称不足 52 个字符，要确定必须在此字符串末尾添加多少个空格，才能使其长度正好等于 52 个字符。
  • 对下一组数据重复以上步骤，然后是再下一组，依此类推。
如果您熟悉灰姑娘的故事，应该知道神仙教母可能会突然现身，将老鼠变成系统管理员（神仙嘛，自然能千变万化），然后那只老鼠会为您编写这个脚本。不过，这种幸运不会砸在您头上，只能全靠自己了。
不过从好的方面来看，您将是世界上最充实的人，因为您也将成为世界上最辛苦工作的人。到目前为止还没有其他工作比它更艰难。
当然，有些人比较懒，可能不愿意这样“以苦为乐”。如果您是这样一个人，很可能会想：“谢天谢地，我们有脚本专家；他们会告诉我如何将老鼠变成系统管理员，然后告诉我如何使老鼠将输出转化为表格形式。”那么，很遗憾地告诉您一个坏消息：脚本专家并不知道如何将老鼠变成系统管理员。（但我们可以将系统管理员变成老鼠，如果这样对您有所帮助。）我们并不知道如何让别人为您编写脚本，更别说编写以表格格式输出数据的脚本。
但是没关系，只要您运行的是 Windows® XP 或 Windows Server® 2003（大多数人如此），便不需要老鼠为您编写脚本。（不过，很遗憾，这并不适用于 Windows Vista®。）此时，您可以利用 Microsoft.CmdLib 对象自己轻松编写脚本。请参见图 2 中的示例脚本。
Figure 2 创建表格显示
Dim arrResultsArray()
i = 0

Set objCmdLib = _
  CreateObject("Microsoft.CmdLib")
Set objCmdLib.ScriptingHost = _
  WScript.Application

arrHeader = Array("Display Name", _
  "State", "StartMode")
arrMaxLength = Array(52, 12, 12)
strFormat = "Table"
blnPrintHeader = True
arrBlnHide = Array(False, False, False)

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" _
  & strComputer & "\root\cimv2")

Set colServices = objWMIService.ExecQuery _
  ("Select * FROM Win32_Service")

For Each objService In colServices
  ReDim Preserve arrResultsArray(i)
  arrResultsArray(i) = _
  Array(objService.DisplayName, _
    objService.State,objService.StartMode)
  i = i + 1
Next
objCmdLib.ShowResults arrHeader, _
  arrResultsArray, arrMaxLength, _
  strFormat, blnPrintHeader, arrBlnHide
稍微解释一下，Microsoft.CmdLib 是 Windows XP 和 Windows Server 2003 附带的 COM 对象。此对象有许多不同的功能；有关详细信息，请在命令提示符下键入 cmdlib.wsc /?，并阅读屏幕上弹出的脚本文件中的注释。今天，我们只介绍 Microsoft.CmdLib 的一项功能：以表格格式显示数据的功能。
这显然会产生一个问题：如何以表格格式显示数据？让我们看看是否可以找到解决办法。您可以看到，我们的示例脚本首先会定义名为 arrResultsArray 的动态数组：
Dim arrResultsArray()
在典型脚本中，一旦检索到数据，它们就会立即显示到屏幕上。但是，脚本专家怎么会采用这么平凡的做法呢？在此脚本中，我们将不显示检索到的数据，而是在数组中存储所有返回的数据，然后利用 Microsoft.CmdLib 设置数据格式并显示数据。
换句话说，这正是我们要先创建动态数组（即可在编写脚本期间调整大小的数组）的原因。定义数组后，将名为 i 的计数器变量的值设置为 0；我们将使用此变量来跟踪该数组的当前大小。
稍微解释一下，我们将 i 的值设置为 0，是因为数组第一项的索引编号始终指定为 0。因此，将第一项添加到数组时，添加的是项目 0 而不是项目 1。
接下来，我们需要初始化 Microsoft.CmdLib 对象的实例，这是以下两行代码的用途：
Set objCmdLib = _
CreateObject("Microsoft.CmdLib")
Set objCmdLib.ScriptingHost = WScript.Application
这将为我们生成一个小代码块：
arrHeader = Array("Display Name", "State", "StartMode")
arrMaxLength = Array(52, 12, 12)
strFormat = "Table"
blnPrintHeader = True
arrBlnHide = Array(False, False, False)
在此，我们要设置几个参数以配置输出。在第一行中，将这些值指派给名为 arrHeader 的数组；您可以看到，它们正是输出表格中各列的标题。对于此示例脚本，我们要检索的是有关计算机上运行的服务的信息，然后显示每项服务的 DisplayName、State 和 StartMode 属性值。
为了顾名思义，我们为数组指派了列名称 Display Name、State 和 StartMode（当然，我们完全可以简单地为列名称指定 A、B 和 C；Larry、Moe 和 Curly；或者其他任何名称。列名称不必与属性名称相同）。
备注：灰姑娘的故事有许多版本，包括她异母姐姐的名字。在迪斯尼版本的灰姑娘故事中，两位姐妹的名字是 Drizzella 和 Anastasia，这正好是我们的脚本编辑的姓氏和中间名！
在第二行代码中，将这些值指派给另一个名为 arrMaxLength 的数组。此数组保存该表格中每列的大小。在输出中，我们希望为第 1 列（服务显示名称）分配 52 个字符空间；然后分别为每个服务状态和启动模式分配 12 个字符空间。（Microsoft.CmdLib 会自动在各列之间插入空格。）如果希望列的大小分别为 52、12、12 个字符空间（实际上也是如此），则可以使用如下所示的代码：
arrMaxLength = Array(52, 12, 12)
第三行指定数据的输出格式。我们希望以表格形式显示数据；因此可将 strFormat（保存输出类型的变量）的值设置为 Table。假设我们要改用逗号分隔值列表格式显示数据。在这种情况下，可以将格式设置为 CSV，如下所示：
strFormat = "CSV"
这样，我们就会得到类似以下内容的输出：
"Display Name","State","StartMode"
"Adobe LM Service","Stopped","Manual"
"Adobe Active File Monitor V4","Stopped","Manual"
"Alerter","Stopped","Manual"
"Application Layer Gateway Service","Running","Manual"
"Apple Mobile Device","Running","Auto"
"Application Management","Stopped","Manual"
请注意，Microsoft.CmdLib 不仅会在各项之间添加逗号，还会将各个值用双引号引起来。这个功能比您最初设想的还棒。毕竟，要手动执行操作，您必须使用以下代码：
Wscript.Echo Chr(34) & objService.DisplayName & Chr(34) & "," & Chr(34) & objService.State & Chr(34) & "," & Chr(34) & objService.StartMode & Chr(34)
看起来不怎么样啊！
怎么？您不喜欢表格，也不喜欢 CSV 格式吗？那么，可以尝试将格式设置为 List，就会得到类似以下内容的输出：
Display Name: Adobe LM Service
State:        Stopped
StartMode:   Manual
Display Name: Adobe Active File Monitor V4
State:        Stopped
StartMode:   Manual
但这有点跑题了。（有时我们容易跑题。）定义输出格式后，将名为 blnPrintHeader 的变量的值设置为 True：
blnPrintHeader = True
我们将使用 blnPrintHeader 告知 Microsoft.CmdLib 打印列标题。若不需要打印列标题呢？没关系；如果不需要，就将 blnPrintHeader 设置为 False：
blnPrintHeader = False
最后，使用下面的这行代码：
arrBlnHide = Array(False, False, False)
要显示数据时，Microsoft.CmdLib 会提示您选择显示或隐藏列。要隐藏列（即隐藏特定属性的数据），请将该属性值设置为 True；要显示列，请将此值设置为 False。
在输出中，我们将按顺序显示 DisplayName、State 和 StartMode 属性的值，因此在数组中使用的值分别是 False、False、False。如果要显示 DisplayName、隐藏 State、显示 StartMode，该怎么办？在这种情况下，可使用下面的这行代码：
arrBlnHide = Array(False, True, False)
请记住，使用 False 会显示列，使用 True 会隐藏列，不要搞混了。
此时，我们已准备好输出某些数据 — 如果我们实际提供了一些数据，就会输出数据。（脚本专家是否曾编写过无法输出数据的脚本，然后花费大量时间调试该脚本，结果却发现仅仅因为最初没有实际检索任何数据？呃，当然没有这种事，您为什么会这么想？）
知道这一点后，我们下一步就是绑定到本地计算机上的 Windows Management Instrumentation (WMI) 服务，然后使用 ExecQuery 方法检索有关该计算机上安装的所有服务的信息：
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colServices = objWMIService.ExecQuery ("Select * FROM Win32_Service")
我们可能需要提醒一下，在此您并非只能使用 WMI 数据。实际上，Microsoft.CmdLib 可使用任何类型的数据。WMI 只是检索一组数据的简便方法。
一旦我们有了与服务相关的数据集合，便可以设置一个 For Each 循环，遍历集合中的所有服务。不过，我们不再显示每项服务的属性值，而是执行以下代码：
ReDim Preserve arrResultsArray(i)
arrResultsArray(i) = Array(objService.DisplayName, objService.State,objService.StartMode)
i = i + 1
在此代码块中，我们将执行什么操作？在第 1 行中，调整数组的大小，使用 ReDim Preserve 命令不仅可以调整数组的大小，还可以保存该数组中所有的现有数据。（如果没有 Preserve 关键字，虽然可以调整数组大小，但该数组中所有当前数据都将被清除。）
将数组大小设置为多少？第一次运行循环时，我们将数组大小设置为 0；换句话说，我们将创建包含一个元素的数组。但如何确定我们设置的数组大小为 0 呢？因为我们使用了计数器变量 i，而该变量等于 0。
因此，如果使用变量 i 表示该数组的大小，是否意味着我们设置的大小始终为 0？的确如此，除非每次执行循环时将 i 值递增 1；您可以看到，在代码块的第 3 行将执行此操作。
现在，只剩下一行代码了：
arrResultsArray(i) = Array(objService.DisplayName, objService.State,objService.StartMode)
在此，我们只获取感兴趣的属性值 — DisplayName、State 和 StartMode，并将它们添加到数组 arrResultsArray 中。请注意，我们不是要单个添加属性值，而是将它们作为值数组添加。当然，这有点奇怪：它意味着数组 arrResultsArray 中的每项将是另一个数组；这正是 Microsoft.CmdLib 的工作原理。
当然，这可能又使您开始担心。“数组中的数组？究竟如何才能在充满数组的数组中访问所有各个值？”不要慌，这很容易：Microsoft.CmdLib 会自动帮您处理。
备注：很抱歉，不过访问数组的数组中的所有各个值大概是 Microsoft.CmdLib 唯一能为您执行的操作。不过，下一版对象可能会考虑加入其他功能，如打扫邪恶继母的房间，刷盘子以及为令人讨厌的异母姐姐做衣服等。
实际上，通过调用 ShowResults 方法并将此方法传递给我们以前在脚本中配置的所有数组和变量，就可以使用简洁的表格格式输出数据：
objCmdLib.ShowResults arrHeader, arrResultsArray, arrMaxLength, strFormat, blnPrintHeader, arrBlnHide
所有这些操作将会得到什么样的结果？它看上去就像按所需格式设置的输出，如图 1 所示。
不错，是吧？您获得了美观的输出，而且几乎不需执行任何操作。（而且，下一个脚本甚至更加容易，因为您只需对第一个脚本做一些小的更改。）
诚然，您不像灰姑娘那样日夜操劳，才能以表格形式显示脚本输出，所以您也无法享受像灰姑娘那样的满足感。老实讲，您也不太可能嫁给王子；本文也没想指导您如何嫁给王子。不过，为了从 VBScript 脚本获得这么好的输出，付出一点小代价也是值得的，尤其是想一想当今的王子哪有那么好得到。
而且谁晓得：说不定您自己也能找到一位王子呢。毕竟，就连皇室成员也需要了解他们计算机上安装的所有服务信息，不是吗？

Scripto 博士的脚本谜题
每月挑战不仅测试您解决谜题的技能，还测试您的脚本编写技能。

2008 年 6 月：PowerShell Pathway
在每个谜题中，从水平、垂直或对角方向连接字母以组成 Windows PowerShell cmdlet 的名称。每个字母只能使用一次。如下所示：
此谜题创建的 cmdlet 是 New-Alias。现在该您了。下面还有三个谜题：

ANSWER:
Scripto 博士的脚本谜底
答案：PowerShell Pathway，2008 年 6 月

Read-Host

Set-AuthenticodeSignature

The Microsoft Scripting Guys 为 Microsoft 工作，也就是受雇于 Microsoft。在不玩、不教或不看棒球（以及各种其他活动）的时候，他们负责管理 TechNet 脚本中心。要查看相关信息，请访问 www.scriptingguys.com。


桌面文件 安全性与符合性
Wes Miller

作为 IT 专业人员，您的目标可能本是获得相得益彰的结果，但却经常产生抵触现象。安全性和符合性就是这样两个组织目标，其中一个目标的实现应该促进另一个目标的实现。但是，并非总是如此。本专栏旨在向您大概介绍这一问题：
为何保证安全性不一定表示符合所需的方案，以及为何符合性不一定能确保安全，或者如果符合性等同于安全性，为何没有获得至少应有的安全性。

安全性不是可有可无的
SDL 资源
  • 《安全性开发周期》，作者：Michael Howard 和 Steve Lipner（Microsoft Press，2006）
  • 安全性开发周期博客
  • 《Microsoft 安全性开发周期》深入探讨
  • 安全性开发人员中心
  • 高信度计算安全性开发周期

符合性一般涉及外界强加于组织、行业、公司或产品的要求（人员、流程、基础结构和技术等）。有时，符合性需要遵守行业内部公布的标准（如支付卡行业数据安全标准，即 PCI-DSS）。理论上，这些方案至少在某种程度上与您的组织已经采用的方法是一致的。随着采用标准的日益普及，您会发现，只要还想继续开展业务，就无法再忽视它；最终，您必须严格实施和遵守这些标准，并获得最佳效果。
另一种符合性通常更为麻烦。在此，我指的是政府公布的方案，如健康保险流通与责任法案 (HIPAA) 和萨宾斯-奥克斯利法案。对这些方案，组织几乎无法自主选择是否实施和实施时间。
理解法规符合性的要点是它通常涉及到“自上而下”的方法。一般来说，有一个用于定义方案的“一刀切”模板，而您必须检查自己的产品和流程，并竭力让其符合这个交付给您的怪异模板。您不仅需要注意符合性方案的意图，更重要的是，如果不遵循它或未成功实施，可能招致法律或财务方面的后果（如果有的话）。
领会众多符合性方案的意图是我们理所应当的义务，但实施起来通常比较困难，并且可能无法达到预期目标。遗憾的是，许多方案意图并不具有强制意义（也就是说，不遵循这些方案，也不会直接导致法律或财务后果）。
我可以告诉您，作为患者，我很难描述 HIPAA 到底为我带来了哪些好处。我的感觉就是，每当我去看病时，都需要填写一大堆资料。更糟糕的是，它还可能带来意想不到的后果。是否有过需要将医疗信息从某个医生或机构转到另一处的经历？如果没有书面许可，则无论您是如何迫切需要获得这些信息，都不会提供给您！
关键是，从多方面来讲，一些符合性方案已成为可选方案。也就是说，您可以单独设计或修改您的流程或产品，以满足符合性方案要求。就像我经常问我的三岁孩子，“这个主意怎么样？”
相反，安全性是一种自下而上的方案（前提是要正确执行）。无论您是设计软件产品，还是设计组织的新网络体系结构，谨记三思而行。例如，设计产品体系结构时，良好的雏形不仅描述通信、本地化和版本等，还将描述从一开始就需要内置到应用程序的安全性元素（在整个开发过程中，您将继续对其调查和改进）。
如果使用继承的应用程序或体系结构（我相信大多数人都是这样做的），则执行此类深层安全检查同等重要，我在本专栏中也时常提及这一点。如果不了解其工作原理，怎么能了解它的安全级别呢？有关 Microsoft® 安全性开发周期 (SDL) 的详细信息，请参阅侧栏中的“SDL 资源”。

全局观念
记得在以前的有关培训中，我被告知安全性不仅仅是实施加密、访问控制列表 (ACL)、TLS 或公钥基础结构 (PKI)。真正的安全性在于从全局来了解：了解某协议的某版本为何被放弃甚至从不受支持；为何某项新探测可阻止中间人攻击；为何产品 v2 比 v1 安全得多，即使 v1 更快。此外，有必要了解您的基础结构的各个部分是如何组合的。
另一方面，符合性表示采用您的技术并确保您构建的基础结构符合特定标准。支付卡行业数据安全标准 (PCI-DSS) 或北美电力可靠性委员会 (NERC) 等部分方案的意图很好，可能会促进真正的安全性变革。但最后，面对可自由选择众多“符合性方案”，您需要调整自己的特定项目和有限的可用资源，从而削弱了安全性方案。
长期以来，安全性在软件开发中备受冷落。现在，我相信大多数组织仍未将安全性视为首要考虑因素。符合性方案之所以现在仍大行其道，就因为大家一致认为可以稍后再考虑安全性 — 以前这样，以后也很难改变。

足够好
最近，我换工作了。如今我为德克萨斯州奥斯汀市的一家小型创业公司工作，该公司正在开发一种应用程序白名单技术，与我们在 Winternals 通过 Protection Manager 产品开发的技术类似。我发现与客户交谈的一件非常有趣的事情，是他们认为自己当前技术的安全级别如何，或更具体地说，他们认为自己当前使用的技术使他们的基础结构处于怎样的安全级别。尽管一般来说多数基础结构是安全的，不会对安全漏洞敞开大门，但每次听到“系统足够安全”的评估，我都感到有点无话可说。
符合性方案比较有趣，您可以符合它们，也可以不符合它们。责任在您自己。不符合方案的后果通常为罚款、惩罚或从组织中除名。通常，这并不能完全确保发生实质性的改变。
如果是联邦强制要求的方案，我经常遇到这种态度，“只要使审核人员高兴即可”，或即使执行也不真正实现任何符合性框架，因为相关立法（如 HIPAA）并没有强制一定要实施 — 相当于不买保险就直接开车上路，虽然会省下一大笔开支，但后果难料。
安全性经常遇到同样的障碍，但依我所见，它至少更具体。作为开发人员或实施者，如果您主动告诉管理阶层在规范中不包含 foo 节会使产品更容易受到攻击，至少在交付产品后或完成部署后，您可以说“我已经告诉过您这种情况了”。对于符合性方案，我的经验是执行方案往往十万火急，而预算却非常有限。其目的只是符合方案的最低要求，因此，可能仅在形式上“达标”，实际上却完全不符合方案的精神。

定位
安全性和符合性资源
  • 安全性和符合性解决方案指南
  • 安全指南
  • 支付卡行业数据安全标准符合性规划指南
  • 法规符合性和安全性更新
  • 实现符合性
  • 民权办公室 — HIPAA
  • PCI 安全标准委员会
  • 北美电力可靠性委员会

尽管听起来有点理想化，但我还是要说，您应该尽可能保证您的产品和组织的安全；事实上，许多符合性方案都是由于工程设计不佳（更多情况下是自鸣得意）导致的折衷结果。很多人都自我感觉良好。但是，在安全领域，“自我感觉良好”实在是太不明智了。我们 IT 专业人员应将符合性方案谨记于心，并尝试在精神和实施两个方面实现它们，还必须确保我们现在布置的基础结构不仅仅达到“可以达到”的安全级别，而是达到“必须达到”的安全级别。换句话说，符合真正的安全性，而不是仅仅符合方案。
后退一步，看看您构建的技术是一个商业软件还是一组您打算集成到大型系统的技术，这一点非常重要。我特别强调了解以下内容的重要性：系统的连锁部分、各个部分如何配合工作和带给系统的更大威胁。
根据您从事的行业，不同的符合性方案可能在您的工作中起到不同的作用。您可能在日常生活中涉及到符合性方案，也可能仅在设计新项目或开发新技术时才会有所涉及。或者，它们可能仅仅是您特别指定的符合性审查或审核工作的一部分。没关系。我并不认为应该忽略符合性方案，但是我希望您能够挑战现状，不是单纯地为了满足分配给您的符合性方案而工作；而是进行全面的安全性审查以完全了解您的技术，同时将其作为符合性审查的典范。

您会失去什么？
毕竟，关于未能满足符合性方案的惩罚似乎并不明确。缺乏符合性会给您带来风险，该方案恰恰就是要消除这种风险。后果有些飘渺而遥不可及，但它们都是真实存在的。这些后果也未必由您（个人）承担。我们的原则是要务实，但始终牢记最糟糕的情形。
如果从严格的安全角度来看同一事物，威胁是显而易见的 — 更重要的是，您应该能够立即判断出开放漏洞的潜在代价。
与我讨论此主题的许多人都强调过以下情况：由于符合性方案的解释经常模糊不清，因此有时执行不彻底。但是，执行安全审查之后，忽略安全就完全是另一回事了。忽略安全马上导致的威胁是显而易见的。如果看不到这些威胁，您可能要反思安全审查中涉及的人员；您可能缺少帮助发现解决方案中实际问题的关键团队成员。

去年主题再议
在去年以安全性为主题的专栏中，我讨论了“如何防止丢失数据”(technet.microsoft.com/magazine/cc162325)。一年过去了，更多的系统受到了危害，丢失了更多未加密的便携式计算机，还有更多个人信息落入了存在安全隐患的人手中。很难说是否取得了进步。为什么我们仍没有改进？项目的实施通常会拖延，预算拮据，资源几近透支，却试图在极短的时间内提供尽可能多的功能。
遗憾的是，这种环境使得最低工作要求成为标准。这当然不能确保解决方案的安全性或符合性，也不能确保该解决方案不会对项目的期限或成本带来严重危害。
从个人角度来讲，我坚信：
  1. 如果不愿意保护解决方案的安全，那么就不应该构建它。
  2. 每次增加新功能时，在开始之前就要设计安全性。
  3. 如果组织不愿意在工程设计过程中构建安全性（即作为设计中的一个步骤），您应该质问公司或组织的总体目标是什么。
组织拥有的客户或合作伙伴的个人数据越来越多，他们有责任保护这些数据的安全。遗憾的是，在我们生活的这个世界中，安全性往往不是公司的首要目标，员工也感觉不便质问组织在安全方面的努力。
如果安全性（而不是符合性）确实失败了，通常人们会惊呼“现在应该保护系统”了，“身份盗窃保险”成为一种标准责任策略，以安抚其个人数据和财务风险福利受到危害的客户、学员、患者和员工。
公司总是要求我们在极短的时间内完成太多的事情，但这些事情没有多大意义。但作为 IT 专业人员，我们有责任质问公司为什么不将安全性作为重点、管理阶层为什么总是仅在面临符合性方案或者安全性失败及其真实或潜在法律威胁（更可能是后者，因为它会为组织带来麻烦甚至是风险）时，才考虑安全性。

接受我的挑战
首先，我邀请您挑战现状。如果仅要求您实现符合性目标 — 请确保您的努力不应该只是浪费时间来符合别人所理解的安全性。务必确保您的目标是保护系统，同时，充分定义流程或您的基础结构以满足符合性方案。有关此主题的详细信息，请参阅“安全性和符合性资源”侧栏。
简而言之，请记住符合性通常不是实现安全性的途径。但是，如果能够合理实现和利用安全性，安全性却通常是实现符合性的一个途径。

Wes Miller 是位于德克萨斯州奥斯汀市的 CoreTrace 公司 (www.CoreTrace.com) 的高级技术产品经理。在此之前，他在 Winternals Software 公司任职，并曾在 Microsoft 担任项目经理。可通过电子邮件 technet@getwired.com 与 Wes 联系。


IT 业务 成为环境领导者的十大要素
Michael Walsh and Eliza Walsh

似乎每个公司都在谈论它们在环境方面所做的努力。IT 可以在这些努力成果中起关键作用 — 为您营造良机，力求革新并成为公司和行业的思想领导者。但是从何处入手呢？以下是成为有关环境和可持续发展的有效领导者的十大要素。
熟悉问题
第一步是掌握有关环境可持续发展和计算方面广博而深入的专业知识。作为 IT 专业人员，您首先应该很好地了解如何减少计算对环境的影响（如电源管理、硬件合并和环境垃圾管理）。
作为环境领导者，您还必须设想软件和硬件如何帮助减少 IT 部门以外操作的影响。您可能发现自己正与人力资源经理、律师和业务经理密切合作来制定解决公司的整体环境影响的策略 — 可能涉及包括从出差策略到全球碳足迹规定的各种策略。
公司内外的人员也都期望您已掌握有关环境、公司以及公司所在的行业的专业知识。因此，您需要评估自己对环境可持续发展、可持续计算以及公司在短期和长期内的独特需要的了解。
如果您刚到公司任职或担任新职务，可能很快就感受到压力（不管是实际的还是设想的压力）。对很少从环境意识方面为自身定位的公司来说，更是如此；它们现在急于进行这样的定位。
您应该稳下心来，不能匆忙冒进；否则可能给您以及公司的可信度带来风险。在短期内，专注于迫在眉睫的问题并推迟实施策略计划，直到做好充分的准备或无法再延迟为止。

客观评估您的公司
下一步是严格评估您的公司或业务线的环境和可持续性。为此，您需要邀请关键利益相关者和公司内外其他有影响的人物参加。
您需要建立内部和外部联系人网络，这些联系人可使您定义利益相关者的生态系统。他们可帮助您了解公司在环境可持续性中所处的位置。
根据您的职责，您可能需要明确公司对环境法规、标准和法律的遵守程度（当前和将来）。您可能需要从竞争和分析期望方面度量公司的定位。您还应该了解客户、合作伙伴、政府组织和有影响的客户律师如何看待您的公司及其环境努力成果。您还可能需要确定对于有关计划，当前和将来存在哪些技术、财务和环境限制。
根据公司的大小和预算，可能值得考虑开展进一步的研究工作。内部调查、专项小组和第三方研究可能提供建设性意见。这些意见可以帮助您更好地了解有关过去的公司环境行为、您的公司在竞争中的立场以及潜在市场机遇等方面的员工满意度。但是，这里最大的价值可能是第三方研究会证实还是反驳主要利益相关者所持有的观点。

构想您期望的定位和时间
现在，您可以开始考虑公司在长期和短期内的定位。首先，可以将短期和长期分别定为大约一年和五年，然后根据具体需要调整这些时间框架。主要原因在于环境显然不是一个短期问题，如果仅做出短期定位，会对公司、利益相关者、合作伙伴和客户造成严重伤害。
要确定公司在一年和五年内的定位，您应该确定当前和将来面临的业务前景。这包括企业文化、公司的短期和长期业务目标、当前和将来的预算约束、地理扩展计划以及行业不断变化的法律和法规环境。
例如，某数据中心提供战术决策制定和策略定位发生冲突时的环境参考。过去，空间是数据中心设计的主要考虑因素。但是，在过去的几年中，电源作为限制因素越来越明显，并成为不断攀升的运作成本，从而不断对空间因素形成挑战。有些数据中心操作员认识到了从长远来看电源不断增加的重要性，并采取行动来缓解能量不足，其中包括从根本上转变数据中心管理中流行的空间驱动决策因素。在某些情况下，与维护现有范例相比，对缓解电源进行投资的短期成本非常高。但是，随着能源价格的不断增长，几年前主动改变数据中心管理方法的数据中心操作员可谓有先见之明，其公司的收益已足以补偿初始投资。

设定远景和策略
现在您必须设定远景和策略。显然，这应该基于您对企业当前定位及目标定位的理解。设定远景和策略时，您不应该将其视为一成不变的。尽管您的公司对保护环境的承诺可能是永久的，但您的远景和策略可不是。由于内部和外部因素（如法规要求、客户产品感受和企业需求）不断变化，它也会面临重大修订。随着公司环境计划的不断实施，使 IT 远景和策略与任何更大公司的远景和策略看齐是很重要的。
设定远景时，也是在设定企业的方向。您必须字斟句酌，以便它们得体、简明和连贯，但不要过于详尽。远景并不意味着解决公司在环境方面遇到的所有问题。它应该只解决与正确指明员工和合作伙伴的方向相关的问题。使命陈述（或远景声明）经常用于表达远景。您在前六个月内开始阐发远景是很必要的。
通过设定策略，您不仅定义了方向，还建立了明确的业务目标并概述了实现这些目标所做的投资。目前存在可以帮助您制定战略计划的现有模型。环境和可持续发展问题的两个最佳模型是 SWOT（优势、劣势、机会和风险）模型与 PESTLE（政治、经济、社会、技术、法律和环境）模型。然后，您可以在文档中定义策略，例如战略计划。
请注意，负责人最好广泛征求即将实施远景和策略的人员以及反对方利益相关者的相关反馈意见，然后发布书面声明，这样更有可能获得成功。对于在最终计划中从反对方获得反馈的负责人来说，更是如此。

宣传业务使命
宣传无需等待您发布远景和策略之后再进行。相反，宣传必须在您担任角色之日就开始。但是，发布您的远景和策略后，您需要担任更加公开的角色 — 兼任内部角色和外部角色。最初，您或代理需要与有影响力的小组（如员工、分析人员、媒体、合作伙伴、客户和客户律师）就远景进行沟通。您需要启发和刺激他们，使其相信您的远景和策略，并向对您的策略最感兴趣的公司和目标群体进行有说服力的辩论。
您需要及时将重点转移到策略的各个要素。在整个过程中，您还必须经常更新这些目标群体，从而指出展示成功的重要里程碑，沟通策略中的更改以及坦率说明您的公司或行业所面临的最大挑战。
准备好对目标群体中的每个人表示出不同的兴趣和需要。尽管您需要针对目标群体中每个人的具体需要和兴趣展开陈述，但基本的远景和策略必须保持一致。这将有效地帮助您获得各种目标群体的支持。
千万不要为了取悦不同的目标群体，匆忙地将自相矛盾的“业务需求”传播出去；否则很难在这些问题上建立可信度。至少，这会影响主要更改的效率。在最坏情况下，这会危害整个公司的可信度。图 1 重点说明了有效沟通消息的七大要素。
图 1 沟通消息的七大要素
图 1 沟通消息的七大要素 (单击该图像获得较大视图)

管理您的消息传送
宣传远景和策略时，要全面考虑内部和外部消息传送的专业性和完整性。环境和可持续发展不仅对公司的社会责任很重要，对产品开发、服务、销售和市场营销也同样重要。即使贵公司授予了您环境领导权而未让您直接负责环境可持续发展公民权利行动，您还是应该像身为公民权利领导者那样严格按照标准行事。
不要低估外部目标群体对环境问题的热情以及对环境业务惯例的熟悉程度。更重要的是，如果您传达的信息不够完整或承诺得太多或太少，外部目标全体对您的负面影响是不可估量的！小心，不要让您的公司背上“破坏环保”的坏名声。
因此，您的通信策略需要由内部人员认真审阅和提供反馈，然后才能发布。您的通信策略应包含消息传送的主要元素，例如，公司环境情况说明书、消息传送框架、批准的发言人列表和有力的论据。通信策略对于确保清楚的结构和一致性很重要，应该在设定远景和策略之后立即完成。明确消息传送的主要所有者的个人责任，对您也大有好处。

通过评定实现管理
管理远景和策略范围内的各项责任很重要。无论是运营、产品开发，还是销售和市场营销，您都必须定义对实现目标产生影响的因素。应该将这些因素整理为一个简明的列表并映射到整个战略计划。然后，您需要为这些因素建立质量和/或数量基线，并建立用于将来分析的跟踪衡量标准。应该对这些衡量标准进行有效地管理。
报告有关这些跟踪衡量标准的责任应该清楚定义，并且您应该定期举行由所有主要利益相关者参加的会议。这样，利益相关者可以讨论跟踪衡量标准对战略计划运行状况的影响，将衡量标准映射到这些因素并将因素映射到战略计划的各个元素，从而使之成为可能。
遗憾的是，许多环境领导者发现自己的组织并没有准备使用评定工具支持这样的跟踪衡量标准。但是，要提供正确分析和报告环境和可持续发展努力成果所需的定性和定量数据，这些工具是十分必要的。因此，您必须开发专门的评定工具，无论是通过业务流程重新设计、部署协作和测量技术，还是通过开发自定义的内部工具。
如果没有高层领导支持公司投资这些评定工具，您可能还要面临令人头痛的成本效益决策，决定是否增加员工人数来优先开发适当的评定工具。

分析并报告环境影响
通过定量和定性数据，可以进行深入分析。如果领导者希望了解其计划的成功度以及其行动对公司或其业务线产生的影响，则这种分析很重要。
有关环境方面的法规、标准、法律和非官方公司报告前景不断推陈出新，使公司承受着越来越大的压力要发布有关其环保情况的详细信息。拥有支持管理、评定和分析的必要工具和流程，有助于收集要求的年度报告、必需的存档和非官方公司可持续发展报告所需的信息。因此，必须了解您目前和将来的报告要求，以便投资伴随业务需求而增长的集成的管理、评定、分析和报告基础结构。
用于分析和报告的技术对于寻求作为思想领导者出现的公司很重要。在这里，软件起着非常重要的作用 — 尤其是用于环境管理、流程设计、数据集合、数据操作、遥感、协作、可视化和演示文稿的软件。
商用软件有时需要针对环境领域的特定应用进行自定义。因此，要实现集成的管理、评定、分析和报告基础结构，可能需要对技术的重大投资。

成为思想领导者
思想领导应该是每个环境领导者梦寐以求的。尽管存在多种类型的思想领导者（请参阅图 2 查看一些示例），但他们都具有以下共同点：他们的专业知识不是来自头衔，而是来源于他们的行动以及完整、开放的领先变革。
图 2 思想领导者的类型
图 2 思想领导者的类型 (单击该图像获得较大视图)
全球环境可持续发展生态系统依赖于力求变革的思想领导者。思想领导者的关系网相当广泛，遍布政府、非政府、业界和消费者倡导组织等，从而可以云集有影响力的各方来共同解决需要密切协作的问题。思想领导者也熟悉不断出现的许多引起全球社区注意的环境问题，引起全球目标群体对这些问题的重视。
最后，思想领导者会设想已引起行业普遍关注的重要问题的解决方案。这些解决方案的出台可能要求各方（包括竞争对手）施加影响和开展协作，并可能将您自己的公司推向尚未提供服务的市场，但结果是思想领导者可能带来全球性的变革。

保持与时俱进
与时俱进，经常更新我们的知识，是新时代对我们的一项要求。为了保持可信度，需要对其他环境领导者提出的不同科学、政策、法律、经济、技术以及商业观点有透彻的了解。它还要求不一定要符合当前的主流观点，而是基于对环境可持续发展和计算的专业了解，提出独特的观点。行业中的环境领导者（或声称要成为思想领导者）不断增长，而是否具备这些素质将成为他们的主要区别。
成功的领导者不仅向对主题感兴趣并具有相关知识的下属授予责任，也尊重公司内更资深的环境策略代表的意见；而且在这两方面必须注意安全性。经常与上级一起出席会议和做报告将确保您全面了解公司在环境可持续发展方面的努力，关键是知道您何时需要代表公司发言。这要求对您的核心承诺有清楚的了解，对于内部和外部目标群体所预期的环境，真诚、负责地坚持一贯的信念。

Michael Walsh 是 Microsoft 的高级环境产品经理。
Eliza Walsh 是一名沟通策略顾问，以前在中国作为沟通专家供职于 Microsoft。


领域备注 共享分割屏幕
Kentaro Toyama

让更多的人能够使用 PC 是 Microsoft 印度研究中心树立的伟大目标。MultiPoint 程序（《TechNet 杂志》的 2008 年 5 月份期刊中对此进行了讨论）允许多个用户使用多个鼠标与一台 PC 进行交互，它的出现使我们似乎看到了该目标的成功实现。
另一种技术 — 分割屏幕，也有助于 Microsoft 印度研究中心实现同时共享访问计算领域这一伟大构想。该程序设置一台 PC 并配有两个键盘和两个鼠标，然后采用终端服务将显示器均分为两个屏幕。这样，两个用户就可以共享该显示器，在各自的屏幕上运行自己的操作系统实例以及所选的软件 (research.microsoft.com/users/udaip/splitscreen.htm)。例如，一个用户可以进行文字处理操作，而另一个用户对电子表格执行其他操作。
为了实现屏幕分割，我们使用 Windows Server® 2003（当前正在升级到 Windows Server 2008）中运行的三个独立终端服务实例。第一个实例是容器，它可捕获并重新分发所有鼠标和键盘事件。此层使用的技巧与 MultiPoint 中相同，用以捕获所有鼠标和键盘事件，同时还要使用它们的设备 ID（插入 USB 设备时，Windows® 将自动为其分配唯一的 ID；这些 ID 对于硬件设备而言并不是唯一的，但在当前的操作实例中是唯一的，旨在弄清两次鼠标单击来自同一鼠标还是来自不同的鼠标）。该容器还可以绘制鼠标光标。
在容器中，我们打开终端服务的另外两个实例，每个实例仅收到与一个屏幕相关的事件。例如，在默认模式下，来自鼠标 ID x 的所有鼠标事件在左侧分割屏幕中得到响应，而来自鼠标 ID y 的所有鼠标事件在右侧分割屏幕中得到响应。
分割屏幕使用终端服务将 PC 显示器均分为两个屏幕
分割屏幕使用终端服务将 PC 显示器均分为两个屏幕 (单击该图像获得较大视图)
终端服务器容器实例具有重要作用，它使我们能够全面控制哪些事件传递到哪一屏幕并可启用更多高级功能。例如，我们可允许右侧光标跨越到左侧屏幕，轻松指向另一窗口（在教程中可能这样操作），甚至与另一窗口进行交互。
在这种情况下，部分右侧鼠标事件也会转入到左侧屏幕响应。我们也曾考虑过在 Windows 中使用虚拟技术来执行类似功能；虽然也可以成功，但我们发现它消耗的资源相对较多。
研究人员担心人们仅使用半个屏幕可能会感到不便。我们在印度班加罗尔进行了调查，并开展希望工程，为城市低收入的青少年讲授计算机基础知识。我们发现，学生使用拆分屏幕与每人一台计算机的学习效果差别不大，至少从一组有限的 IT 培训课程看来效果如此。我们还调查了是否存在人机工程学问题，结果是并不存在，即使在 14" 屏幕上也没有出现。最重要的是，该 IT 培训中心对此非常高兴，因为他们能够使用同等数量的 PC 为两倍的学生提供培训。
Microsoft 印度研究中心正在与终端服务及其他 Microsoft 组进行讨论，以确定分割屏幕技术是否值得投入市场。如果您有意采用分割屏幕技术，请告知我们您希望将其用于哪些方案。请发送电子邮件至 splitscr@microsoft.com。

Kentaro Toyama 是 Microsoft 印度研究中心 (research.microsoft.com/india) 的副主管以及新兴市场技术小组 (research.microsoft.com/research/tem) 的首席研究员，该小组旨在为全球经济相对落后的地区开发技术。


Windows 机密 史上最糟糕的两台 PC
Raymond Chen

2007 年 3 月 ，《PC World》发布了有史以来最糟糕的前 10 名 PC，前两名引起了我的注意，因为我们在实际工作中用过这两种电脑。嗯，“使用”这个词可能有点言过其实，更确切地说，应该是：我曾经目睹过这两种电脑，因为它们从推出到消失的大部分时间都是在 Microsoft 员工的办公室中度过。
Mattel 品牌的 Barbie PC 在《PC World》名单中位居第二。与其他色彩单调的廉价电脑相比，这款电脑算是一个极大的进步。这么说吧，虽然它也是一款色彩单调的廉价电脑，但是您可以将粉红色贴纸贴到机壳、显示器或扬声器上来加以装饰 — 明白它的所谓“进步”了吧！它还预安装了以 Barbie 为主题的软件。
我们弄到了一台这样的电脑来进行测试，那个可怜的测试人员备受它的折磨，但至少还能够以幽默和嘲弄的态度来投入测试工作，他用光了随附的所有贴纸和装饰来保证安装的这台电脑与“原设计”相同。这台电脑被放在一台从走廊一览无遗的桌子上，任何经历过和注意到这个闪亮粉红电脑灾难的人都可以对它进行研究。
Barbie PC 一时间成了人们的消遣对象。只要这台机器出现问题，开发人员就必须到办公室进行调试，一旦开发人员知道他们要处理的是哪种电脑时，您一定会看到有人流露出恍然大悟的表情或惊呼“怎么又是它！”。我还听说，某年暑假有个大学实习生在 Barbie PC 上安装了 Windows Server® Datacenter Edition，结果自己苦恼不堪。
最高的荣誉 — 准确说应该是最差的荣誉 — 要归于 Packard Bell PC。啊，这勾起了我的回忆。为了说明这台电脑“优秀”的设计，在此举出一个例子：出厂配置已插满了所有的扩展槽。或许他们认为：“我们的电脑太完美了，永远不用升级！”
早在 Windows® 95 项目时，一位高级主管买了一台作为家庭电脑。作为敢于作“第一个吃螃蟹的人”，他经常安装最新版的 Windows 95。您可能猜到，这台电脑出现了各种各样的问题，需要不断送回进行调试。
Windows 95 项目的开发经理很聪明，他毅然采取了直接的方法来解决问题。例如，为确保推出的 Windows 95 能够涵盖广泛的应用程序兼容性，他驾驶着一台小货车到当地的电脑商店买回了所有 PC 程序的副本。接着他将软件放到自助餐厅的桌子上，邀请 Windows 95 产品团队成员每人带走两个软件 — 附带条件是每个成员必须安装和运行他们带走的软件，还要针对所有异常事件（无论大小）建立错误档案。作为交换，他们可以保有这些软件。当时自助餐厅就像跳蚤市场一样热闹，团队成员打量着桌上的软件，兴奋地与同伴讨论：“你拿到了什么？”
由于高级主管将家用电脑带来调试的次数太频繁，Windows 95 的项目开发经理决定再次采取直接的方法。他去当地的电脑商店购买了一台和高级主管完全相同的 Packard Bell PC。
世界上有两台这样的电脑就已经够糟糕了，更糟糕的是我要负责在第二台电脑上安装 Windows 95 的每个新版本，然后针对所有出现的问题进行调试。这样，当这位高级主管在家庭电脑上安装最新版本时，就再也不会出现问题了。
如果您是个有心人，应该注意到这个计划有个拦路虎：Packard Bell PC 上没有可用的扩展槽，因此根本无处安装网络适配器卡！我必须改用其他间接的方法来连接网络。我实在恨透了这台电脑。

Raymond Chen的网站“The Old New Thing”及同名著作讲述了 Windows 的发展历程和 Win32 编程。这些看似很久远了，而实际上就像昨天发生得一样。