ldap_mod_replace

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_mod_replace使用新的值替换属性值

描述

ldap_mod_replace(
    LDAP\Connection $ldap,
    string $dn,
    array $entry,
    ?array $controls = null
): bool

用新的值替换指定 dn 中的一个或多个属性。它也可以添加或删除属性。

参数

ldap

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

dn

LDAP 实体的区分名称。

entry

一个关联数组,列出了要替换的属性。发送一个空数组作为值将删除属性,而发送一个在该条目中不存在的属性将添加它。

controls

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

返回值

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

变更日志

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

注释

注意: 此函数是二进制安全的。

参见

添加注释

用户贡献的注释 14 个注释

11
chris at mr2madness dot com
16 年前
您可以对多个属性使用数组,例如

<?php
$entry
[mail] = array("[email protected]","[email protected]");
$results = ldap_mod_add($ldapConnID,$dn, $entry);
?>
或者像我为创建新用户所做的那样
<?php
$adduserAD
["objectClass"] = array("top","person","organizationalPerson","user");
?>
3
JoshuaStarr at aelana dot com
22 年前
要修改具有单个值的属性
$entry[mail] = "[email protected]";
$results = ldap_mod_add($ldapConnID,$dn, $entry);

要修改具有多个值的属性
$entry[mail][] = "[email protected]";
$entry[mail][] = "[email protected]";
$results = ldap_mod_add($ldapConnID,$dn, $entry);

要修改多个属性
$entry[mail][] = "[email protected]";
$entry[mail][] = "[email protected]";
$entry[c] = "US";
$results = ldap_mod_add($ldapConnID,$dn, $entry);
1
匿名
12 年前
这不能用于更改需要您发送旧密码和新密码的 AD 服务器上的密码。

为了做到这一点,在关闭的服务器上创建一个管理员帐户,该帐户允许您更改其他人的密码,而无需先提供旧密码。
1
dynamik
11 年前
使用此函数“替换”Active Directory 密码需要“重置密码”安全权限,而不是“更改密码”权限(默认分配给 SELF)
1
frederic dot jacquot at insa-lyon dot fr
20 年前
更改 Active Directory 中的用户密码。
安全连接(使用 ldaps)到 Active Directory 并使用管理员帐户绑定。

在本例中,$userDn 包含我要修改的用户 dn,$ad 是 Active Directory ldaps 连接)

$newPassword = "MyPassword";
$newPassword = "\"" . $newPassword . "\"";
$len = strlen($newPassword);
for ($i = 0; $i < $len; $i++)
$newPassw .= "{$newPassword{$i}}\000";
$newPassword = $newPassw;
$userdata["unicodepwd"] = $newPassword;
$result = ldap_mod_replace($ad, $userDn, $userdata);
if ($result) echo "用户已修改!" ;
else echo "出现问题!" ;

我发现很难为 unicodepwd 属性获得正确的编码,所以这段代码可能对您有所帮助 ;-)
1
ondrej at sury dot cz
22 年前
在 openldap 2.0.x 中,您只能在属性定义了 EQUALITY 规则的情况下使用 mod_del/mod_add 方法。
0
plex909
15 年前
以下是从 Linux 编码 AD "unicodepwd" 值的简单方法...

下载并安装 recode...
http://www.gnu.org/software/recode/recode.html

然后写类似以下的内容...
<?php
function ADUnicodePwdValue($plain_txt_value)
{
return
str_replace("\n", "", shell_exec("echo -n '\"" . $plain_txt_value . "\"' | recode latin1..utf-16le/base64"));
}

$user["unicodepwd"] = ADUnicodePwdValue("my_password");

?>

[编辑 Thiago 注意:以下文本由 boyvanderlaak at gmail dot com 发送,作为重要的补充]

如果您无法访问您的 Linux 机器,但启用了多字节字符串,您可以尝试以下方法用于 AD 2008

<?php
$info
["unicodePwd"] = mb_convert_encoding('"' . $newPassword . '"', 'utf-16le');
?>
0
mike dot rosile at interzonegames dot com
17 年前
以下是 OpenLDAP 常见问题解答中关于使用 PHP 更改 userPassword 属性的一些有用信息

http://www.openldap.org/faq/data/cache/347.html

$userpassword = "{SHA}" . base64_encode( pack( "H*", sha1( $pass ) ) );
0
oyvindmo at initio dot no
23 年前
ldap_mod_replace() 和 ldap_modify() 完全相同。因此,关于 ldap_mod_replace() “在属性级别执行修改而不是在对象级别”的评论毫无根据。
-1
aaronfulton at softhome dot net
17 年前
在您修改 ldap 目录中的值之前,请先确保您有权这样做。在 openldap 中,在 slap.conf 中添加以下 acl 将允许用户修改自己的用户密码。

access to attr=userPassword
by self write
by anonymous auth
by * none
-1
yife at myrice-ltd dot com
23 年前
如果我想替换特殊属性,但不想替换其他属性,我只使用 "ldap_mod_del" 和 "ldap_mod_add",该函数似乎可以做到这一点
-2
erwann at zeflip dot com
17 年前
如果您不想在活动目录上设置 SSL,并且您正在 Windows 上运行,则可以使用 COM 和 ADSI 为用户设置新密码或激活用户。

<?PHP
// 设置用户密码
// server 是 ldap 服务器
// newuser_dn 是要修改的用户的完整 dn
// newuser_password 是您希望为用户设置的密码

$ADSI = new COM("LDAP:");
$user = $ADSI->OpenDSObject("LDAP://".$server."/".$newuser_dn, $adminuser, $adminpassword, 1);
$user->SetPassword($newuser_password);
$user->SetInfo();

// 激活用户
$ADSI = new COM("LDAP:");
$user = $ADSI->OpenDSObject("LDAP://".$server."/".$newuser_dn, $adminuser, $adminpassword, 1);
$user->AccountDisabled = false;
$user->SetInfo();

?>
-2
Anonymous
22 年前
有时,我们无法用 ldap_mod_del 函数和 ldap_mod_add 函数来替换 ldap_mod_replace 函数。我们没有权限删除属性,但可以替换它。
-3
giodev at panozzo dot it
4 年前
从 PHP 创建 unicodePwd 活动目录 LDAP 字段的更好方法是

$unicodePwd = iconv("UTF-8", "UTF-16LE", "\"".$password."\"");

当 $password 来自 UTF-8 页面时,它有效。如果您的 $password 不是 utf-8,请更改 iconv 的第一个参数。
To Top