Windows PowerShell自動化目錄管理

Don Jones

在推出第一版 Windows PowerShell 時,最背的其中一件事就是時間限制。Windows PowerShell 小組是在一定程度的壓力下推出產品 (它影響到另一個正準備發表的小產品,稱為 Exchange Server 2007),而 Active

Directory 小組當時手邊還有很多工作 (另一個稱為 Windows Server® 2008 的小產品也在進行中)。因此 Windows PowerShell 推出了不怎麼樣的 Active Directory® 管理功能。

更明確的說,Windows PowerShell® 並非完全缺乏 Active Directory 功能。事實上,Windows PowerShell 小組在最後一刻進了最大努力,將 Active Directory 服務介面 (ADSI) 的完善支援加入產品中,VBScript 使用者現在都很熟悉這項適合編寫指令碼的技術。

ADSI 之道

ADSI 的運作方式與 Windows® Management Instrumentation (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 的 Community Technology Preview (CTP) 中獲得些許改善,不過成效不大。重要的是,底層的 Microsoft® .NET Framework 並沒有讓系統管理員很容易找到所需的功能 — 畢竟,Framework 原本是專為開發人員所設計的。另一個問題是 Windows PowerShell 小組已經盡力而為,更進一步的 Active Directory 支援必須來自最了解目錄的人,也就是 Active Directory 小組。我確信會有這麼一天 — 畢竟 Windows PowerShell 還是很年輕的產品。但是您當下該如何應付這些問題呢?

您可能還記得,我在這篇 2007 年 6 月份的專欄中討論過使用 Windows PowerShell 隨附的 ADSI 技術 (technetmagazine.com/issues/2007/06/PowerShell)。如需有關該「原生」技術的詳細資訊,建議您回頭閱讀那篇專欄。在本期專欄中,我要示範一些其他方法。

豐富的生態系統

Windows PowerShell 架構設計師 Jeffrey Snover 常提到 Windows PowerShell 周圍的豐富生態系統。這只意味著,產品小組成功讓任何人 (不僅是 Microsoft 內部的程式設計師) 都能延伸 Windows PowerShell 的功能。有一些公司已經開始這麼做,這些公司建立原生 Windows PowerShell 指令程式來讓您從命令列管理這些公司的產品 — VMWare、IBM、Citrix 及 Foundry 都是其中一些主要公司。

Quest Software 可說是這種豐富生態系統當中我最津津樂道的範例之一。這家公司提供一組專為 Active Directory 設計的非營利免費指令程式。您可以從 quest.com/powershell 下載這些指令程式。他們也提供 PowerGUI (powergui.org),這是一個非營利的免費圖形化 UI,以 Windows PowerShell 為基礎針對還沒有準備好全面採用命令列的人而設計的。PowerGUI 讓您更容易學習如何使用 Active Directory 管理指令程式。相信我 — 您肯定會愛不釋手。這些指令程式提供輕鬆又有效的方式來管理 Active Directory,可說是前所未見 (如果您希望進一步了解 PowerGUI,PowerGUI 其實已經隨附 2008 年 1 月份的《工具箱》專欄中,網址是 technetmagazine.com/issues/2008/01/Toolbox)。

Windows PowerShell 之道

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 開頭,這個原生命令介面指令程式的工作只是讀取 CSV 檔案並傳回物件。CSV 檔案中的每一行都是單一物件,CSV 檔案中的欄會變成物件屬性。在我的 Provision1.csv 檔案中是使用類似「Logon Name」及「First Name」之類的欄名稱 — 這點很有趣,因為欄名稱不會直接對應到 Active Directory 使用者屬性。我發現這些檔案常會使用比較通俗的欄名稱,而非 Active Directory 特有的名稱。畢竟,您收到的檔案可能來自公司人事部的員工,他們應該不曉得 Last Name 實際上等於 Active Directory 中的 sn 屬性。

一旦匯入 CSV 檔案中的所有資料並傳回物件時,那些物件便會輸送到 ForEach-Object 指令程式,而指令程式會為每個物件執行一段程式碼 — 位於我的單行指令碼的大括號內。也就是說,這段指令碼會針對 CSV 檔案中的每一行各執行一次。在指令碼內,特殊 $_ variable 是目前物件 — 或 CSV 檔案目前行的參考。

您可以看到,我針對每個物件執行 New-QADUser 指令程式。這是 Quest 增益集中數十種指令程式中的其中一種。名稱 QADUser 不值一提。至於 Q,您應該已經猜到,代表 Quest。此命名慣例的設計是為了避免與 Microsoft Active Directory 小組未來生產的最終 New-ADUser 指令程式相互衝突。這麼一來,如果這兩個指令程式同時載入命令介面,您和命令介面都能輕鬆辨別這兩者。

單行指令碼的其餘部分包含 New-QADUser 指令程式的參數。它一開始指定 organizationalUnit,這是您要建立所有新使用者的位置。下一個是名稱屬性,我已將它設為 First Name 欄的內容、一個句點,然後是 Last Name 欄的內容。

最後一點很有趣的是:city 參數實際上會在 Active Directory 中變更 l 屬性 (或 Locality-Name)。指令程式也接受命名為 l 的參數,它也是執行相同的動作。在大部分的情況下,指向 Active Directory 屬性的參數可以使用屬性名稱或 Active Directory 使用者和電腦工具的文字標籤。

其他 Windows PowerShell 之道

Active Directory 是階層式的存放區,Windows PowerShell 的其中一項長處就是能夠將任何階層式存放區公開為磁碟機,讓您使用熟悉的命令集來管理各種存放區,例如 Dir、Del、Ren、Copy 等等。可惜的是,Windows PowerShell 1.0 並未隨附 Active Directory 的 PSDrive Provider,也就是說命令介面無法將 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 Provider 中有幾處陷阱。基本上,這是由於您可能預期某些功能會實作,但因它們並未與 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 and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.