1

我有一个很大的 Openldap 目录。在目录中,每个人的显示名称属性都已填充,但我需要修改这些条目并使其像“givenName ++ sn”。有没有办法我可以直接在目录中执行它,就像 sql 查询(更新查询)一样。我已阅读有关 ldapmodify 的信息,但找不到像这样使用它的方法。

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

4

1 回答 1

3

使用单个 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 模块来保持“虚拟”属性,甚至是一个虚拟目录,例如 Penrose 或 Oracle 虚拟目录,开放式LDAP。然而,这对于简单的属性连接来说可能是多余的。

于 2010-07-30T11:27:40.000 回答