Назад | Перейти на главную страницу

Вывод списка участников группы с помощью ldapsearch

Наш корпоративный каталог LDAP размещается на сервере Snow Leopard Server Open Directory. Я пытаюсь использовать ldapsearch инструмент для экспорта файла .ldif для импорта в другой внешний сервер LDAP для внешней аутентификации; в основном пытается иметь возможность использовать одни и те же учетные данные внутри и снаружи.

у меня есть ldapsearch работая и предоставляя мне содержимое и атрибуты всего в подразделении «Пользователи», и даже фильтруя только те атрибуты, которые мне нужны:

ldapsearch -xLLL -H ldap://server.domain.net / 
 -b "cn=users,dc=server,dc=domain,dc=net" objectClass / 
 uid uidNumber cn userPassword > directorycontents.ldif

Это дает мне список пользователей и свойств, которые я могу импортировать на свой удаленный сервер OpenLDAP.

dn: uid=username1,cn=users,dc=server,dc=domain,dc=net
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: organizationalPerson
uidNumber: 1000
uid: username1
userPassword:: (hashedpassword)
cn: username1

Однако, когда я пытаюсь выполнить тот же запрос в «группе» OD вместо «контейнера», результаты будут примерно такими:

dn: cn=groupname,cn=groups,dc=server,dc=domain,dc=net
objectClass: posixGroup
objectClass: apple-group
objectClass: extensibleObject
objectClass: top
gidNumber: 1032
cn: groupname
memberUid: username1
memberUid: username2
memberUid: username3

Что мне действительно нужно, так это список пользователей из верхнего примера, отфильтрованный на основе их членства в группах, но похоже, что членство устанавливается со стороны группы, а не со стороны учетной записи пользователя. Должен быть способ отфильтровать это и экспортировать только то, что мне нужно, верно?

Я работаю с LDAP, но не с сервером конкретной марки.

Первое, что я попробую, - это поиск пользователей, которые извлекают все свои атрибуты, вместо того, чтобы ограничивать их, как это делает ваш пример.

ldapsearch -xLLL -H ldap://server.domain.net \
    -b "cn=users,dc=server,dc=domain,dc=net" uid=username1 \* +

Часто у пользователя есть атрибут memberOf, в котором указывается имя группы или DN группы для групп, в которых находится пользователь, синхронизированные с информацией в группе. Если это так, это самый простой способ делать то, что вы хотите.

В * захватит все атрибуты пользователя (поведение по умолчанию), а + захватит все операционные атрибуты (специальные атрибуты).

ldapsearch -x \
-b "cn=<your group name>,ou=group,dc=<your org>,dc=com" \
-H ldaps://<ldap server>:<port>

Это очень хорошо работает.

Вы стремитесь представить группы, располагая пользовательские объекты в разных контейнерах? Подобно:

dn: uid=username1,cn=users,cn=accounting,dc=server,dc=domain,dc=net
...
dn: uid=username2,cn=users,cn=engineering,dc=server,dc=domain,dc=net
...

Если это так, я полагаю, вам придется написать сценарий для обработки LDIF. Попробуйте отличное Python-LDAP модули.

Я бы спросил, почему вы хотите это сделать. Наличие пользователей, принадлежащих к нескольким группам, затрудняет работу и противоречит соглашениям Open Directory. Разве вы не можете просто скопировать все объекты пользователей и групп на свой сервер OpenLDAP и запросить его, основываясь на членстве в группе, а не на том, в каком контейнере находится объект пользователя?