答案 0 :(得分:3)
单个LDAP API调用无法执行此操作。您将始终必须使用一个LDAP搜索操作来获取givenname和sn属性,并使用一个LDAP修改操作来修改displayName属性。
如果您使用命令行ldaptools“ldapsearch”和“ldapmodify”,您可以使用一些shell脚本轻松完成此操作,但您必须要小心:有时ldapsearch(1)可以返回base64格式的LDIF数据,包含UTC-8字符串,其中包含ascii以外的字符。例如:'sn :: Base64data'(注意双':')
所以,如果我是你,我会使用我选择的语言的简单脚本,它有一个LDAP API,而不是使用shell命令。这样可以省去ldaptools有时强加的base64解码的麻烦。
例如,使用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之上。然而,对于简单的属性连接,这可能是过度的。