我使用Ldap从AD LDS中检索帐户:
Hashtable props = new Hashtable();
props.put(Context.SECURITY_PRINCIPAL, "cn=adminuser,o=myorg,c=uk");
props.put(Context.SECURITY_CREDENTIALS, "password");
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
props.put(Context.PROVIDER_URL, "ldaps://myldapserver:636");
InitialLdapContext context = new InitialLdapContext(props, null);
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
controls.setReturningAttributes(null);
// according to javadoc, null means "return all attributes"
NamingEnumeration<SearchResult> results =
context.search(userBase, "cn=SOMEUSER", controls);
该帐户恢复正常。但并非所有SOMEUSER的属性都会被返回。
具体而言,msDS-UserPasswordExpired
属性永远不会回来。
但是......如果我在SearchControls
中列出该属性:
controls.setReturningAttributes(new String[] {
"msDS-UserPasswordExpired", "cn", "mail"
});
然后神奇地确实回来。
为什么呢?是SearchControl
javadoc说谎吗?
如何告诉我真的 真的想要所有属性?
解决方法是列出我想要的每个属性。但这很可怕,并且会增加未来的字段非常容易出错。
答案 0 :(得分:1)
密码控制属性是操作属性,除非您特别要求,否则不会返回。
我如何告诉它我真的想要所有属性?
您指定new String[]{"*", "+"}
作为要返回的属性ID。但这通常不是一个好主意。有许多操作属性不属于您的业务。只要问你实际需要什么。