Изменить запись в каталоге OpenLDAP

У меня есть большой каталог Openldap. В каталоге свойство отображаемого имени для каждого заполнено, но мне нужно изменить эту запись и сделать ее похожей на «givenName + + sn». Есть ли способ сделать это прямо в каталоге, как запросы sql (запрос на обновление). Я читал о ldapmodify, но не смог найти способ использовать его таким образом.

Любая помощь в этом отношении будет оценена по достоинству.


person Shahzad Fateh Ali    schedule 26.07.2010    source источник


Ответы (1)


Это невозможно сделать с помощью одного вызова API LDAP. Вам всегда придется использовать одну операцию поиска LDAP, чтобы получить атрибуты namedname и sn, и одну операцию изменения LDAP, чтобы изменить атрибут displayName.

Если вы используете командную строку ldaptools «ldapsearch» и «ldapmodify», вы можете легко сделать это с помощью некоторых сценариев оболочки, но вы должны быть осторожны: иногда ldapsearch(1) может возвращать данные LDIF в формате base64 с UTF- 8 строк, содержащих символы за пределами ascii. Например: 'sn::Base64data' (обратите внимание на двойное ':')

Итак, на вашем месте я бы использовал простой скрипт на моем любимом языке, который имеет API LDAP, вместо использования команд оболочки. Это избавило бы меня от проблем с декодированием base64, которые иногда навязывают ldaptools.

Например, с php-cli ваш скрипт будет примерно таким (возможно, будет уместна дополнительная проверка ошибок):

<?php
$ldap = ldap_connect('host');
ldap_bind($ldap, ...);
$sr = ldap_search($ldap, 'ou=people,...', 'objectclass=*');
$entries= ldap_get_entries($ldap, $sr);
for($i=0; $i<$entries['count']; $i++) {
    $modify = array('displayname' => $entries[$i]['givenname'] . ' ' . $entries[$i]['sn']);
    ldap_modify($ldap, $entries[$i]['dn'], $modify);
}

Дополнение: если вы хотите поддерживать актуальность этих данных без какого-либо вмешательства, вам, вероятно, потребуется использовать специализированный модуль OpenLDAP, который хранит «виртуальные» атрибуты, или даже виртуальный каталог, такой как Penrose или Oracle Virtual Directory, поверх OpenLDAP. Однако это может быть излишним для простой конкатенации атрибутов.

person Alexandros Vellis    schedule 30.07.2010
comment
Спасибо за вклад, но ldap_search имеет ограничение в 1000 записей на вызов, а у меня более 100 тысяч записей. Как решить эту проблему. - person Shahzad Fateh Ali; 03.08.2010
comment
ldap_search как таковой не имеет такого ограничения. Ваш сервер имеет, с его конкретной конфигурацией. Вы можете соответствующим образом изменить конфигурацию сервера. - person Alexandros Vellis; 04.08.2010