Запросить активный каталог с использованием Java для привязки samaccountname к определенной группе

Привет, приведенный ниже запрос 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

person Toya    schedule 12.06.2017    source источник
comment
Привет, это может быть полезно для вашего исследования: stackoverflow.com/questions/508014/   -  person Jim Steven    schedule 13.06.2017


Ответы (2)


Поскольку вы ссылаетесь на «samAccountName» и, следовательно, предполагаете, что используете 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) 

и верните samAccountName в качестве атрибута. -Джим

person jwilleke    schedule 13.06.2017
comment
Чтобы реализовать это решение, ему нужно будет знать точное dn группы, и он не сможет выполнять поиск в какой-либо группе в каталоге с cn=Users_Group, как предлагает код (просто указывая на него, если это предполагаемое поведение). - person Esteban; 13.06.2017
comment
Выполнить поиск одной группы намного проще и эффективнее, чем перебирать, возможно, сотни или тысячи членов; Правильно? - person jwilleke; 13.06.2017
comment
Я недостаточно знаю AD для этого. Если атрибут memberOf проиндексирован, да, вы правы, если нет, это зависит от количества пользователей, количества групп, частоты такого запроса, количества групп, у которых есть cn=Users_Group совпадение. Но я указывал на то, что группа dn не могла быть известна заранее по какой-либо причине. Так что поиск по всем необходимым группам dn и создание большого фильтра с множеством memberOf=groupdn с логическим OR тоже может быть дорогостоящим. Это был просто комментарий относительно того, что предлагал код. - person Esteban; 13.06.2017
comment
Привет, Джим, спасибо, что мне вернули sAMAccountName, однако он возвращает имя только для одного пользователя, а не для всех пользователей, связанных с этой группой. Вы знаете, как я могу вернуть всех пользователей этой группы? - person Toya; 13.06.2017
comment
Мне не удалось заставить правило сопоставления работать, но я добавил цикл while к вашему первому предложению использовать только memberOf = CN = GroupName, Ou ..., и это дало мне то, что мне было нужно. Спасибо! - person Toya; 13.06.2017

Код, который вы вставили, и результат, который вы вставили, не извлекают атрибут 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.

person Esteban    schedule 13.06.2017