Как написать LDAP-запрос, чтобы проверить, является ли пользователь членом группы? - PullRequest
117 голосов
/ 23 июня 2009

Я хочу написать запрос LDAP, который проверяет, является ли пользователь (sAMAccountName) членом определенной группы. Можно ли сделать это так, чтобы я получал 0 или 1 запись результатов?

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

Есть идеи?

Спасибо

Ответы [ 4 ]

157 голосов
/ 23 июня 2009

Вы можете создать запрос с этим фильтром здесь:

(&(objectClass=user)(sAMAccountName=yourUserName)
  (memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))

и когда вы запускаете его на своем сервере LDAP, если вы получаете результат, ваш пользователь "yourUserName" действительно является членом группы "CN = YourGroup, OU = Users, DC = YourDomain, DC = com

Попробуйте и посмотрите, работает ли это!

Если вы используете C # / VB.Net и System.DirectoryServices, этот фрагмент должен помочь:

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://dc=yourcompany,dc=com");

DirectorySearcher srch = new DirectorySearcher(rootEntry);
srch.SearchScope = SearchScope.Subtree;

srch.Filter = "(&(objectClass=user)(sAMAccountName=yourusername)(memberOf=CN=yourgroup,OU=yourOU,DC=yourcompany,DC=com))";

SearchResultCollection res = srch.FindAll();

if(res == null || res.Count <= 0) {
    Console.WriteLine("This user is *NOT* member of that group");
} else {
    Console.WriteLine("This user is INDEED a member of that group");
}

Слово предостережения: это будет проверять только на непосредственное членство в группе, и оно не будет проверять на членство в так называемой «основной группе» (обычно «cn = Users») в вашем домене. Он не обрабатывает вложенные членства, например Пользователь A является членом группы A, которая является членом группы B - тот факт, что пользователь A действительно является членом группы B, здесь не отражается.

Марк

33 голосов
/ 01 ноября 2011

Если вы используете OpenLDAP (то есть slapd), который распространен на серверах Linux, то вы должны включить оверлей memberof, чтобы иметь возможность сопоставления с фильтром, используя атрибут (memberOf = XXX).

Кроме того, после включения наложения он не обновляет атрибуты memberOf для существующих групп (вам нужно будет удалить существующие группы и снова добавить их). Если вы включили оверлей для запуска, когда база данных пуста, значит, все будет в порядке.

19 голосов
/ 24 февраля 2011

Я бы добавил еще одну вещь к ответу Марка: атрибут memberOf не может содержать подстановочные знаки, поэтому вы не можете сказать что-то вроде "memberof = CN = SPS *" и ожидать, что он найдет все группы, начинающиеся с " SPS».

10 голосов
/ 22 августа 2014

Вы должны установить базу запросов на DN соответствующего пользователя, а затем установить фильтр на DN группы, в которой вы хотите знать, являются ли они членами. Чтобы узнать, является ли jdoe членом группы office, ваш запрос будет выглядеть примерно так:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host '(memberof=cn=officegroup,dc=example,dc=local)'

Если вы хотите увидеть ВСЕ группы, членами которых он является, просто запросите в поиске только атрибут 'memberof', например:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...