Найти члена группы пользователей в Microsoft AD внутри группы безопасности «Пользователи домена» - PullRequest
0 голосов
/ 09 октября 2019

Мне нужно найти члена групп данного пользователя в активном каталоге Microsoft, используя java внутри Domain Users группы. Моя структура AD приведена ниже.

reg1.subdomain.domain.com -Users (тип - контейнер) - пользователи домена (тип - группа безопасности глобальная)

Я написал приведенный ниже код. Но мне не удалось запросить пользователей внутри группы «Пользователи домена».

public static String ldapUri = "ldap://ldapuri.com:389";
    public static String usersContainer = "CN=users,DC=reg1,DC=subdomain,DC=domain,DC=com";
    public ArrayList<String> getUserGroups(String username, String password){
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, ldapUri);
        env.put(Context.SECURITY_PRINCIPAL, username);
        env.put(Context.SECURITY_CREDENTIALS, password);
        try {
            DirContext ctx = new InitialDirContext(env);
            SearchControls ctls = new SearchControls();
            String[] attrIDs = { "memberOf" };
            ctls.setReturningAttributes(attrIDs);
            ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);

            NamingEnumeration answer = ctx.search(usersContainer, "(&(objectCategory=group)(cn=Domain Users)(sAMAccountName=username))", ctls);
            while (answer.hasMore()) {
                SearchResult rslt = (SearchResult) answer.next();
                Attributes attrs = rslt.getAttributes();
                try{
                    String groups = attrs.get("memberOf").toString();
                    String [] groupname = groups.split(":");
                    System.out.println(groupname[1]);
                }catch (Exception e){
                    System.out.println("no members");
                }
            }
            ctx.close();
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return list;
    }

Может кто-нибудь указать, что не так с фильтром, который я добавил?

Ответы [ 3 ]

1 голос
/ 09 октября 2019

Группа пользователей домена является глобальной группой безопасности группы, которая, по умолчанию , включает все учетные записи пользователей в домене. Когда вы создаете учетную запись пользователя в домене, она добавляется в эту группу по умолчанию.

Большинство методов не показывают членство в «основной» группе. Для большинства пользователей основной группой будет «Пользователи домена». В частности, атрибут memberOf пользовательских объектов и атрибут member объектов группы никогда не раскрывают «первичное» членство в группе. В большинстве доменов атрибут участника группы «Пользователи домена» пуст, и можно предположить, что все пользователи принадлежат к этой группе.

Пользователи домена Примеры запросов LDAP для всех пользователей, имеющих «Пользователи домена»"обозначенный как их" основной ", поиск всех пользователей, у которых атрибут primaryGroupID равен 513 (по умолчанию). Атрибут primaryGroupID группы «Пользователи домена» - это то же целое число, 513. Синтаксис LDAP LDF SearchFilter может быть:

(primaryGroupID=513)

. Предполагается, что вы не изменили значения по умолчанию и не создали пользователей, которые имеютprimaryGroupID, который НЕ 513.

Для пользователей в группе «Пользователи домена» ПРОСТО используйте (primaryGroupID = 513) и baseDN, где находятся пользователи (CN = Users по умолчанию), который будет возвращать DN пользователей.

Затем, чтобы получить ВСЕ группы, которые эти пользователи представляют собой membeOf, вам нужно будет просмотреть результаты, используя DN в другом симуляторе запросов, чтобы:

(member:1.2.840.113556.1.4.1941:=(CN=UserName,CN=Users,DC=YOURDOMAIN,DC=NET))

Как показано Все группы, в которые входит пользователь, включают в себя вложенные группы

О, и обычно пользователи внутри CN = Users также ОБЫЧНО будут такими же, как и члены псевдогруппы «Пользователи домена».

0 голосов
/ 17 октября 2019

приведенный выше фрагмент кода является правильным, за исключением метода поиска, который я указал. Мне не удалось найти пользователей внутри группы «Пользователи домена» из контейнера «Пользователи», потому что я не упомянул поиск в подкаталогах. Добавив область поиска к,

ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);

она смогла успешно получить пользователей

0 голосов
/ 09 октября 2019

При условии, что база usersContainer установлена ​​правильно, вам просто нужно изменить фильтр следующим образом:

  • Для поиска записи user вам необходимоисправлено objectCategory для фильтрации пользователей, а не групп. Вы также можете использовать эквивалент, такой как objectClass=inetOrgPerson.

  • Если только пользовательская запись, которую вы ищете, на самом деле не имеет атрибута cn=Domain Users (что весьма маловероятно, поскольку пользователя)общее имя ), эта часть вам не нужна.

Поэтому должно быть достаточно следующего:

ctx.search(usersContainer, "(&(objectCategory=person)(sAMAccountName=username))", ctls);

Для соответствия определенному членству в группе пользователей (s) вы просто добавили бы фильтр (и) в атрибут memberOf (возвращает соответствующую запись пользователя, только если пользователь является членом данной группы), например. :

(&(objectCategory=person)(sAMAccountName=username)(memberOf=<groupDN>))

Обратите внимание, что @jwilleke заявил, что если вы нацелены на специальные группы, которые не поддерживают атрибуты членства (group: member / user: memberOf), вам нужно использовать primaryGroupID вместо memberOf.

Тем не менее, поскольку sAMAccountName является уникальным среди всех объектов участников безопасности в домене, вместо добавления фильтра вам может потребоваться просто использовать UserPrincipalName:

(&(objectCategory=person)(UserPrincipalName=username@domain.com))
...