PHP Conference Japan 2024

ldap_rename

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

ldap_rename修改項目的名稱

說明

ldap_rename(
    LDAP\Connection $ldap,
    字串 $dn,
    字串 $new_rdn,
    字串 $new_parent,
    布林值 $delete_old_rdn,
    ?陣列 $controls = null
): 布林值

重新命名/移動由 dn 指定的項目。

參數

ldap

一個 LDAP\Connection 實例,由 ldap_connect() 返回。

dn

LDAP 實體的識別名稱 (Distinguished Name)。

new_rdn

新的 RDN (Relative Distinguished Name)。

new_parent

新的父/上級項目。

delete_old_rdn

如果為 true,則舊的 RDN 值將被移除,否則舊的 RDN 值將保留為項目的非識別值。

controls

要與請求一起發送的 LDAP 控制項 陣列。

返回值

成功時返回 true,失敗時返回 false

更新日誌

版本 說明
8.1.0 ldap 參數現在需要一個 LDAP\Connection 實例;以前需要一個有效的 ldap link 資源
8.0.0 controls 現在可以為 null;以前,它的預設值為 []
7.3.0 新增了對 controls 的支援

注意事項

注意:

此函數目前僅適用於 LDAPv3。您可能需要在綁定之前使用 ldap_set_option() 來使用 LDAPv3。此函數僅在使用 OpenLDAP 2.x.x 或 Netscape Directory SDK x.x 時可用。

參見

新增筆記

使用者貢獻的筆記 9 則筆記

Richard Esplin
21 年前
ldap_rename 只能移動目錄樹的葉節點。如果您的 ldap 項目有任何子項目,則 ldap_rename 並非您所需的工具。我們需要更改使用者名稱,但這會更改 dn。 ldap_rename 無法運作,因為我們的每個使用者 ldap 項目都有幾個相關聯的子項目。我們必須編寫一個函數來遞迴地將子樹複製到新位置,然後刪除原始版本。以下是基本演算法

function recursive_move($old_username, $new_username)
對舊的使用者名稱執行 ldap_search 以取得正確的項目
使用 ldap_get_attributes 從 ldap 項目取得值的陣列
對於陣列中的每個屬性,將 $old_username 的出現替換為 $new_username
使用 ldap_add 將屬性陣列新增到新位置
使用 ldap_modify 修改任何其他屬性
使用 ldap_list 列出每個子項目
對每個子項目呼叫函數 recursive_move
使用 ldap_delete 刪除目前的項目
返回
Viper_SB at NOSPAMyahoo dot com
20 年前
由於此函數的文件說明不夠完善,我想幫助那些正在嘗試使其運作的人。

<?php
// $dn 是您想移動的項目的完整 DN
$dn = 'cn=user1,ou=group1,dc=mydomain';
/*
注意 $newRdn 並非完整的 DN,它只是開頭
我還沒讓它更改 RDN 的屬性
但這可能只是我的 schema 的問題
*/
$newRdn = 'cn=user2';
// $newParent 是您想要移動/重新命名到的新父 DN 的完整 DN
$newParent = 'ou=group2,dc=mydomain';
ldap_rename($link, $dn, $newRdn, $newParent, true);
?>

如同我上面所說的,我無法讓它重新命名為不同的屬性,因此 deleteoldrdn 對它沒有影響。
Peter Kehl
16 年前
以下是在 Novell eDirectory 中重新命名容器時,參數的一些說明
- $new_rdn 的格式為 "ou=新的容器名稱"
- newparent 參數為 NULL - 因為我們正在重新命名而不是移動
- deleteoldrdn 參數如果為 TRUE,則 OU 屬性的舊值會儲存為 LDAP OU 屬性的次要/其他值。Novell ConsoleOne 將其顯示為「其他名稱」屬性。

$full_old_dn= "ou=Cuckoo,ou=London,ou=UK,ou=Europe,o=Happy";
$new_rdn= "ou=Cuckoo Group";

ldap_rename( $conn, $full_old_dn, $new_rdn, NULL, TRUE);
hyc at openldap dot org
19 年前
與 Richard Esplin 的說法相反,這*是*用於重新命名子樹和將項目從樹中的一個位置移動到另一個位置的正確函式。只是大多數 LDAP 伺服器實作不支援移動非葉節點項目。

例如,在 OpenLDAP 中,僅當使用 back-hdb 資料庫後端時,才支援移動非葉節點項目。SunOne 只有一個資料庫後端,而且它顯然無法處理這種類型的操作。
backports at gmail dot com
17 年前
雖然有明確提及,但以下內容還是讓我困惑了整整 10 分鐘。

確保

if (!ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3)) {
// 做一些可怕的事情
}

已在您實際綁定*之前*設定 :)
venakis at ccf dot auth dot gr
20 年前
如果您使用的是 Sun Directory Server 5.2,請注意,您無法使用 ldap_rename 來移動項目。根據 Sun 自己的文件:「[...] 目前,Directory Server 不支援使用修改 DN 操作將項目從目錄樹的一個位置移動到另一個位置。」(http://docs.sun.com/source/817-6707/resultcodes.html)
問題是 php 不會返回任何錯誤,而且操作似乎已成功完成,但實際上什麼也沒發生。如果您檢查伺服器日誌,則會有一個「錯誤 53」項目(伺服器不願意執行)。
希望這可以為其他人節省幾個小時的搜尋時間...
alex at netflex dot nl
22 年前
也適用於 eDirectory 8 (NW6)。

如果您要移動使用者,請記住您也會更改 uid!
匿名
22 年前
要使此函數正常運作,請確保 $newrdn 的值是相對的。
web at davss dot com
10 年前
使用 ldap_rename 或任何其他不僅僅是重新命名,而是建立新的父項並移動子項的方法時,需要注意的一點是,您將會遺失原始的 entryUUID!
我們想要為 LDAP->DB 使用者群組做一個本機資料庫映射,認為它會是最穩定的資源識別碼,結果卻發現我們完全錯了。
To Top