2024年PHP开发者大会日本站

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
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_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的属性
但这可能只是我的模式
*/
$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=新容器名称”
- 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