You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ADODB Recordset记录数>0却始终显示BOF与EOF的问题求助

VBScript查询Active Directory记录集BOF/EOF均为True的问题解决

问题描述

使用VBScript查询Active Directory用户时,执行代码后弹出的MsgBox显示:

Start loop 42, BOF: True, EOF: True

明明RecordCount显示有42条匹配记录,但BOF(指针位于首记录之前)和EOF(指针位于末记录之后)同时为True,无法正常遍历记录集。原代码如下:

set objCmd = createobject("ADODB.Command")   
set conn = createobject("ADODB.Connection")
Set iAdRootDSE = GetObject("LDAP://RootDSE")
strDefaultNamingContext = iAdRootDSE.Get("defaultNamingContext")
conn.Provider = "ADsDSOObject"
conn.Open "Active Directory Provider"    
Set objCmd.ActiveConnection = conn 

strFilter = "(&(objectCategory=person)(objectClass=user)(memberof=" & ... & "))"    
strAttributes = "samaccountname,name,givenName,sn,displayName,streetAddress,postalCode,l,c,Homephone,TelephoneNumber,mail,userAccountControl"

strQuery = "<LDAP://" & strDefaultNamingContext & ">" & ";" & strFilter & ";" & strAttributes & ";subtree"

objCmd.CommandText = strQuery        
objCmd.Properties("Page Size") = 1000
objCmd.Properties("Timeout") = 30
objCmd.Properties("Cache Results") = False

Set colUsers = objCmd.Execute    

Msgbox "Start loop " & colUsers.RecordCount  & ", BOF: " & colUsers.BOF& ", EOF: " & colUsers.EOF 

原因分析

  1. ADODB针对AD的LDAP查询中,RecordCount返回的是预估匹配数,而非实际已加载的记录数。记录集初始化后,指针并未自动定位到第一条有效记录,导致BOF和EOF同时为True。
  2. Cache Results=False的配置会禁用记录集缓存,进一步影响了指针的默认初始位置,使得即使有匹配记录,指针也停留在无效区间。

解决方法

1. 手动定位记录指针

获取记录集后,调用MoveFirst方法将指针定位到第一条有效记录,之后即可正常遍历:

Set colUsers = objCmd.Execute    

' 先定位到第一条记录,避免指针处于无效区间
If Not colUsers.EOF Then colUsers.MoveFirst

Msgbox "Start loop " & colUsers.RecordCount  & ", BOF: " & colUsers.BOF& ", EOF: " & colUsers.EOF 

' 遍历记录集示例
Do While Not colUsers.EOF
    ' 读取目标属性,示例为samaccountname
    WScript.Echo colUsers.Fields("samaccountname").Value
    colUsers.MoveNext
Loop

2. 确认过滤条件有效性

虽然RecordCount有数值,但仍需检查memberof后的组LDAP路径格式是否正确,必须是完整的可分辨名称(如CN=SalesGroup,OU=Groups,DC=contoso,DC=com),避免因过滤条件错误导致实际无有效记录(这种情况下RecordCount可能返回错误的预估数)。

3. 调整缓存设置(可选)

如果不需要实时同步AD数据,可将Cache Results设为True,让记录集缓存结果,有助于指针的正常初始化:

objCmd.Properties("Cache Results") = True

内容的提问来源于stack exchange,提问作者bluefox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:52:03