我编写了一个程序来读取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'单值
那么这可能是用户权限问题?有没有人经历过这个并知道如何解决它?
谢谢, 麦克
答案 0 :(得分: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方法来查看哪些属性类型必须和可以在具有该对象类的条目中使用。