以下是我使用的代码:
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
environment.put(Context.SECURITY_PRINCIPAL, "Administrator@ABC");
environment.put(Context.SECURITY_CREDENTIALS, "testing123");
environment.put(Context.PROVIDER_URL, "ldap://192.168.64.222");
DirContext dirContext = new InitialDirContext(environment);
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration searchResults = dirContext.search("cn=users,dc=ABC,dc=DEF,dc=COM", "(&(objectClass=user))", searchControls);
while (searchResults.hasMore()) {
SearchResult searchResult = (SearchResult) searchResults.next();
Attributes attributes = searchResult.getAttributes();
System.out.println(attributes.get("userPassword"));
}
dirContext.close();
结果我得到了:
null
userPassword: [B@13a328f
userPassword: [B@1cd8669
userPassword: [B@337838
null
...
null
userPassword: [B@18a47e0
null
...
答案 0 :(得分:2)
答案是因为它当然没有配置。
解释是userPassword
属性不是将密码放入Active-Directory的本机属性。本机属性为unicodePwd,这是您可以通过LDAPS编写的特殊属性,但您无法通过LDAP读取。
根据Microsft documentation about userPassword,此属性可以表现为普通属性或行为类似于unicodePwd属性,所有这些都取决于Active-Directory或轻量级目录服务(LDS)的配置。
据我所知,默认情况下dSHeuristics是假的,而且大部分时间都没有设置,你可以看到它:
CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,Root domain in forest
这就是为什么我认为userPassword不是由基础架构中的某些配置设置的。