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


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

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

какие идеи?

спасибо

4 105

4 ответа:

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

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

Марк

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

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

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

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