Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

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

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

今天的問題:如何擷取在其名稱中有連字號的 Active Directory 屬性的值?


如何擷取在其名稱中有連字號的 Active Directory 屬性的值?

嗨,Scripting Guy!我們有個自訂應用程式,會在 Active Directory 架構中加入一些屬性。這些屬性在名稱中有連字號,所以我想不透要如何擷取這些屬性的值,每次我嘗試連接其中一個屬性,就會收到錯誤訊息。有什麼建議嗎?

-- TW

TW,您好。很多人都不相信巧合或是偶然,他們寧願相信事出有因 (當然,我們這些 Scripting Guys 通常想不透到底是什麼原因,不過還是一樣…)。

為什麼提到許多人不相信巧合呢?因為有趣的是,就在收到您的電子郵件的同時,我們正好在把玩一些新屬性,這些屬性已經加入 Windows Server 2003 的 Active Directory 架構中。當中的許多屬性在名稱中剛好也有連字號,所以我們寫了一個類似下面的簡單指令碼:

Set objUser = GetObject("LDAP://cn=Ken Myer, OU=Finance, DC=fabrikam, DC=com")
Wscript.Echo "User account control computed: " & objUser.msDS-User-Account-Control-Computed

猜猜看當我們試著執行其中一個簡單的小小指令碼時,發生了什麼事?如果您猜「應該沒問題,然後你得到你想找的值」,那麼看看下面這段程式碼:

C:\Scripts\test.vbs(2, 1) Microsoft VBScript runtime error: Object doesn't support 
this property or method: 'objUser.msDS'

哎呀!ADSI 不喜歡在屬性名稱中看到連字號,實際上,只要是攸關 ADSI,我們的屬性名稱 (msDS-User-Account-Control-Computed) 就只會包括四個字母 msDS。ADSI 只要一碰到連字號,就會假設它到達了屬性名稱的結尾,接著會嘗試尋找一個名為 msDS 的屬性,而且一點也不用驚訝的是,它根本找不到。

「巧合」的連環效應更詭異的地方來了,就在一個星期前左右,我們終於解決了一個困擾我們近一年的問題:如何使用 ADO 來讀取在檔名中含有空格的文字檔? 結果答案是,把檔名用方括弧括起來,像這樣:

strFile = "[Fabrikam Employees.txt]"

雖然看起來希望渺茫,我們還是決定在 Active Directory 屬性名稱周圍加上方括弧:

Set objUser = GetObject("LDAP://cn=Ken Myer, OU=Finance, DC=fabrikam, DC=com")
Wscript.Echo "User account control computed: " & objUser.[msDS-User-Account-Control-Computed]

如果您曾看過《陰陽魔界》,就知道會發生什麼事:方括弧好用得不得了!您需要取得或設定一個在其名稱中有連字號的 Active Directory 屬性的值嗎?那就在名稱周圍加上方括弧準沒錯。這麼做之後,一切就像魔法一樣,什麼問題都一掃而空了。趕快試試看。

很怪異對吧?

對了,您可以在任何屬性名稱周圍加上方括弧,指令碼照樣行得通。我們不確定您為什麼應該這麼做,不過下面的指令碼會傳回使用者 Ken Myer 的 CN:

Set objUser = GetObject("LDAP://cn=Ken Myer, OU=Finance, DC=fabrikam, DC=com")
Wscript.Echo "CN: " & objUser.[CN]

光想到就覺得一股冷顫,是吧?不過,有可能純屬巧合囉...


如需詳細資訊

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

 

回到頁首 回到頁首