2010-07-26 76 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