修改OpenLDAP目录中的条目
问题描述:
我有一个很大的OpenLDap目录。在目录显示名称属性为每个填充,但我需要修改这些条目,并使其像“givenName + + sn”。是否有办法像sql查询(更新查询)一样直接在目录中执行操作。我已经阅读了关于ldapmodify,但无法找到像这样使用它的方式。修改OpenLDAP目录中的条目
在这方面的任何帮助将不胜感激。
答
无法通过单个LDAP API调用完成此操作。您将始终必须使用一个LDAP搜索操作来获取givenname和sn属性,以及一个LDAP修改操作来修改displayName属性。
如果您使用命令行ldaptools“ldapsearch”和“ldapmodify”,您可以使用某些shell脚本轻松完成此操作,但您必须小心:有时ldapsearch(1)可以以base64格式返回LDIF数据,UTF-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模块来保持OpenLDAP的“虚拟”属性,甚至是一个虚拟目录,例如Penrose或Oracle Virtual Directory。然而,这可能是一个简单的属性串联矫枉过正。
Thnx为贡献,但ldap_search每次调用限制为1000条记录,并且我有超过100K条记录。如何解决这个问题。 – 2010-08-03 08:17:51
ldap_search本身没有这样的限制。您的服务器具有其特定的配置。您可以相应地更改服务器配置。 – 2010-08-04 15:36:22