Exchange Server 2007

轻松驾驭 Exchange 管理外壳

David Strome

 

概览:

  • Exchange 管理外壳工作原理
  • Cmdlet 使用方法
  • Cmdlet 与命令

如果您是 Exchange 环境的管理人员,那么您现在一定已经听说了即将发布的 Exchange Server 2007 包含一个全新的命令行接口,称为 Exchange 管理外壳。Exchange 管理外壳构建于 Microsoft Windows PowerShell 技术之上,

是一个强大的管理接口,可用来通过命令行从各个方面管理 Exchange Server 2007。通过命令行,您可以与 Exchange 管理外壳直接进行交互,为实现自动化编写脚本,或将应用程序与底层引擎相集成。图 1 显示了作用中的外壳。

图 1 Exchange 管理外壳

图 1** Exchange 管理外壳 **(单击该图像获得较大视图)

Exchange Management Console 不只是使用 Exchange 管理外壳来执行操作;其中的各种向导还会告诉您它们正在执行哪些命令。可复制向导所创建的命令并直接将它们粘贴在命令行或脚本中。根据需要修改参数后,可使用 WhatIf 参数对脚本或命令进行测试,以便在对环境做出任何实际的更改之前查看其结果。

Exchange 管理外壳提供了一个强大而灵活的脚本编写平台,用以与当前的脚本编写解决方案相集成,它还允许您直接与 COM 和 Windows Management Instrumentation (WMI) 等数据源进行通信。Exchange 管理外壳以 .NET Framework 为基础,它使用 cmdlet(Exchange 管理外壳中的最小功能单元)来接受和返回结构化的数据而非纯文本。稍后我们将深入探讨 cmdlet。

Windows PowerShell 管理单元

了解 Exchange 管理外壳要从它与 Windows PowerShell™ 的关系入手,后者是一个基于 .NET Framework 的、强大而又灵活的全新命令行接口。它结合了许多其他外壳的最佳功能,同时也加入了许多新功能。Windows PowerShell 专门用于托管其他应用程序,这在很大程度上与 Microsoft 管理控制台 (MMC) 负责托管应用程序所提供的各种管理单元相类似。Exchange 管理外壳是第一个发布的 Windows PowerShell 管理单元。

管理单元是用于管理应用程序或主要组件的 cmdlet 的集合。它们如果不先加载,就无法使用。幸运的是,启动 Exchange 管理外壳管理单元的过程非常简单。不过,在探讨这一点之前,我应该首先解释一下您在阅读本文及使用 Exchange 管理外壳时需要了解的一些主要概念。

Cmdlet:Cmdlet 类似于其他外壳中的内置命令,例如 cmd.exe 中的 dir 命令。与这些为人所熟知的命令一样,cmdlet 可以从 Exchange 管理外壳的命令行中直接进行调用并在该外壳的上下文中运行,而不能用作单独的进程。但与其他外壳中的命令不同的是,cmdlet 带有“动词-名词”形式的描述性名称。动词说明 cmdlet 所执行的操作,而名词则说明将接受该操作的组件或功能。

您不必猜测 cmdlet 具体做些什么。当看到 Move-Mailbox cmdlet 后,一切不言自明。

要了解 cmdlet 与普通的命令有何不同,请参阅侧栏“Cmdlet 与命令”,它摘录自 Windows® SDK 的 .NET Framework 3.0 部分,可以通过 windowssdk.msdn.microsoft.com/en-us/library/ms714395.aspx 找到它。

身份和位置参数:Identity 参数可以用于大多数与 Exchange 相关的 cmdlet 中。它允许您访问用于引用 Exchange Server 2007 中特定对象的唯一标识符,以便使用对您最有意义的唯一值对特定 Exchange 对象执行操作。

Identity 参数是来自其他参数的数值的集合。这些值对于该组对象一定是唯一的。这些其他参数(如 Name 和 DistinguishedName)的值可以由您指定,也可以由系统生成(例如 GUID)。所使用的其他参数(如果存在)及其填充方式取决于所引用的对象。

Identity 参数也可视为位置参数,对于这种参数,您可以指定其值而不必指定其名称。Parameter Position 属性为整数的参数即为位置参数。该整数表示命令行上 cmdlet 可找到参数值的位置。因为 Identity 是位于位置 0(第一个位置)的位置参数,所以在此位置输入的任何不具有参数名的值均被视为 Identity 参数的值。这减少了键入命令时的击键次数。例如

Get-Mailbox –Identity "Kim Akers" 

所执行的操作与下面的命令相同:

Get-Mailbox "Kim Akers"

管道操作:Exchange 管理外壳中的管道操作是指一个 cmdlet 在执行操作时使用另一个 cmdlet 的输出。管道操作是使用管道符号“|”来完成的。同一名词 cmdlet 集中的所有动词都可以使用通过管道操作从另一个命令获得的信息。某些名词 cmdlet 集还允许通过管道向另一个名词 cmdlet 集传递数据。

通过将两个或更多 cmdlet 的操作一起通过管道传递给字符串的方式,可以在增强组件功能的同时,减小组件的规模。例如,可以使用一个 cmdlet 来收集数据,再将该数据传递给第二个 cmdlet 以将该数据筛选为一个子集,然后将该数据传递给第三个 cmdlet 以便只对该子集执行操作。

启动 Exchange 管理外壳

此外壳最为简便的加载方式是:单击“开始”、“程序”、“Microsoft Exchange Server 2007”,然后单击“Exchange 管理外壳”。

Exchange 管理外壳管理单元的另一种加载方式是从 Windows PowerShell 会话手动进行。单击“开始”、“程序”,然后单击“Windows PowerShell”。在其启动后,运行如下命令来加载 Exchange 管理外壳:

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin

在加载 Exchange 管理外壳管理单元时,使用“程序”菜单项和使用 Add-PSSnapin cmdlet 手动启动这两种方式之间存在一些区别。使用“程序”菜单项时,不仅会加载 Exchange 管理外壳管理单元,还会运行 Windows PowerShell 脚本以建立自定义的 Exchange 管理环境。如果要在手动加载 Exchange 管理外壳后建立类似的管理环境,请进入 Exchange 安装目录下的 bin 目录,例如 C:\Program Files\Microsoft\Exchange Server\Bin。然后,运行如下命令:

.\Exchange.ps1

看看 Exchange.ps1 脚本可以了解如何根据需要定制 Windows PowerShell 环境。加载 Exchange 管理外壳时,会出现类似图 2 的欢迎信息。

图 2 Exchange 管理外壳欢迎标语

图 2** Exchange 管理外壳欢迎标语 **(单击该图像获得较大视图)

从何处入手?

此外壳包含内容广泛的 cmdlet 集合,因此 Get-Help cmdlet 和 Exchange Server 2007 帮助文件将是非常宝贵的资源。Exchange Server 2007 帮助文件的“操作”部分针对大多数管理任务提供了丰富而详尽的操作步骤。

键入不带参数的 Get-Help 后,会出现有关如何获得帮助的一般性帮助信息。要获得某个具体 cmdlet 的帮助,请键入后跟所要了解的 cmdlet 的 Get-Help 命令。使用 Detailed、Full 和 Example 参数可以控制所显示的信息。只需将它们加到命令结尾即可。例如,Get-Help cmdlet name –Full 可返回某个 cmdlet 所有可用的帮助部分。

如果要检索某个 cmdlet 的某个特定参数或多个参数的信息,可以在 Get-Help 中使用 Parameters 参数。例如,如果要查看 Set-Mailbox cmdlet 所有包含“quota”一词的参数及其说明,应使用如下命令:

Get-Help Set-Mailbox –Parameter *quota*

有时,您可能想列出所有管理特定服务器角色或组件功能、或在某特定功能作用域内影响对象的 cmdlet。为此,Get-Help cmdlet 允许您使用如下三个参数:Role、Component 和 Functionality。在 Get-Help cmdlet 中使用这些参数时,必须用通配符符号“*”将通过这些参数所指定的值括起。下面的示例说明了如何以每个参数调用 Get-Help:

Get-Help -Role *Mailbox*
Get-Help -Component *Recipient*
Get-Help -Functionality *Server*

要了解详细信息,Exchange Server 2007 帮助文件中的“获取帮助”主题列出了可供使用的所有角色、组件和功能值。

设置命令输出格式

默认情况下,Exchange 管理外壳在屏幕上显示输出时,只显示每个对象可用属性的子集。不过,将命令输出通过管道传递给下列三个格式化 cmdlet 后,即可轻松访问到所有属性:Format-List、Format-Table 和 Format-Wide。您或许会定期使用 Format-List 和 Format-Table,因此我将加以一一讨论。

Format-List cmdlet 从管道接收输入并输出由每个对象的所有指定属性组成的竖向分栏列表。使用 Property 参数可以指定所要显示的属性(尽管 Property 参数是一个位置参数,也就是说您只需指定值而无需指定参数名)。如果调用未指定任何参数的 Format-List cmdlet,则会输出所有属性。此 cmdlet 会将输出内容自动折行而不会将其截断。Format-List 的一个最佳用途是覆盖 cmdlet 的默认输出,使您可以检索额外的信息或更为切题的信息。例如,

Get-DistributionGroup | Format-List Name, *OnlyFrom, 
PrimarySmtpAddress, *Size*

图 3 显示了此命令的输出。

图 3 Format-List 输出示例

图 3** Format-List 输出示例 **(单击该图像获得较大视图)

Format-Table cmdlet 可以按由属性数据的列和标签标题组成的表格形式来显示各项内容。默认情况下,Get-Mailbox 和 Get-JournalRule 等许多 cmdlet 都使用表格格式输出内容。Format-Table cmdlet 的参数包括 Properties 和 GroupBy。这些参数的工作原理与 Format-List cmdlet 中的完全一样。要完全显示较长的属性信息行而不是在行末将其截断,可使用 Wrap 参数,用法如下:

Get-Mailbox –Database Research | Format-Table Name, 
ProhibitSendQuota, Database –Wrap 

请参阅图 4 查看输出内容。

图 4 Format-Table 输出示例

图 4** Format-Table 输出示例 **(单击该图像获得较大视图)

如果加入通配符,您可以无需分别键入各属性名即可匹配多个属性。例如,下面的代码会返回所有以“E-mail”开头的属性。

Get-Mailbox | Format-List Email* 

练习时间

既然您已经掌握了一些基本的命令,为什么不练习一下下面的例子。它们将进一步证明 Exchange 管理外壳的强大功能和灵活性,并让您亲自示范。

您将尝试的第一个命令会创建 10 个用户,其名称从 User1 到 User10:

1..10 | ForEach { Net User "User$_" MyPassword=01 /ADD 
/Domain; Enable-Mailbox "User$_" -Database "Mailbox 
Database" }

让我们来逐一加以剖析。命令 1.0 会输出整数 1 到 10 并通过管道传递给 ForEach cmdlet。ForEach cmdlet 会在收到每个对象时作用于其上,并对每个对象运行 { } 括号内的命令。Net User 命令会创建一个新的域用户,Enable-Mailbox cmdlet 则会在本地服务器上的“Mailbox Database”中创建一个新邮箱。这两个命令以分号分隔,从而能够处于同一命令行中。$_ 变量是包含管道中当前对象值的特殊变量。对本示例而言,$_ 变量包含当前管道中的整数。

下面的示例将会显示服务器 MBX 上的邮箱,并返回每个邮箱的 Name、mailbox database 和 quota 属性。

Get-Mailbox –Server MBX | Format-Table 
Name,Database,*quota*

Get-Mailbox cmdlet 会返回由 Server 参数所指定的每个邮箱,然后将每个邮箱对象的输出通过管道传递给 Format-Table cmdlet。默认情况下,如果未指定所要显示的属性,Format-Table cmdlet 会显示由 cmdlet 返回的所有属性。这里只请求了 Name 和 Database 属性,以及所有包含字符串“quota”的属性。图 5 显示了可能的输出形式。

图 5 Get-Mailbox 命令输出

图 5** Get-Mailbox 命令输出 **(单击该图像获得较大视图)

在下面的示例中,针对组织内职务为“经理”一级的所有启用了邮件功能的用户,将发送配额限制设置为 600MB。

Get-User –Filter { Title –Like "*Manager*"} 
–RecipientTypeDetails UserMailbox | Set-Mailbox 
–ProhibitSendQuota 600MB

如果只运行 Get-User cmdlet 本身,将会返回 Active Directory 中的所有用户对象,其中包括未启用邮箱功能的用户。要检索一组可由 Set-Mailbox cmdlet 使用的用户对象,需要指示 Get-User cmdlet 仅返回启用了邮箱功能的用户的 Active Directory 用户对象。RecipientTypeDetails 参数用于指定 Active Directory 收件人类型(本例中为 UserMailbox)。接下来,需要检索一组职务为“经理”一级且启用了邮箱功能的用户。在本例中,每个 Active Directory 用户对象的 Title 属性都已填写完毕。可以通过 Filter 参数(用于指示服务器仅返回符合标准的 Active Directory 对象)利用此属性值来确定哪些用户是经理。这称为服务器端筛选。拥有一组对象后,它们会被传递给 Set-Mailbox cmdlet,该命令随后会将每个邮箱的 ProhibitSendQuota 属性设置为 600MB。

接下来,我们再来测试一个命令的结果,看其是否能删除某个通讯组内的所有邮箱。该命令如下:

Get-DistributionGroupMember "Fourth Year Students" |
 Where { $_.RecipientType –Eq "UserMailbox" } | Remove-
 Mailbox -WhatIf

第一个 cmdlet 会检索作为“Fourth Year Students”通讯组成员的收件人对象。然后,只将符合 RecipientType 为“UserMailbox”的收件人对象传递给 Remove-Mailbox cmdlet。Remove-Mailbox cmdlet 将显示其执行的操作及要被执行操作的对象,而并不删除这些邮箱。Get-DistributionGroupMember cmdlet 会检索作为“Fourth Year Students”通讯组成员的所有收件人对象的列表。但由于 Remove-Mailbox cmdlet 只能处理启用了邮箱功能的用户,因而您需要筛选掉除“UserMailbox”之外的所有收件人类型。与一些其他 cmdlet 不同,Get-DistributionGroupMember cmdlet 并没有 Filter cmdlet,这意味着它无法执行服务器端筛选。对于不能执行服务器端筛选的 cmdlet(因为它们没有任何性能优势),可以使用 Where cmdlet 来执行客户端筛选,该命令可以检索所有对象并在本地客户机上执行筛选。Where cmdlet 只允许那些符合所指定标准的对象通过。RecipientType 为“UserMailbox”的对象被发送给 Remove-Mailbox cmdlet。此 cmdlet 会删除 Active Directory 用户对象并将邮箱标记为“删除”。如果使用 WhatIf 参数,Remove-Mailbox cmdlet 会显示如下的文本:

What if: Removing the Mailbox "contoso.com/Users
/user10" will remove the Windows user object and mark 
the mailbox in the database for removal.

如果您对该命令将执行所需的操作感到满意,请不带 WhatIf 参数再次运行该命令。对于某些 cmdlet,例如带有 Remove 动词的 cmdlet,此外壳将在进行任何更改之前自动要求确认。您可以选择单步调试每个更改、指示外壳不再提示确认,或者取消进一步处理。对于不能自动实现确认的 cmdlet,可使用 Confirm 参数进行强制确认。

结束语

既然已经领略了 cmdlet 的强大功能,想必您已准备去亲自体验,感受 Exchange 管理外壳和 Microsoft Windows PowerShell 将给您未来的系统管理任务提供怎样的帮助。如果想要阅读这两方面主题的更多内容,请查看下列资源。有关管理外壳的相关信息,请参阅 Exchange Server 2007 帮助文件 (go.microsoft.com/fwlink/?LinkId=69434)、Windows Powershell 脚本编写中心 (go.microsoft.com/fwlink/?LinkId=71134) 以及 Exchange 团队博客 (msexchangeteam.com)。

David Strome 担任 Microsoft“Exchange 用户培养”团队的技术撰稿人已有一年时间。在加入位于华盛顿雷德蒙的 Microsoft 之前,David 有大约 10 年时间供职于加拿大大不列颠哥伦比亚省的多家公司,从事 Exchange Server 设备的设计、实现和管理工作。可通过 dstrome@microsoft.com 与他联系。

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.