你好,MC.孩子,如果我们每次被问到这个问题的时候都收一个五分硬币 —— 好,OK,我们已经有了一个硬币。但是,这仅仅是因为我们刚刚开始做这个展览;相信我们,总是有人问这个问题。
您在这里遇到的问题是由于 Active Directory 的默认设置:默认情况下,每次对 Active Directory 进行查询的时候,只能得到前 1,000 个对象。这就是问题所在。这与 Active Directory 中实际有多少个对象无关,也与您的域控制器配备了多少内存无关,问题的根源仅在于:您只能得到前 1,000 个对象。
幸运的是,有一个简单的解决办法。这里有一个脚本,可以返回 Active Directory 中的所有 用户帐户。是的,我刚才说的是“所有”;如果您有 100,000 个用户帐户,脚本可以返回全部帐户:
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='user'"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("Name").Value
objRecordSet.MoveNext
Loop
那么,诀窍在什么地方呢?诀窍就在于将 Page Size(页大小) 设为 1000 的那一行代码。那么它有什么特殊之处呢?好,如果您不指定 Page Size,Active Directory 就只返回前 1000 个项目。如果您 指定了 Page Size,那么 Active Directory 便会返回前 x 个项目,然后暂停,对记录进行分割,然后返回下面的 x 个项目,然后再暂停,如此反复。此过程会一直继续,直到返回所有项目。在本例中,我们将 Page Size 设置为 1000(最大值),所以会得到前 1000 个项目,然后是一个暂停(一般无法察觉),接着再得到 1000 个项目。此过程会一直继续,直到返回所有项目。