嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用《TechNet 專欄》,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:如何使用 Windows PowerShell 繫結至 Active Directory 使用者帳戶?


如何使用 Windows PowerShell 繫結至 Active Directory 使用者帳戶?

嗨,Scripting Guy!我已經試用過 Windows PowerShell (英文),覺得挺有趣的。有一個問題想請教一下。我想使用 PowerShell 快速取得 Active Directory 使用者帳戶資訊,但是不知道如何繫結至使用者帳戶,您有什麼建議嗎?

-- BW

BW,您好。前幾天我們曾提過,Windows PowerShell 目前仍是 BETA 版,雖然這項技術的確可運作 (而且挺順利),但是仍有一些功能未臻完備。很不巧,其中一項尚未完成的功能就是可以輕鬆繫結至 Active Directory 物件的 cmdlet (類似 WMI 裡的 Get-WMIObject (英文) cmdlet)。待日後 cmdlet 完成了,使用 Active Directory 就會易如反掌,但是那一天到來前,很抱歉,事情會比較麻煩。再會了,BW,外頭的陽光在呼喚我們啦!

不好意思,我們又回來啦,Scripting 編輯大人... 建議... 我們不要出去曬太陽,回來助您一臂之力。好吧,咱們來看看有沒有辦法使用 Windows PowerShell 繫結至 Active Directory 使用者帳戶。在此鄭重聲明,我們會這麼做全是因為屈服在 Scripting 老編的淫威之下。(目前還沒有人敢仿效《綠野仙蹤》用房子壓死這個壞心的女巫 (英文),真是不可思議。)

編按:Scripting 編輯大人通常會把這一段刪去,但她決定派《綠野仙蹤》的邪惡飛猴來教訓教訓他們。(她本來想祭出櫻粟花田迷昏一票 Scripting Guy,孰料他們平時就一直在睡覺。)

如果您曾經撰寫過VBScript 指令碼存取 Active Directory,應該是使用類似這樣的程式碼:

Set objUser = GetObject _
    ("LDAP://cn=kenmyer, ou=Finance, dc=fabrikam, dc=com")

TechNet Script Center

這行程式碼有何不妥呢?沒有任何不妥,只要您使用的是 VBScript,應該可以運作。但如果您使用的是 Windows PowerShell,情況就不同了,因為 Windows PowerShell 並沒有相當於 GetObject 方法的 cmdlet。如果您需要使用 GetObject 連至其他東西,問題就來了。

難道就無計可施了嗎?也不盡然。Windows PowerShell 裡有這麼一項酷炫功能,可以直接存取 .NET Framework。執筆這篇專欄的 Scripting Guy 雖然不算是 .NET Framework 方面的專家,但至少知道:DirectoryServices.DirectoryEntry (英文) 類別可用來繫結至 Active Directory 裡的物件。那我們有沒有辦法可以利用這個 .NET Framework 類別,取得 Ken Myer 使用者帳戶的資料呢?下面即將分曉。

我們溜出去曬一下太陽。別告訴某人,OK?(講不講應該也沒關係了,反正女巫的邪惡飛猴 (英文) 老是在抓我們的小辮子。)

編按:讀者別擔心,飛猴已經把 Scripting Guy 逮回辦公室繼續完成任務。

剛才說到哪了?不好意思,差點忘了,好像是如何使用 Windows PowerShell 繫結至 Active Directory 使用者帳戶。您只要開口就可以啦!

New-Object DirectoryServices.DirectoryEntry "LDAP://cn=kenmyer, ou=Finance, dc=fabrikam, dc=com"

正如您所見,這段程式碼真是小巧:我們不過是呼叫 New-Object cmdlet ,接上想建立的 .NET 物件類型 (DirectoryServices.DirectoryEntry),然後再指定想繫結物件的 ADsPath,就是這麼簡單!

順帶一題,您也可以使用 New-Object cmdlet 存取 COM 物件,但是稍嫌複雜,所以今天就不深入討論其中的原理和來龍去脈。不過為了引起您的好奇心,下面的命令可以啟動一個可見的 Microsoft Excel 執行個體 (注意 –com 參數的用法):

$A = New-Object -com Excel.Application; $A.Visible = $True

不賴吧?

方才介紹的 Active Directory 命令依預設只傳回使用者識別名稱。(似乎沒啥作用,光看識別名稱是 ADsPath 的一部份,就可以得知使用者的識別名稱啦!)沒關係,繫結到使用者帳戶後,接著使用 Select-Object (英文) cmdlet 挑出想要的參數。想知道使用者的 NametelephoneNumber 嗎?沒問題:

New-Object DirectoryServices.DirectoryEntry "LDAP://cn=kenmyer, ou=Finance, dc=fabrikam, dc=com" |
Select-Object name, telephoneNumber

現在您想要傳回所有的參數和相關的值?只要在呼叫 Select-Object 時添加萬用字元 (星號) 就得了:

New-Object DirectoryServices.DirectoryEntry "LDAP://cn=kenmyer, ou=Finance, dc=fabrikam, dc=com" |
Select-Object *

這種另類方法還不賴吧?

好問題!「要如何事先判斷使用者帳戶內有哪個屬性呢?」給您一個提示吧:繫結物件,然後將物件傳給 Get-Member (英文) cmdlet,讓它回傳所有的物件屬性和方法。

還有更棒的提示,試試看:

New-Object DirectoryServices.DirectoryEntry "LDAP://cn=kenmyer, ou=Finance, dc=fabrikam, dc=com" | Get-Member

今天的這篇專欄只不過回答了一個簡單的問題:如何繫結至 Active Directory 使用者帳戶並從中取回資訊?難怪您會再提出使用 Windows PowerShell 搭配 Active Directory 的問題 (也就是如何建立/刪除/修改使用者帳戶)。老實說,很多問題我們自己也不知道如何回答,因為我們也是 Windows PowerShell 的新手。但如果找到答案,第一個一定通知您,就這麼說定了!

現在我們真的要出去啦,因為西雅圖的陽光就像日蝕或加薪一樣可遇不可求,幸運的話,一輩子可能會遇到一次。我們對加薪是不報希望了,但是外頭的陽光可是不等人的歐。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首