您可以使用数组表示多个属性,例如
<?php
$entry[mail] = array("[email protected]","[email protected]");
$results = ldap_mod_add($ldapConnID,$dn, $entry);
?>
或者像我创建新用户那样
<?php
$adduserAD["objectClass"] = array("top","person","organizationalPerson","user");
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
ldap_mod_replace — 用新值替换属性值
替换指定 $dn
中的一个或多个属性。它也可以添加或删除属性。
ldap
一个 LDAP\Connection 实例,由 ldap_connect() 返回。
dn
LDAP 实体的区分名称。
entry
一个关联数组,列出要替换的属性。发送空数组作为值将删除属性,而发送在此条目中尚不存在的属性将添加它。
controls
要与请求一起发送的 LDAP 控制 数组。
版本 | 描述 |
---|---|
8.1.0 | $ldap 参数现在期望一个 LDAP\Connection 实例;以前,期望一个有效的 ldap link 资源。 |
8.0.0 |
$controls 现在可以为空;以前,它默认为 [] 。 |
7.3.0 | 添加了对 $controls 的支持 |
注意: 此函数是二进制安全的。
您可以使用数组表示多个属性,例如
<?php
$entry[mail] = array("[email protected]","[email protected]");
$results = ldap_mod_add($ldapConnID,$dn, $entry);
?>
或者像我创建新用户那样
<?php
$adduserAD["objectClass"] = array("top","person","organizationalPerson","user");
?>
修改具有单个值的属性
$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);
更改 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 属性获得正确的编码,所以这段代码可能会帮助你 ;-)
这是一个在 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');
?>
以下是来自 OpenLDAP 常见问题解答中关于使用 PHP 更改 userPassword 属性的一些重要信息
http://www.openldap.org/faq/data/cache/347.html
$userpassword = "{SHA}" . base64_encode( pack( "H*", sha1( $pass ) ) );
ldap_mod_replace() 和 ldap_modify() 实际上完全相同。因此,关于 ldap_mod_replace() “在属性级别而不是对象级别执行修改” 的说法毫无根据。
在修改 LDAP 目录中的值之前,请确保您拥有执行此操作的权限。在 OpenLDAP 中,在 slap.conf 中添加以下 ACL 将允许用户修改他们自己的 userPassword。
access to attr=userPassword
by self write
by anonymous auth
by * none
如果您不想在活动目录上设置 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();
?>
从PHP创建unicodePwd活动目录LDAP字段的更好方法是
$unicodePwd = iconv("UTF-8", "UTF-16LE", "\"".$password."\"");
当$password来自UTF-8页面时,它有效。如果您的$password不是utf-8,请更改iconv的第一个参数。