有没有办法从对 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
我正在尝试使用 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