Как написать LDAP-запрос, чтобы проверить, является ли пользователь членом группы?
Я хочу написать запрос LDAP, который проверяет, является ли пользователь (sAMAccountName) членом определенной группы. Можно ли сделать это так, чтобы я получил 0 или 1 записи результатов?
Я думаю, я могу получить все группы для пользователя и проверить каждую на соответствие, но мне было интересно, смогу ли я упаковать это в одно выражение LDAP.
Есть идеи?
Спасибо
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 и 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, здесь также не отражается.
Марк
Если вы используете 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**