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