查询活动目录使用Java将samaccountname绑定到特定组

时间:2017-06-12 22:13:32

标签: java ldap ldap-query

以下LDAP查询返回特定组中成员“givenName”的列表。但是,我会返回一个特定组中的成员列表“sAMAccountName”。我不熟悉LDAP并且不确定如何实现这一点。任何帮助表示赞赏。

    public LdapContext getLdapContext(){
        LdapContext ctx = null;
        String connection = null;
        try{
            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.INITIAL_CONTEXT_FACTORY,
                    "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.SECURITY_AUTHENTICATION, "Simple");
            env.put(Context.SECURITY_PRINCIPAL, "userPrincipalName");
            env.put(Context.SECURITY_CREDENTIALS, "Password");
            env.put(Context.PROVIDER_URL, "domainController");
            ctx = new InitialLdapContext(env, null);
            connection = "Connection Successful.";
        }catch(NamingException nex){
            connection = "LDAP Connection: FAILED";
            nex.printStackTrace();
        }
        this.getUserBasicAttributes("(&(objectClass=group)(CN=Users_Group))", ctx);
        return ctx;
    }

    private void getUserBasicAttributes(String groupID, LdapContext ctx) {
        try {
            String userName = null;
            String member = null;

            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
            String[] attrIDs = {"member"};
            constraints.setReturningAttributes(attrIDs);
            NamingEnumeration answer = ctx.search("DC=Domain,DC=com", groupID, constraints);
            if (answer.hasMore()) {
                Attributes attrs = ((SearchResult) answer.next()).getAttributes();
                member = attrs.get("member").toString();
            }else{
                throw new Exception("Invalid Group");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return;
    } 

以上查询的结果类似于以下内容:

member: CN=FistName 
LastName,OU=ouData,OU=ouData,OU=ouData,DC=dcData,DC=dcData,DC=dcData, 
CN=FistName2 
LastName2,OU=ouData,OU=ouData,OU=ouData,DC=dcData,DC=dcData,DC=dcData, 
CN=FistName3 
LastName3,OU=ouData,OU=ouData,OU=ouData,DC=dcData,DC=dcData,DC=dcData, 
CN=FistName4 
LastName4,OU=ouData,OU=ouData,OU=ouData,DC=dcData,DC=dcData,DC=dcData

2 个答案:

答案 0 :(得分:0)

您粘贴的代码和粘贴的输出不会检索成员的givenName属性。它仅检索具有dn的组成员的cn=Users_Group

您的dn用户的结构使用了用户的cn属性,因此您会看到CN=FistName LastName,OU=ouData,OU=ouData,OU=ouData,DC=dcData,DC=dcData,DC=dcData

要检索这些用户的samAccountName,您现在必须遍历这些dn并检索与samAccountName对应的每个条目的dn属性。< / p>

答案 1 :(得分:0)

因为您正在引用&#34; samAccountName&#34;因此,假设您使用的是Microsoft Active Directory,则可以使用过滤器(LDAP_MATCHING_RULE_IN_CHAIN)作为:

(&(objectClass=user)(memberof:1.2.840.113556.1.4.1941:=CN=GroupOne,OU=Security Groups,OU=Groups,DC=YOURDOMAIN,DC=NET) 

并返回&#34; samAccountName&#34;作为一个属性。 -Jim