LDAP查询通过URL

时间:2011-02-04 14:30:45

标签: excel vba url ldap

我正在尝试通过Visual Basic进行LDAP查询。我没有Active Directory的管理员权限,但我能够查看所有用户对象。我不知道在我通过LDAP://查询搜索目录时有什么限制。

在我正在构建的Excel应用程序中,我有一个用于输入用户ID的列。一旦用户输入用户ID,我希望根据与该用户关联的服务器端信息(例如电子邮件地址)自动填充其他列

假设c.Value是输入到电子表格的用户ID值:

strUser = "CN=" & c.Value & ",OU=User Accounts,OU=Area,OU=Users,OU=Accounts,DC=joe,DC=bloggs,DC=co,DC=uk/"
Set objUser = GetObject("LDAP://" & strUser)

问题是这个 - 其中OU =区域已知,搜索成功。但是,我希望查询检查UserID的所有区域OU。据我所知,他们没有被保留或镜像在一个中心位置。是否可以在这样的查询中使用通配符?

有没有人对替代方法有任何其他想法或建议?

谢谢,

汤姆

2 个答案:

答案 0 :(得分:5)

在回答您的问题之前,以下是Active Directory的一些基本背景知识。

  • Active Directory上的用户对象包含许多属性。
  • CN是用户对象的属性之一。它并不总是与您的登录用户名相同。
  • samAccountName是Windows 2000之前的登录名字符串。这可能就是你要找的东西。
  • 对象按层次存储。用户对象可以放在OU或容器

要执行LDAP查询,您需要使用ADO连接对象。您需要将LDAP查询字符串传递给ADO连接对象。 LDAP查询字符串包含四个部分。

  • 根路径,我们开始搜索。
  • LDAP过滤器
  • 返回属性
  • 搜索范围

您应该使用的LDAP查询字符串应该类似于

<LDAP://OU=Users,OU=Accounts,DC=joe,DC=bloggs,DC=co,DC=uk>;(&(objectClass=user)(samAccountName=yourusername));adspath;subtree
  • 上例中的根路径为<LDAP://OU=Users,OU=Accounts,DC=joe,DC=bloggs,DC=co,DC=uk>。这意味着开始在这个级别进行搜索
  • 由于您要搜索用户,因此LDAP过滤器为(&(objectClass=user)(samAccountName=yourusername))。当然,您需要将yourusername替换为代码中的其他内容。如果您真的想在CN上进行搜索,请将其更改为CN
  • 返回的属性是一个特殊属性adspath,允许您稍后绑定到该对象
  • 我假设您正在尝试搜索同一域下的所有用户对象。因此,您的搜索范围应为subtree

以下是我认为应该完成工作的完整示例

userName = "harvey"
ldapStr = "<LDAP://OU=Users,OU=Accounts,DC=joe,DC=bloggs,DC=co,DC=uk>;(&(objectClass=user)(samAccountName=" & userName & "));adspath;subtree

Set conn = CreateObject("ADODB.Connection")
conn.Provider = "ADSDSOObject"
conn.Open "ADs Provider"
Set rs = conn.Execute(ldapStr)

While Not rs.EOF
   wscript.echo rs.Fields(0)
   rs.MoveNext
Wend

答案 1 :(得分:0)

您可能会看到匿名样式访问权限。因此,您可以阅读一些默认属性。您要做的是确保您作为具有足够权限阅读您感兴趣的数据的用户进行身份验证。

如果UserID确实是用户Pre-Windows 2000登录名(也称为sAMAccountName),则搜索sAMAccountName = c.Value的用户的完整DN。

顺便说一下,CN =不是短名称的几率非常好,而是人名First和Last名称的某个版本,这是ADUC MMC的默认模式。