2010-07-26 99 views
1

我有一个很大的OpenLDap目录。在目录显示名称属性为每个填充,但我需要修改这些条目,并使其像“givenName + + sn”。是否有办法像sql查询(更新查询)一样直接在目录中执行操作。我已经阅读了关于ldapmodify,但无法找到像这样使用它的方式。修改OpenLDAP目录中的条目

在这方面的任何帮助将不胜感激。

回答

2

无法通过单个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。然而,这可能是一个简单的属性串联矫枉过正。

+0

Thnx为贡献,但ldap_search每次调用限制为1000条记录,并且我有超过100K条记录。如何解决这个问题。 – 2010-08-03 08:17:51

+0

ldap_search本身没有这样的限制。您的服务器具有其特定的配置。您可以相应地更改服务器配置。 – 2010-08-04 15:36:22