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

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

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

Любые идеи?

Спасибо

Ответ 1

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

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

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

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

Если вы используете С#/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 = Пользователи" ) в вашем домене. Он не обрабатывает вложенные членства, например. Пользователь A является членом группы A, входящей в группу B, - тот факт, что Пользователь A действительно является членом группы B, также не отражается здесь.

Марк

Ответ 2

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

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

Ответ 3

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

Ответ 4

Вы должны установить базу запросов в 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**