Вопрос по ldap – Как написать LDAP-запрос, чтобы проверить, является ли пользователь членом группы?

115

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

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

Есть идеи?

Спасибо

Смотрите также такие вопросы, какРекурсивный запрос членства в группе LDAP Franklin Piat

Ваш Ответ

4   ответа
151

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

(&(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, здесь не отражается.

Марк

Это мой запрос: (& (objectClass = person) (sAMAccountName = USERID) (memberof = 'CN = SPSAdmins, OU = Группы, OU = MYTOWN, OU = Германия, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) DN действительно такой длинный. Я согласен, что этодолжен работать. Спасибо за помощь! paul
@Gunslinger Имена и значения атрибутов LDAP не чувствительны к регистру и не являются DN, но AD имеет свои собственные правила ... user207421
По прихоти я удалил одинарные кавычки после memberof и теперь получаю результат! Спасибо paul
Пробовал, но все еще не работает для меня. Должно ли это быть 'OU = Users' или 'OU = Groups' в предложении memberOf? paul
Хороший ответ. но следует отметить, что он будет работать только на серверах LDAP, которые поддерживают атрибут memberOf. Более общий метод заключается в получениигруппа Объект и проверить его атрибуты uniqueMember, roleOccupant и т. д. для DN пользователя, в зависимости от того, какую схему использует объект группы. user207421
31

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

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

Учебник, который работал для меня:schenkels.nl/2013/03/... @ Телфорд Тендрис, чувак, ты спас мне жизнь с этим уведомлением о уже существующих группах. Большое спасибо! ŁukaszBachman
Я думаю, что была бы полезна ссылка на страницу, которая объясняет, как включить оверлейный элемент memberof. Gokhan Sari
18

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

Спасибо за информацию! Я пытался сделать то, что вы говорите, не может быть сделано. Как я могу сделать это с PHP? Можно ли получить тот же результат по-другому? чтобы найти все группы, начинающиеся с SPS, а затем все, что угодно ... Я всегда могу захватить все и зациклить свой массив, а затем сопоставить прег с CN, который я хочу, но я предпочитаю просто искать его прямо, если это возможно. ODelibalta
memberOf=CN=SPS* работает для меня tarikakyol
10

а затем установить фильтр на 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**

Похожие вопросы