Это невозможно сделать с помощью одного вызова 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