Windows PowerShell自动化目录管理

Don Jones

第一版 Windows PowerShell 最遗憾的事情之一是其时间安排。Windows PowerShell 团队是在一定的压力之下推出此产品的(需发布一个名为 Exchange Server 2007 的小产品并且这取决于 Windows PowerShell),而 Active

Directory 团队的时间却较宽裕(另一个名为 Windows Server® 2008 的小产品也在开发中)。因此,Windows PowerShell 所提供的高级 Active Directory® 管理功能较少。

清楚点讲,Windows PowerShell® 并非完全缺少 Active Directory 功能。实际上,Windows PowerShell 团队在最后一小时仍在顽强拼搏,实现了对 Active Directory 服务接口 (ADSI)(VBScript 用户已非常熟悉的一项易于进行脚本编写的技术)的有效支持。

ADSI 方法

ADSI 的工作方式类似于 Windows® 管理规范 (WMI)。您发出一个使用特殊语法编写的查询。该查询将被传输到远程计算机(如域控制器),然后执行它。查询结果为一个 Active Directory 对象或对象集合(如一个用户或一个用户组),并且您将获得该对象(之后可以使用)的引用。 您可以修改对象的属性或执行方法以保存更改、创建新对象、删除对象等等。例如,要创建用户,可查询希望用户所在的组织单元 (OU) 或容器。返回的对象具有一个 Create 方法,可使用此方法来创建用户。

从某个甚为基本的层面来言,在 Windows PowerShell 中使用 ADSI 简单且直接。例如,以下命令将检索某个用户并显示他的 Company 属性:

$user = [ADSI]"LDAP://cn=Ringo,ou=Singers,dc=company,dc=pri"
$user.Get("Company")

您可以通过管道将用户传送到 Get-Member 以查看其属性和方法。遗憾的是,Windows PowerShell 1.0 在实现这些目录对象方面实际并未全力以赴。如图 1 所示,外壳不会枚举对象的目录属性,也不会显示对象的方法(如我使用的 Get 方法)。

Figure 1 Piping the user to Get-Member to see its properties

Figure 1** Piping the user to Get-Member to see its properties **(单击该图像获得较大视图)

在 Windows PowerShell 2.0 社区技术预览版 (CTP) 中,此支持有所改善,但仅是在一定程度上的改善。关键问题在于底层 Microsoft® .NET Framework 使管理员无法轻松地看到他们所希望的内容—毕竟,Framework 最初是为开发人员而设计的。另一个问题是 Windows PowerShell 团队只能做到这些,更棒的 Active Directory 支持需要那些极其精通目录的人员来完成。换句话说,即 Active Directory 团队。我相信很快就会实现—毕竟,Windows PowerShell 尚处于早期阶段。但同时又该如何做呢?

您可能还记得,我在本专栏的 2007 年 6 月刊 (technetmagazine.com/issues/2007/06/PowerShell) 中介绍过使用 Windows PowerShell 中的 ADSI 技术。如果需要有关该“本机”技术的更多详细信息,建议您返回去阅读该专栏。在本月的内容中,我将介绍几种其他方法。

丰富生态系统

Windows PowerShell 架构师 Jeffrey Snover 常常提到有关 Windows PowerShell 的丰富生态系统。它的含义就是团队全力以赴确保 Microsoft 中的每个人(不仅仅是程序员)均可扩展 Windows PowerShell 的功能。众多公司均已通过创建本机 Windows PowerShell cmdlet(允许您通过命令行来管理其产品)来实现这一目的—VMWare、IBM、Citrix 和 Foundry 仅是迄今为止的几家大公司。

我最喜欢的该丰富生态系统的示例之一来自 Quest software。该公司提供了一组设计用于 Active Directory 管理、免费且非商业性的 cmdlet。您可从 quest.com/powershell 下载它们。他们还提供了 PowerGUI (powergui.org),该免费且非商业性的图形化 UI 构建在 Windows PowerShell 的基础之上,适用于那些尚不熟悉命令行的人员。PowerGUI 可使了解如何使用 Active Directory 管理 cmdlet 变得更加轻松。并且,我深信 cmdlet 会对您具有吸引力。这些 cmdlet 使您可轻松地实现史无前例的 Active Directory 管理功能。(如果想要阅读有关 PowerGUI 的更多信息,在 2008 年 1 月刊的工具箱专栏中实际已包括此内容,网址为 technetmagazine.com/issues/2008/01/Toolbox。)

Windows PowerShell 方法

涉及 cmdlet 的所有内容实际均为 Windows PowerShell 所用的处理方法。不必处理传统外观的脚本或奇特的编程对象。以下是我最喜欢的单行式命令。它是一个单独的命令行,即导入一个 CSV 文件并使用其中的信息创建数十甚至数百个新的 Active Directory 用户:

Import-CSV 'C:\provision1.csv' |
ForEach-Object {New-QADUser -organizationalUnit 'company.pri/Singers' -name ($_.'First Name' + '.' + $_.'Last Name') 
-samAccountName $_.'Logon name' -city $_.city -title $_.'Job title' -department $_.department} 

它确实是个很长的命令,但功能却强大得令人惊讶。首先是 Import-CSV(本机外壳 cmdlet),它只需读取一个 CSV 文件并返回对象。CSV 文件中的每一行都是一个单独的对象,并且 CSV 文件的列将成为对象的属性。在 Provision1.csv 文件中,列名类似于 "Logon Name" 和 "First Name"—这一点非常有趣,因为列名不会直接映射到 Active Directory 用户属性。我发现,文件(比如此文件)通常都是使用听起来熟悉的列名,而非特定于 Active Directory 的名称。毕竟,您可能是从公司人事部的某个人那里收到的此文件,他们不太可能知道 Last Name 在 Active Directory 实际是 sn 属性。

一旦将 CSV 文件中的所有数据导入并转换成对象,这些对象即会被通过管道传送到 ForEach-Object cmdlet,它将针对每个对象执行代码块(刚才的单行式命令的花括号中的内容)。即,对 CSV 文件中的每一行均执行一次该脚本。在该脚本中,特殊的 $_ variable 为当前对象(或 CSV 文件的当前行)的引用。

您可以看到,对于每个对象,我都执行了 New-QADUser cmdlet。它是 Quest 加载项中大约十几个 cmdlet 中的一个。名称 QADUser 值得关注一下。您可能已猜到,Q 代表 Quest。该命名约定旨在避免与 Microsoft Active Directory 团队将来可能推出的终极版 New-ADUser cmdlet 发生冲突。这样,如果同时将这两个 cmdlet 加载到外壳中,您和外壳将能够更加轻松地区分它们。

单行式命令的剩余部分包含 New-QADUser cmdlet 的参数。它首先指定 organizationalUnit,即您希望在其中创建所有新用户的位置。接下来是 name 属性,我已将它设置为 First Name 列的内容、句点以及 Last Name 列的内容。

最后一个有趣的事实是:city 参数实际会实际更改 Active Directory 中的 l 属性(或 Locality-Name)。cmdlet 还接受名为 l 的参数,所实现的功能完全相同。大多数情况下,引用 Active Directory 属性的参数可使用 Active Directory 用户和计算机工具的属性名称或文本标签。

其他 Windows PowerShell 方法

Active Directory 是分层存储,Windows PowerShell 的优势之一是能够将任意分层存储显示为磁盘驱动器,从而使您可以使用一组熟悉的命令(如 Dir、Del、Ren、Copy 等)来管理各种存储。不幸地是,Windows PowerShell 1.0 并未附带用于 Active Directory 的 PSDrive 提供程序,即意味着外壳无法将 Active Directory 本身显示为驱动器。

幸运地是,该丰富生态系统使 PowerShell Community Extensions 重新有了用武之地。它是一个免费的开源加载项,可从 codeplex.com/powershellcx 获取。安装后,PowerShell Community Extensions 使您可轻松将外壳指向域名,从而像驱动器一样管理目录。

CD COMPANY:
CD SINGERS
DIR

这些命令将更改到 COMPANY 域,更改到 Singers OU,然后显示对象列表(如图 2 所示)。可在那里使用 Del 这类命令来删除用户、使用 Md 来创建新 OU 等等。在 Community Extensions PSDrive 提供程序中有许多捕获。它们实质上必须与这样的功能打交道:您期望执行但又因为没有映射为 Active Directory 本身工作的方式而尚不可用。并且,您必须非常细心:更改为域的根目录以及运行 del * -recurse 实际上会删除域中的所有对象(如果您拥有权限)。甚至默认情况下,它不会询问“是否确定”。可以肯定,命令行的功能非常强大,但该功能也会给技术不熟练且不细心的人员带来风险。

Figure 2 Using the PowerShell Community Extensions to direct the shell and manage the directory

Figure 2** Using the PowerShell Community Extensions to direct the shell and manage the directory **(单击该图像获得较大视图)

立即开始使用外壳

我班上的学生们总是询问现在使用 Windows PowerShell 能做些什么。毕竟,并非每个 Microsoft 产品都为使用 Windows PowerShell 而进行了重新设计,并且您可能还认为 Windows PowerShell 仍在等待一个更好的时机。

事实上,这个时机已经来到。即使 Microsoft 尚未利用 Active Directory 来实现命令行管理,但其他人已在尽力尝试且做得非常不错。可使用 Windows PowerShell 来执行许多管理任务,包括自动化一些最耗时且繁琐的任务,如创建多批新用户。技巧是发现社区正在做的某些事情来使 Windows PowerShell 更加有用。(您可能希望探究 PowerShellCommunity.org,它是 Microsoft 联合赞助且由我帮助管理的一个网站。)将正确的工具加载到 Windows PowerShell 中后,可针对您不想执行的一些最耗时的管理任务编写脚本,并开始成为更有效且高效的管理员。

Don Jones 是**《Windows PowerShell:TFM, 2nd Edition》的合著者、**《VBScript, WMI, and ADSI Unleashed》的作者以及 PowerShellCommunity.org 的主管。

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