這行程式碼有何不妥呢?沒有任何不妥,只要您使用的是 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 挑出想要的參數。想知道使用者的 Name 和 telephoneNumber 嗎?沒問題:
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 的新手。但如果找到答案,第一個一定通知您,就這麼說定了!
現在我們真的要出去啦,因為西雅圖的陽光就像日蝕或加薪一樣可遇不可求,幸運的話,一輩子可能會遇到一次。我們對加薪是不報希望了,但是外頭的陽光可是不等人的歐。 |