Як написати запит LDAP, щоб перевірити, чи є користувач членом групи?


129

Я хочу написати запит LDAP, який перевіряє, чи є користувач (sAMAccountName) членом певної групи. Чи можливо це зробити так, щоб я отримав записи 0 або 1?

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

Будь-які ідеї?

Дякую


Дивіться також такі питання, як рекурсивний запит на членство в групі LDAP
Franklin Piat

Відповіді:


177

Ви маєте змогу створити запит із цим фільтром тут:

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

і коли ви запускаєте це на сервері LDAP, якщо ви отримуєте результат, ваш користувач "yourUserName" дійсно є членом групи "CN = YourGroup, OU = Користувачі, 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 = користувачі"). Він не обробляє вкладені члени, наприклад, Користувач A є членом групи A, яка є членом групи B - той факт, що Користувач A дійсно є членом групи B, також тут не відображається.

Марк


1
Спробував, але все ще не працює для мене. Чи повинно бути "OU = користувачі" або "OU = групи" у пункті memberOf?
Павло

3
Це мій запит: (& (objectClass = людина) (sAMAccountName = USERID) (memberof = 'CN = SPSAdmins, OU = Групи, OU = MYTOWN, OU = Німеччина, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) DN насправді така довга. Я згоден, що це повинно працювати. Дякуємо за допомогу!
Павло

3
На примху я зняв єдині лапки після memberof і тепер отримую результат! Дякую
Пауль

2
Хороша відповідь. але слід зазначити, що він працюватиме лише на серверах LDAP, які підтримують атрибут 'memberOf'. Більш загальною технікою є отримання об'єкта групи та вивчення його унікальних атрибутівMember, roleOccupant тощо для DN користувача, залежно від того, яку схему використовує об'єкт групи.
Маркіз Лорн

1
@Gunslinger Імена та значення атрибутів LDAP не відрізняються від регістру, а також не є DN, але AD має свої правила ...
Маркіз Лорн,

35

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

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


8
Думаю, було б корисно посилання на сторінку, що пояснює, як увімкнути накладання memberof.
Гохан Сарі

5
Підручник, який працював на мене: schenkels.nl/2013/03/… @Telford Tendrys, чувак, ти врятував мені життя цим повідомленням про попередні групи. Велике дякую!
ŁukaszBachman

21

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


Дякую за інформацію. Я намагався зробити те, що ти кажеш, зробити не можна. Як я можу зробити це з PHP? Чи можна отримати такий же результат по-іншому? щоб знайти всі групи, починати з SPS, а потім все, що завгодно ... Я завжди можу захопити все і перевести цикл свого масиву, а потім preg match to CN Я хочу, але я вважаю за краще просто шукати його прямо, якщо це можливо.
ODelibalta

15

Ви повинні встановити свою базу запитів на DN-адресу відповідного користувача, а потім встановити свій фільтр на DN тієї групи, якій вам цікаво, чи є вони членом. Щоб побачити, чи jdoe є членом групи офісів, ваш запит буде виглядати приблизно так:

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**
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.