有没有办法从对 ADO 命令查询的响应中获取列列表?

Is there any way to get a list of columns from a response to a ADO Command query?

我正在尝试使用 VBscript 获取 Active Directory (AD) 用户列表(及相关信息)。 问题是我不知道如何获取已接收列的完整列表。

我试图查看(通过使用 Visual Studio 2017 年的调试器)响应(对象 "objUser")中的内容,但调试器只显示了点。

主集:

Set objCommand = CreateObject("ADODB.Command")

strQuery = "<LDAP://" + strDNSDomain + ">;(&(&(objectCategory=person)(objectSid=*)(!samAccountType:1.2.840.113556.1.4.804:=3)));objectGUID;subtree"
objCommand.CommandText = strQuery

Set objRecordSet = objCommand.Execute

循环处理

Do Until objRecordSet.EOF
    strLine = ""

    arrbytGuid = objRecordSet.Fields("objectGUID")
    strDN = "<GUID=" + OctetToHexStr(arrbytGuid) + ">"
    Set objUser = GetObject("LDAP://" & strDN)

    If (Not IsNull(objUser.SAMAccountName)) Then
        strLine = CStr(objUser.SAMAccountName)
    End If

    objRecordSet.MoveNext
Loop

我想了解 "objUser" 除了 "SAMAccountName" 之外还有哪些列。

请务必注意,您在不需要的地方发出了额外的网络请求。我会先讨论搜索。

您在搜索中返回的所有字段名称都在 objRecordSet.Fields 中。您只会看到 objectGUID,因为这就是您所要求的。

查询中的 ;objectGUID; 是列出(逗号分隔)所需属性的地方 returned。

额外的网络请求发生在这之后:

Set objUser = GetObject("LDAP://" & strDN)

您直接绑定到对象,只是为了读取属性。更具体地说,一旦您访问 属性 (objUser.SAMAccountName),它就会转到 AD 并加载属性。同样的原则也适用于此:如果您不明确告诉它您想要哪些属性,它会为每个属性加载一个值。这会减慢你的循环,你不需要这样做,因为你可以从你的搜索中阅读你需要阅读的所有内容。

相反,搜索 return 您需要的一切。如果您也需要 sAMAccountName,请添加它:;objectGUID,sAMAccountName;.

搜索后直接绑定到对象的唯一原因是需要更新它。


但是为了具体回答您提出的问题,您可以通过以下方式查看对象在使用 GetObject() 直接绑定到对象后具有哪些属性:

Set objUser = GetObject("LDAP://" & strDN)
objUser.GetInfo() 'Retrieve all attributes with a value

For I = 0 To objUser.PropertyCount - 1
   Set pEntry = objUser.Item(I)
   Wscript.Echo pEntry.Name
Next