Windows PowerShell

Windows PowerShell 2.0 将脚本编写功能引入 Active Directory,而不仅仅是 Windows Server 2008

Don Jones

有时,Microsoft 似乎需要很久才能推出我们需要的解决方案。我的意思是,Microsoft 在全球拥有数万名雇员,为何仍迟迟不见“Halo 4”推出?但有时,等待的理由很简单,Microsoft 总是想方设法推出正确 的解决方案,就 Active Directory 脚本编写和自动化而言,这样的等待终于换来回报。Windows Server 2008 R2 附带了一个 Windows PowerShell 2.0 模块,可实现出色的 Active Directory 脚本编写和自动化功能。

系统要求:事实与误解

Windows PowerShell 新增的 Active Directory 命令确实需要 Windows PowerShell v2。这些命令以模块(2.0 的新增功能)而非 PSSnapin 形式分发。模块更易于分发并且不需要安装或注册,您只需将其文件复制到 shell 的 Modules 文件夹并使用 Import-Module 命令将此模块导入到 shell 中即可。

Windows PowerShell 2.0 预安装在 Windows 7 和 Windows Server 2008 R2 中,并将在 2009 年年底或 2010 年年初左右的某个时间针对 Windows Server 2008、Windows Vista、Windows XP 和 Windows Server 2003 提供。Active Directory 模块附带了 Windows Server 2008 R2,但不要误认为在您环境中的每个域控制器 (DC) 中都必须运行此操作系统才能使用这些命令。实际上,这些命令可以在 Windows Server 2003 DC 和 Windows Server 2008(非 R2)DC 中正常使用,只要您在这些 DC 上安装免费的 Active Directory 管理网关服务(可从 microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=008940c6-0296-4597-be3e-1d24c1cf0dda 下载)即可。网关服务用于与 Active Directory 命令交互,此服务可安装在 Windows Server 2003 R2 SP2 和更高版本或者 Windows Server 2008 SP2 或更高版本上。

目前,您的客户端计算机需要运行 Windows 7 或 Windows Server 2008 R2,这是因为当前无法在任何早期操作系统版本上安装 Active Directory 模块。

身份验证

使用 Active Directory 时令人感到棘手的问题之一就是身份验证:您需要管理的域可能并不是您登录到的域,并且在您要管理的所有域之间可能没有信任。某些情况下,您可能在另一个域具有管理权限,但却只能通过备用用户帐户获得。Windows PowerShell 2.0 并未提供用于持久保留所有这些不同凭据的内置机制,因此 Active Directory 模块的编写者必须提供一项技术。他们设计的这项技术既明确又简单:Active Directory 模块包含一个 Windows PowerShell PSDrive 提供程序,这意味着您可以将驱动器映射到 Active Directory 域。该驱动器映射包含您的凭据,并使这些凭据能够在 shell 会话期间持久保留。当模块加载到 shell 中时,它会使用您在运行 Windows PowerShell 2.0 时使用的任何凭据自动映射您的登录域(注意:由于将应用用户帐户控制,因此如果您需要以“管理员身份”运行 shell,请确保执行此操作)。要映射新域,请使用 New-PSDrive cmdlet,此 cmdlet 支持用于指定凭据的命令行参数。

要将目录更改到映射的域中,请使用熟悉的 Cd 命令:例如,Cd AD: 可将 shell 的焦点更改到默认情况下映射的域中。更改到域中很重要,这是因为默认情况下所有 Active Directory 命令都将使用 shell 的焦点当时所在的任何域的凭据。这确实是一个巧妙的技术,使您无需每次手动指定凭据即可运行 Active Directory 命令。要对另一个域运行相同的命令?只需更改到该域,单击几次向上箭头重新调用此 Active Directory 命令,然后按 Enter 再次在新域中运行它即可。

但 Active Directory 命令并不强制您以这种方式进行操作:每个 Active Director 命令均支持根据具体情况指定凭据所需的命令行参数。因此您可以根据自己选择的方式进行操作,这样的灵活性令我很欣赏。产品团队本可以轻松地选择两种技术之一,他们之所以同时提供这两种技术是因为意识到用户需要的多样性。

命令

Active Directory 模块总共向 shell 中引入了 82 个新命令,其中既包括 New-ADUser 这样易于理解的命令,也有 Install-ADServiceAccount 这样比较难懂的命令。所有 cmdlet 均有一个“AD”前缀,该前缀有两个重要功能。首先,该前缀有助于将 cmdlet 与其他相似的命令区分开—New-ADUser 用于创建一个新的 AD 用户,而非新的本地用户、新的 SQL Server 用户或其他某种用户。其次,该前缀可帮助您轻松找到所有 cmdlet:运行 Help *–AD* 可显示全部 82 个新 cmdlet 的列表。

每个 Active Directory 命令都有命令行参数,在某些情况下,参数数量可能很多。例如,New-ADUser 便有很多参数,使您可以设置目录属性(如 Office、Organization 等),而不必记住内部架构属性名称(我永远都记不住“Last Name”在架构中用“sn”表示)。

这些命令的优点之一是可以防止您意外执行错误操作。例如,如果您运行 Get-ADUser,则可能会显示目录中所有用户的列表。在大型域中,这不但会耗费一定的时间,而且还可能会对 DC 产生明显的负面影响。为防止这种情况的发生,该命令提供了强制性的 –filter 参数,用于强制您提供起点(如组织单元)或某个其他条件。当然,该命令不会阻止 您执行所需的任何操作;实际上,使用 –filter * 将从目录中检索所有用户。但它不会 自动检索这些用户的每个属性,因为这样做可能会略微降低 DC 的性能。其他参数可帮助您对性能与获得所需信息之间的平衡进行微调。例如,–ResultPageSize 参数可用于指定一次显示的结果数量,–Properties 参数可用于指定要检索的属性。

消除了繁重的手动操作

过去在 Active Directory 中创建和填充一个新用户要编写二十多行 VBScript 代码,这样的岁月真是令人不堪回首。而现在,只需编写以下代码即可实现:

PS AD:\> new-aduser -name DonJ -CannotChangePassword $True -Department IT -DisplayName 'Don Jones' -EmployeeNumber 42 -GivenName Don -Office 'Las Vegas' -Organization 'Concentrated Technology' -PasswordneverExpires $True

一个绝妙的技巧:创建新用户后,您可能要对用户对象执行其他操作。如果向命令中添加 –PassThru 开关,则新创建的用户对象将输出到管道,以便另一个 cmdlet 可以接受它作为输入。这样,您就可以编写以下代码:

New-ADUser ...-passThru | Set-ADAccountPassword ...-passThru | Enable-ADAccount

显而易见,我对相应的语法进行了删减—“...”是所有普通参数出现的位置。该示例只是演示了 –passThru 如何使您继续将用户输出至管道,以便其他 cmdlet 可以对其执行操作。类似这样的技术可以实现非常高效的一行式命令(一个命令行,而不是一个脚本),从而使您可以更高效地工作。

别急…再给您介绍一个令人称绝的功能

谈到下面这个功能时,我真想在我的办公室里为这些 Active Directory 命令的编写者竖一座小神龛:我发现了一个名为管道参数绑定 的奇特小功能,这些编写者将其效果发挥到了极致。运行 Help New-ADUser –full 即可查看每个单独参数的帮助。您将注意到其中的很多参数(与 Active Directory 属性相对应的参数,如 City、Office 以及 Department)均接受管道输入“ByPropertyName”。这意味着您可以通过管道将输入传递给 New-ADUser cmdlet,如果输入包含与参数名称匹配的属性,则它们将自动匹配。因此,如果输入包含“City”属性,该属性会将自身附加到 –City 参数。如果输入包含“Department”属性,该属性会将自身挂接至 –Department 参数。

如果您知道 Import-CSV cmdlet 的用法,那么您一定已经体验到了兴奋不已的感觉。假设某个 .CSV 文件包含如下所示的列:

“Name”、“Department”、“Organization”、“City”

随后,该文件中的每一行均包含这些列的信息。您可以轻松地在 Microsoft Office Excel、Microsoft Office Access、Microsoft SQL Server 等应用程序中创建此结构,然后将数据导出为 CSV 格式。如果您执行此操作(别忘了使列名与 New-ADUser 的参数名称匹配),则可以按如下所示创建新用户:

Import-CSV c:\new-users.csv | New-ADUser

是的,这就是您需要键入的所有内容。如果您的 .CSV 文件包含所有所需的列(如 Name),且 –Name 参数是强制参数,则 New-ADUser 将奇迹般地将正确的 .CSV 列连接至正确的参数。只需键入 50 个以下的字符,即可在几秒 内导入 100 个新用户。如果此功能并未完全激发您学习 Windows PowerShell 2.0 的热情,那么我猜您实际上一定喜欢单击“下一步、下一步、完成”这样简单的鼠标操作。

正确进行 AD 管理

Windows PowerShell 的基本原则之一就是,编程人员应在 shell cmdlet 中编写所有 管理功能,例如,管理 Active Directory。本质上而言,任何 GUI 都应是这些 cmdlet 的前端。Microsoft Exchange Server 2007 引入了此模式,并且效果很好—您获得了一个出色的 GUI,并且如果此 GUI 并未完全提供您所需的功能,您始终可以选择改用命令行。那么,Microsoft 是否以这种方式重新编写了 Active Directory 用户和计算机?

当然不是。坦率地讲,这是一个非常旧的工具。Windows Server 2008 R2 提供了另一个创新功能:Active Directory 管理中心,它是一个用于管理 Active Directory 的全新 GUI。猜猜此管理中心的基础是什么?没错,就是那些 Active Directory cmdlet。这意味着您在 GUI 中执行的任何操作也可以在 shell 中执行,因此可以将任何重复或枯燥的操作委托给 shell 脚本执行。

因此我们可以说,在经过近十年的等待后,一个真正意义上的 Active Directory 终于推出。我们现在既可以选择通过 GUI 进行简单直观的管理,也可以通过功能完备的命令行(坦率地说,此命令行并不比使用 GUI 复杂很多)进行更强大的自动管理。您不必等待 Windows Server 2008 R2 的推出,因为利用恰当的加载项,您的 Windows Server 2003 域同样可以实现这种可管理性。

 

Don Jones是美国经验最丰富的 Windows PowerShell 培训师和作者之一。他每周都会在 ConcentratedTech.com 上发表 Windows PowerShell 使用技巧方面的博客;您也可以通过此网址联系他或向他请教问题。