当我通过LDAP查询Active Directory组中的所有用户时,为什么某些用户的userPassword属性为null?

时间:2011-06-01 08:07:47

标签: java active-directory ldap

以下是我使用的代码:

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
...

1 个答案:

答案 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不是由基础架构中的某些配置设置的。