JP,您好。感恩節前一天,其中一名 Scripting Guy 正在匆匆完成嗨,Scripting Guy!專欄,希望能火速奔往他處。怎麼這麼巧,他剛好挑到一個關於搜尋 Active Directory 問題,解答連睡著都寫得出來 (他大概也無聊的睡著了)。
Active Directory 搜尋專欄這麼容易寫,因為我們稍微作弊:通常只要超出搜尋,我們不會深入說明。Active Directory 搜尋其實很簡單,因為大部分的指令碼都是現成的,不需要因指令碼更改。但是現成指令碼的確很多,礙於版面篇幅無法在這個小專欄多著墨。因此如果讀者有興趣進一步瞭解如何撰寫可以在 Active Directory 搜尋的指令碼,我們通常推薦《指令碼的故事》系列文章中,分兩部分介紹的〈老兄,我的印表機咧?〉(Dude, Where’s My Printer?)。
附註:想知道 Scripting Guy 的工作有多麼難嗎?這麼說吧,這一位 Scripting Guy 寫的指令碼只不過參考別人已經寫好的文章,然後叫老媽在廚房忙東忙西,自己悠閒地慶祝感恩節。日子真是不好過啊。
On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.CommandText = _
"SELECT Name FROM 'LDAP://DC=fabrikam,DC=com' WHERE objectCategory='group' " & _
"AND Name='G-S-Group*'"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("Name").Value
objRecordSet.MoveNext
Loop
這裡要注意的是可傳回符合條件 (也就是以 G-S-Group 開頭的名稱) 的 SQL 查詢:
"SELECT Name FROM 'LDAP://DC=fabrikam,DC=com' WHERE objectCategory='group' " & _
"AND Name='G-S-Group*'"
您看,我們得在 Where 子句類指定兩個東西:1) objectCategory 必須等於 group (確保取回的是群組,而不是使用者、OU、印表機等在 Active Directory 上的其他東西),而且 2) Name 屬性必須以 G-S-Group 開頭。要指定後面這項,必須將 Name 的搜尋值設定為查詢對象 G-S-Group,後面加上星號 (*),代表「所有的東西」。這裡要表達的用白話翻譯就是:「給我瞧瞧所有名稱以 G-S-Group 開頭的群組群組,不管後面跟著什麼。」