2010-07-26 2 views
1

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

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

ответ

2

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

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

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

Например, с PHP-кли, ваш скрипт будет примерно, как это (возможно, некоторые более проверки ошибок были бы уместно):

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

+0

Thnx за вклад, но ldap_search имеет ограничение в 1000 записей за звонок, и у меня более 100 тыс. Записей. Как решить эту проблему. –

+0

ldap_search per se не имеет такого ограничения. Ваш сервер имеет определенную конфигурацию. Вы можете соответствующим образом изменить конфигурацию сервера. –