Изменить запись в каталоге OpenLDAP - PullRequest
1 голос
/ 26 июля 2010

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

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

1 Ответ

3 голосов
/ 30 июля 2010

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

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

Итак, на вашем месте я бы использовал простой скрипт на моем языке выбора, который имеет LDAP API, вместо использования команд оболочки. Это избавило бы меня от проблем декодирования 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. Однако это может быть излишним для простой конкатенации атрибутов.

...