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 ID | Full Name | |
|---|---|---|
| myUid | My name from LDAP | My Email from LDAP |
| urUid | Ur name from LDAP | Ur Email from LDAP |
为实现需求,我尝试编写由VBA驱动的UDF(用户自定义函数)。在VBA中需使用ADO(ActiveX Data Object)连接ADSDSOObject提供程序。
按照官方文档及网络教程初始化连接时,始终返回上述错误。简化代码后确认错误发生在.open执行阶段,此时cnn的Errors属性从空变为1。
执行第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
相关产品推荐
相关产品推荐

