嗨,Scripting Guy!

Hey,Scripting Guy!

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

今天的問題:我要如何使用含有逗號的 CN?


我要如何使用含有逗號的 CN?

嗨,Scripting Guy!我的使用者帳戶的 CN 屬性中具有逗號,例如 Myer, Ken。使用指令碼時要如何繫結這些使用者帳戶呢?我總是收到 An invalid dn syntax has been specified (指定一個不正確的 dn 語法) 錯誤訊息。

-- GT

GT,您好。先提供給還不知道的讀者,CN 屬性是在 OU 或其他 Active Directory 容器內用來唯一識別使用者帳戶的屬性 (在網域中可能有多個 Myer, Ken,但是在每個 OU 中,好比說 Accounting OU,只能有一個的 Myer, Ken)。CN 屬性也是在 Active Directory 使用者和電腦中用來顯示使用者名稱的屬性。從 Active Directory 使用者和電腦內加入使用者時,您通常會填寫一個標為「全名」的欄位 (然後,基於某種原因,當您稍後檢視使用者帳號內容時,這個欄位會重新標記為「顯示名稱」)。系統管理員習慣使用姓氏、名字的語法來指定 CN (全名),這樣在他們檢視 OU 時,所有的使用者就會以姓氏的字母順序排列出來 (如果將 Ken Myer 指定為全名,就會依照名字的字母順序排列使用者)。

換句話說,使用者具有類似 Myer, Ken 這類的 CN 是很平常的事。這對於在 Active Directory 使用者和電腦中的作業來說非常方便,但在嘗試使用 ADSI 指令碼管理這些使用者時,就不是那麼好用了。例如,這段嘗試繫結到 Myer, Ken 使用者帳戶的指令碼就會因語法無效的錯誤而失敗:

Set objUser = GetObject("LDAP://CN=Myer, Ken,OU=Accounting,DC=fabrikam,DC=com")
Wscript.Echo objUser.CN

那麼,其中的問題在哪?問題並不在於使用者的 CN,Myer, Ken 是完全有效的。問題是當您在 ADSI 中撰寫繫結字串時,會使用逗號來隔開 ADsPath 內的各個值。當寫入 CN=Myer, Ken,OU=Accounting 時,指令碼會將 CN=Myer 當做第一個值,而 Ken 則當做第二個值。這是因為有個逗號位於 Myer 和 Ken 之間,而且 Ken 本身在 ADsPath 內不具任何意義,指令碼便會無效。

那麼您怎麼知道會這樣?答案是,逗號對於 Active Directory 路徑而言是保留字元 (其他保留字元包括分號、加號、反斜線和左右角括弧)。如需完整清單,請參閱 MSDN 上的輕量型目錄存取通訊協定 (英文) 文件。

對於大部份的保留字元而言,只要在字元前面加上反斜線 (\),就可以使用於繫結字串中。這段指令碼可以成功繫結至 Myer, Ken 使用者帳戶,並回報使用者的 CN:

Set objUser = GetObject("LDAP://CN=Myer\, Ken,OU=Accounting,DC=fabrikam,DC=com")
Wscript.Echo objUser.CN

請再次注意使用者 CN 的指定方式:CN=Myer\, Ken,OU。我們在 Myer 後放置反斜線和逗號,接著就繼續寫入路徑的其餘部份 (包括隔開 Myer,Ken 的空格)。


如需詳細資訊

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

 

回到頁首 回到頁首