MW,您好。很高興您提出這個問題。一般人提到 Active Directory 時,話題老是繞著群組打轉,好像 Active Directory 只有一種群組類型一樣。其實不然,Active Directory 群組有六種類型:萬用、網域區域和萬用安全性群組;以及萬用、網域區域和萬用發佈群組。能夠分辨各種類型是很重要的,畢竟,群組類型往往決定您能否執行特定工作,例如指派安全性權限或新增使用者到群組。
那麼,該怎麼在 Active Directory 中列舉所有萬用群組呢?最好的方法就是使用 ADO 來進行搜尋。麻煩的部分在於瞭解如何搜尋不同的群組類型。每個群組物件都包含名為 groupType 的屬性,但群組類型並非依名稱儲存。因此,如果要搜尋所有萬用安全性群組,這種查詢便派不上用場:
"SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='group'" & _
"AND groupType = 'universal security'"
"SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='group'" & _
"AND groupType = -2147483640"
一旦您瞭解如何建構查詢,剩下就是例行性的指令碼,跟以往撰寫過的各種 Active Directory 搜尋指令碼都很類似。今天我們不再贅述 Active Directory 的搜尋細節,否則就超出本專欄的範圍了。如果您想要進一步瞭解有關搜尋 Active Directory 的資訊,不妨參閱我們雙部曲系列的《指令碼物語》(Tales from the Script) 專欄 (2005 年 4 月至 5 月),其中對此主題有更詳盡的討論。
以下這段完整指令碼可將 fabrikam.com 網域中所有萬用安全性群組的清單盡數傳回:
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.CommandText = _
"SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='group'" & _
"AND groupType = -2147483640"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("Name").Value
objRecordSet.MoveNext
Loop