我想查询Active Directory用户属性,包括自定义属性。我收到内置属性很好,但Attributes
对象中的自定义属性为null。我知道它已存在并且已设置,因为我得到了相当于在PowerShell程序中工作。
这是我正在做的事情:
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"));
}
这会正确输出专有名称和邮件,但它会为自定义属性输出null。
我首先使用PowerShell进行了测试,以确保属性设置正确。我做了$user = Get-ADUser ...
,然后输出$user.mycustomattribute
并获得了预期值。我在Java应用程序中需要这个值。
到目前为止,这是我的思考过程......
是否需要以不同方式访问自定义属性?我不确定,但谷歌的查询并未提出任何暗示的内容。
这可能与查询没有该数据的域控制器有什么关系吗?在设置LdapContext
对象时,我对环境属性有hashtable.put(Context.REFERRAL, "follow");
,所以我猜测那些规则已经出来了。
我刚刚意识到,如果我使用ADSI Edit(一种浏览数据的MS工具),如果我以非域管理员用户身份运行它,则自定义属性显示为<not set>
,但如果我运行它作为域管理员,在ADSI Edit中正确显示属性。我以为我已经弄清楚了,所以我将Java应用程序作为域管理员运行,但它仍然不起作用(获取其他属性但不是自定义属性)。
答案 0 :(得分:0)
我终于想出来了,我觉得自己有点像傻瓜。
当我运行ADSI Edit并且它不会给我正确的值,除非我以域管理员的身份运行它,我认为这就是答案,它是,但我试图通过运行来修复它我的程序作为管理员。我仍然在我的上下文环境中向域控制器提供非管理员凭据。
hashtable.put(Context.SECURITY_PRINCIPAL, "non-admin account");
什么时候应该
hashtable.put(Context.SECURITY_PRINCIPAL, "admin account");
所以潜在的问题是我没有权限读取我正在搜索的自定义属性。我认为这些属性是每个人都可读的(事实上,我的网络/ AD管理员也是这么说的,但是我之前已经检查过了),但事实上它们并没有。
道德:不要总是相信提供给你的环境条件。我花了将近两天的时间,因为我没有质疑网络管理员提供的配置。 (虽然没有难过的感觉,但我也会犯错误。)