您好,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 的详细信息,可以看一下我们的两篇系列文章脚本故事(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