ldap_rename

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

ldap_rename修改条目的名称

描述

ldap_rename(
    LDAP\Connection $ldap,
    string $dn,
    string $new_rdn,
    string $new_parent,
    bool $delete_old_rdn,
    ?array $controls = null
): bool

dn 指定的条目将被重命名/移动。

参数

ldap

一个 LDAP\Connection 实例,由 ldap_connect() 返回。

dn

LDAP 实体的识别名称。

new_rdn

新的 RDN。

new_parent

新的父级/上级条目。

delete_old_rdn

如果为 true,则删除旧的 RDN 值,否则保留旧的 RDN 值作为条目的非识别值。

controls

要与请求一起发送的 LDAP 控制 数组。

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
8.1.0 ldap 参数现在期望一个 LDAP\Connection 实例;之前,期望一个有效的 ldap link 资源
8.0.0 controls 现在可以为空;之前,它默认为 []
7.3.0 添加了对 controls 的支持

备注

注意:

此函数目前仅适用于 LDAPv3。您可能需要在绑定之前使用 ldap_set_option() 来使用 LDAPv3。此函数仅在使用 OpenLDAP 2.x.x 或 Netscape Directory SDK x.x 时可用。

参见

添加备注

用户贡献的备注 9 则备注

Richard Esplin
20 年前
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 修改任何其他属性
列出每个子条目
对每个子条目调用函数 recursive_move
删除当前条目
返回
Viper_SB at NOSPAMyahoo dot com
20 年前
由于此函数没有很好地记录,我想帮助那些努力使其工作的人。

<?php
// $dn 是您要移动的条目的完整 DN
$dn = 'cn=user1,ou=group1,dc=mydomain';
/*
注意 $newRdn 不是完整的 DN,它只是开头
我还没有让它为 RDN 更改属性
但这可能只是我的模式
*/
$newRdn = 'cn=user2';
// $newparent 是您要移动/重命名的 NEW 父级 DN 的完整 DN
$newParent = 'ou=group2,dc=mydomain';
ldap_rename($link, $dn, $newRdn, $newParent, true);
?>

就像我上面说的,我还没有让它重命名为不同的属性,因此 deleteoldrdn 对它没有影响。
Peter Kehl
16 年前
以下是关于在 Novell eDirectory 中重命名容器时的参数的一些说明
- $new_rdn 的格式为 "ou=new container name"
- 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
18 年前
与 Richard Esplin 的说法相反,*这是*用于重命名子树并将条目从树中的一个位置移动到另一个位置的正确函数。只是大多数 LDAP 服务器实现不支持移动非叶子条目。

例如,在 OpenLDAP 中,仅在使用后端数据库时才支持移动非叶子条目。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
19 年前
如果您使用的是 Sun Directory Server 5.2,请注意,您不能使用 ldap_rename 移动条目。根据 Sun 自身的文档:“[...] 此时,目录服务器不支持使用修改 DN 操作将条目从目录树中的一个位置移动到另一个位置。” (http://docs.sun.com/source/817-6707/resultcodes.html)
问题是 php 没有返回任何错误,并且操作似乎已成功完成,除了实际上什么也没有发生。如果您检查服务器日志,将有一个“错误 53”条目(服务器不愿意执行)。
希望这能为那些苦苦寻找解决方案的人节省几个小时的宝贵时间...
alex at netflex dot nl
21 年前
也适用于 eDirectory 8 (NW6)。

如果您要移动用户,请记住您也要更改 uid!
匿名
22 年前
要使此函数正常工作,请确保 $newrdn 的值为相对值。
web at davss dot com
9 年前
在使用 ldap_rename 或任何其他不只是重命名,而是创建新的父节点并移动子节点的方法时,需要记住一点,您将丢失原始的 entryUUID!
我们想为 LDAP->DB 用户组做本地数据库映射,认为这将是最稳定的资源标识符,结果发现我们完全错了。
To Top