vba - 使用 ADO 从 Access VBA 中检索用户成员资格以执行 LDAP 查询
问题描述
我正在使用 Microsoft Access 中的 VBA 查询 Active Directory。与网上发布的许多示例一样,我使用 ADO 连接来执行 LDAP 查询。我可以成功提取一些属性,如sn
、givenName
、mail
,proxyAddresses
以及一些其他的 MS Exchange 属性,如msExchExtensionAttribute##
属性。
现在我正在尝试查询该memberOf
属性并且除了我自己之外没有收到任何用户的返回值。我可以在 Outlook 中轻松查看其他用户的组成员身份,或者通过使用 Windows Active Directory 搜索工具进行搜索来查看谁是组成员。对我来说听起来像是权限问题,所以我挖掘了我的连接字符串。我怀疑我是在匿名提出请求,因为我没有指定用户名或密码。
我正在尝试确保我使用 Windows 身份验证,并且它必须能够由普通用户运行(因为我也在这个域中),因此没有管理员权限可以执行此操作。
一些基本的翻找使我相信将连接属性的集成安全属性设置为SSPI
应该这样做。但是,这行不通。在这一点上,我只是想让它工作,所以该函数只返回一个用于调试的字符串,但我最终会返回一个数组或对象。
这是我到目前为止所得到的:
Function GetMembershipFromUsername(uname As String) As String
'Get the domain root
Dim root As IADs
Set root = GetObject("LDAP://RootDSE")
'Set the query parameters
Dim base as String, fltr as String, attr as String, scope as String
base = "<LDAP://" & root.Get("defaultNamingContext") & ">"
fltr = "(&(objectCLass=user)(objectCategory=Person)(sAMAccountName=" & uname & "))"
attr = "sAMAccountName,memberOf"
scope = "subtree"
'Connect to the LDAP server
Dim conn As ADODB.Connection
Set conn = CreateObject("ADODB.Connection")
conn.Provider = "ADsDSOObject"
conn.Properties.Item("Integrated Security").Value = "SSPI"
conn.Open "Active Directory Provider"
'Create LDAP command object
Dim cmd As ADODB.Command
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
'Build command
cmd.CommandText = base & ";" & fltr & ";" & attr & ";" & scope
'Execute and return info
Dim rs as ADODB.Recordset, vi as Variant, ml as String
Set rs = cmd.Execute
If rs.RecordCount > 0 Then
For Each vi In rs.Fields(1).Value
ml = ml & vi & Chr(10)
Next vi
End If
rs.Close
conn.Close
GetMembershipFromUsername = ml
End Function
我是否遇到了权限问题,我是否仍在以某种方式匿名提出请求,或者我是否犯了一些其他错误,只能让我获得自己的组成员资格?
解决方案
应该使用 IADsOpenDSObject 接口而不是 IAD 来使用安全上下文而不是当前请求绑定的用户绑定到 AD对象。
IADsOpenDSObject 接口旨在为绑定到底层目录存储中的对象提供安全上下文。它提供了一种指定客户端凭据的方法。当您必须为任何目录服务中的身份验证提供一组凭据时,使用此接口绑定到 ADSI 对象。
您需要使用GetObject()
方法创建对 IADsOpenDSObject 的引用,就像使用 IADs 接口一样。然后,您可以调用OpenDSObject()
允许使用任意凭据绑定到 ADSI 对象的方法:
Dim ds As IADsOpenDSObject
Set ds = GetObject("LDAP://RootDSE")
Dim root As IADs
Set root = ds.OpenDSObject(dn, username, password, ADS_SECURE_AUTHENTICATION)
最后一个参数是一个身份验证标志(请参阅 参考资料ADS_AUTHENTICATION_ENUM
),它决定使用哪个身份验证过程。
推荐阅读
- reactjs - 当我使用反应钩子单击按钮时如何更改背景颜色
- symfony - Symfony 4 Fos Rest:错误 415 不支持的媒体类型
- azure-functions - 创建 Sendgrid 帐户时部署验证失败
- arrays - 使用 =B1/B2 等变量生成数组的公式
- hibernate - 带有@MapsId的休眠Hazelcast二级缓存不起作用
- wordpress - 我可以分别为桌面和移动设备设置革命滑块吗?
- python - 使用 to_csv 时保持 detatime 类型
- angular - 跨 Ionic4 应用程序和网站的 Firebase 登录 - 我可以在应用程序和网站之间跳转而无需用户登录吗?
- reactjs - React 受控组件和非受控组件的区别
- php - 如何使用 laravel 超时错误解决 PayPal PHP