1

我编写了一个程序,它读取 Web 服务,检索用户数据,然后应该将该数据推送到 ActiveDirectory,从而更新用户的标题、地址、电话号码等。

问题是当我使用 Unboundid Connection 类执行搜索时,不会返回请求的属性。下面是搜索代码:

SearchResult result = connection.search( properties.getProperty("ldap.search.baseDN"), 
                        SearchScope.SUB, "(cn=" + userId + ")", 
                        "personalTitle", "department", "company", "manager", "telephoneNumber", 
                        "streetAddress", "I", "st", "postalCode", "c", "pager", "mobile", 
                        "fax", "cn");

上面的代码定位到了想要的用户,按预期返回了cn属性,但是其他属性都没有返回。如果我使用 JXplorer 使用相同的连接凭据连接到 AD,我可以看到所有需要的属性都存在,但根本没有返回。

在此处输入图像描述

我尝试替换 SearchRequest.ALL_OPERATIONAL_ATTRIBUTES、SearchRequest.ALL_USER_ATTRIBUTES 和 SearchRequest.REQUEST_ATTRS_DEFAULT,而不是明确列出这些字段,但没有成功。

我还查看了从“connection.getSchema()”返回的“Schema”对象,可以看到personalTitle 应该存在:

connection.getSchema().getAttributeType("personalTitle")

上面的代码返回:

1.2.840.113556.1.2.615 名称 'personalTitle' 语法 '1.3.6.1.4.1.1466.115.121.1.15' 单值

所以也许这是一个用户权限问题?有没有人遇到过这种情况并知道如何解决?

谢谢,迈克

4

1 回答 1

1

LDAP 搜索结果条目仅包含实际具有值的属性,因此您从 UnboundID LDAP SDK 看到的行为是适当且正确的。即使您明确请求特定属性,该属性也仅在具有一个或多个值的情况下才会包含在条目中。

我认为您对 JXplorer 感到困惑,因为它正在读取模式以确定哪些属性可能包含在基于其对象类的条目中,并将它们显示给您,以便您可以在编辑器中为这些属性设置值。但这并不意味着服务器返回的条目实际上包含有关这些属性的任何信息。

要验证这一点,您可以使用随 LDAP SDK 提供的 ldap-debugger 工具来查看发生的实际 LDAP 通信。只需运行如下命令:

 tools/ldap-debugger --hostname {directory-server-address} \
      --port {directory-server-port} --listenPort {listen-port}

这将创建一个非常简单的 LDAP 代理服务器,用于解码通过它的所有请求和响应。要使用它,只需将 JXplorer 指向指定的监听端口。您将看到,当 JXplorer 检索条目时,服务器返回的条目将仅包含实际具有值的属性。

如果您想找出可以包含在给定条目中的所有可能属性,则使用 LDAPConnection.getSchema 方法检索服务器模式,然后使用 Schema.getObjectClass 检索目标条目中的每个对象类,以及最后使用 ObjectClassDefinition.getRequiredAttributes 和 ObjectClassDefinition.getOptionalAttributes 方法来查看哪些属性类型必须并且可以在具有该对象类的条目中使用。

于 2014-02-14T07:36:54.387 回答