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

Excel VBA通过LDAP查询用户信息报错“Provider does not support the property”

TLDR;
Dim cnn As New ADODB.Connection
cnn.ConnectionString = "Provider=ADSDSOObject"
cnn.Open

第3行执行时返回错误:Provider does not support the property。

尝试该代码的所有变体后,均返回相同错误。

完整背景

我希望在Excel中创建查询表,基于用户ID从LDAP获取用户信息。因目录规模过大,无法通过Power Query全量加载目录作为查询表,预期实现效果如下:

user IDFull NameEmail
myUidMy name from LDAPMy Email from LDAP
urUidUr name from LDAPUr Email from LDAP

为实现需求,我尝试编写由VBA驱动的UDF(用户自定义函数)。在VBA中需使用ADO(ActiveX Data Object)连接ADSDSOObject提供程序。

按照官方文档及网络教程初始化连接时,始终返回上述错误。简化代码后确认错误发生在.open执行阶段,此时cnn的Errors属性从空变为1。

执行第2行前:

执行第2行前的连接对象状态

执行第2行后:

执行第2行后的连接对象状态

可见ConnectionString已被修改,但无法确定提供程序不支持的属性。最终连接字符串为:Provider=ADsDSOObject;Encrypt Password=False;Mode=Read;Bind Flags=0;ADSI Flag=-2147483648;

恳请提供解决方案。


解决方案

1. 排查Office位数兼容性

ADSDSOObject是32位OLE DB提供程序,若使用64位Office会出现兼容性问题:

  • 打开VBA编辑器,点击「工具」→「引用」,确保勾选「Microsoft ActiveX Data Objects 3.6 Library」(优先选3.6版本)。
  • 若为64位Office,在VBA项目属性中设置「编译为」→「x86」,重启Excel后重试。

2. 修正连接字符串格式

避免使用最简Provider字符串,改用兼容的完整格式,同时显式控制参数:

Dim cnn As New ADODB.Connection
' 使用当前登录用户身份验证
cnn.ConnectionString = "Provider=ADsDSOObject;Integrated Security=SSPI;ADSI Flag=0;"
' 或指定域账号密码
' cnn.ConnectionString = "Provider=ADsDSOObject;User ID=域\账号;Password=密码;ADSI Flag=0;"
cnn.Open

将ADSI Flag设为0,可避免系统自动添加不兼容的默认参数。

3. 测试LDAP基础访问

确保用户有权限访问目录,用以下代码验证连接有效性:

Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = cnn
' 替换为实际域的LDAP路径
cmd.CommandText = "<LDAP://DC=yourdomain,DC=com>;(&(objectClass=user)(samAccountName=myUid));name,mail;subtree"
Dim rs As ADODB.Recordset
Set rs = cmd.Execute
If Not rs.EOF Then
    Debug.Print "姓名:" & rs("name"), "邮箱:" & rs("mail")
End If
rs.Close: cnn.Close

4. 替代方案:直接使用ADSI对象

若ADO连接问题无法解决,可跳过OLE DB提供程序,直接用ADSI访问LDAP,更适合UDF场景:

Function GetLDAPUserInfo(uid As String) As String
    On Error Resume Next
    ' 替换为实际用户所在的LDAP路径
    Dim objUser As Object
    Set objUser = GetObject("LDAP://CN=" & uid & ",OU=Users,DC=yourdomain,DC=com")
    If Err.Number = 0 Then
        GetLDAPUserInfo = objUser.Get("name") & "|" & objUser.Get("mail")
    Else
        GetLDAPUserInfo = "未找到用户"
    End If
End Function

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:32:40