2015-06-30 32 views
0

我想查询Active Directory用户属性,包括自定义属性。我正在收到内置属性,但Attributes对象中的自定义属性为空。我知道它在那里,它已经设置好了,因为我有相当于在PowerShell程序中工作。LdapContext.search()不返回自定义Active Directory属性

下面是我在做什么:

SearchControls constraints = new SearchControls(); 
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); 
String[] attrIDs = { "distinguishedName", "mail", "mycustomattribute"}; 
constraints.setReturningAttributes(attrIDs); 

NamingEnumeration<SearchResult> answer = ldapContext.search("DC=mydomain,DC=lan", "sAMAccountName=" 
     + user, constraints); 
if (answer.hasMore()) 
{ 
    Attributes attrs = answer.next().getAttributes(); 
    System.out.println("distinguishedName "+ attrs.get("distinguishedName")); 
    System.out.println("mail "+ attrs.get("mail")); 
    System.out.println("custom "+ attrs.get("mycustomattribute")); 
} 

这正确输出的专有名称和邮件,但它对于自定义属性输出空。

我已经先用PowerShell测试过以确保属性设置正确。我做了$user = Get-ADUser ...,然后输出$user.mycustomattribute并得到了预期值。我在我的Java应用程序中需要这个值。

这里是我的思维过程,到目前为止...

做自定义属性需要以不同的方式访问?我不确定,但谷歌查询并没有提出任何暗示。

难道这与查询没有该数据的域控制器有关吗?当设置LdapContext对象时,我确实有hashtable.put(Context.REFERRAL, "follow");作为环境属性,所以我猜测那个规则已经出来了。

我刚刚意识到,如果使用ADSI Edit(浏览数据的MS工具),自定义属性显示为<not set>,如果我将其作为非域管理员用户运行,但如果将其作为域管理员,它在ADSI编辑中正确显示属性。我以为自己弄明白了,所以我将Java应用程序作为域管理员运行,但它仍然无效(获取其他属性,但不是自定义属性)。

回答

0

我终于明白了这一点,我觉得有点像傻瓜。

当我运行ADSI编辑,它不会给我正确的价值,除非我运行它作为域管理员,我认为这是答案,这是,但我试图解决它通过运行我的程序作为管理员。我仍然在我的上下文环境中向域控制器提供非管理员凭据。

hashtable.put(Context.SECURITY_PRINCIPAL, "non-admin account"); 

当它应该是

hashtable.put(Context.SECURITY_PRINCIPAL, "admin account"); 

所以根本的问题是,我没有权限读取自定义属性,我正在寻找。我认为这些属性是每个人都可读的(实际上,我被网络/ AD管理员告知了这些属性,否则我会早点检查),但事实上并非如此。

道德:不要总是信任提供给您的环境条件。我花了差不多两天的时间,因为我没有质疑网络管理员提供的配置。 (虽然没有难过的感觉,但我也犯了错误。)

相关问题