Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

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

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

今天的問題:如何在 Active Directory 中列舉所有萬用群組?


如何在 Active Directory 中列舉所有萬用群組?

嗨,Scripting Guy!請問如何在 Active Directory 中列舉所有萬用群組?

-- MW

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'"

應該替群組類型指派編號,並將這些號碼儲存在 groupType 屬性中:


群組類型
萬用群組 2
網域區域群組 4
萬用群組 8
安全性群組 -2147483648


若要搜尋所有萬用群組,您需要搜尋 groupType 值為 8 的群組。若只要搜尋萬用安全性群組,請將萬用群組的值與安全性群組的值相加:8 + -2147483648 = -2147483640。若要傳回網域中所有萬用安全性群組的清單,可使用此查詢:

"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.Properties("Page Size") = 1000 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

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


如需詳細資訊

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

 

回到頁首 回到頁首