使用PHP LDAP更改(而不是重置)用户密码
我正在尝试使用php ldap更改Microsoft active directory中的用户密码。问题是,当尝试使用使用PHP LDAP更改(而不是重置)用户密码,php,laravel,active-directory,ldap,Php,Laravel,Active Directory,Ldap,我正在尝试使用php ldap更改Microsoft active directory中的用户密码。问题是,当尝试使用ldap\u mod\u replace更改密码时,它不是更改而是重置密码,这不是我想要的,因为我的用户不允许重置自己的密码 active directory基于Microsoft server 2016,我的应用程序使用PHP 7.2在IIS Web服务器上运行 // open LDAP connection $ldap_connection = $this->conn
ldap\u mod\u replace
更改密码时,它不是更改而是重置密码,这不是我想要的,因为我的用户不允许重置自己的密码
active directory基于Microsoft server 2016,我的应用程序使用PHP 7.2在IIS Web服务器上运行
// open LDAP connection
$ldap_connection = $this->connectToActiveDirectory();
if (@ldap_bind($ldap_connection, $this->ldap_username . '@' . env('LDAP_DOMAIN', 'localhost'), $request->oldPassword)) {
// LDAP connection established
$dn = $request->userdn; // distinguished name of user
/*
The DC requires that the password value be specified in a UTF-16 encoded Unicode
string containing the password surrounded by quotation marks, which has been BER-encoded
as an octet string per the Object(Replica-Link) syntax.
*/
$newPassword = "\"" .$request->password. "\"";
$utf16Password = ""; // converted password
$passwordLength = strlen($newPassword);
for ($i = 0; $i < $passwordLength; $i++) {
$utf16Password .= "{$newPassword{$i}}\000";
}
$passwordEntry = array('unicodePwd' => $utf16Password);
// Set new password
if(@ldap_mod_replace($ldap_connection, $dn, $passwordEntry)) {
// Successful
} else {
// Error, probably not enough permissions
return back(); // Redirect user to previous page
}
ldap_unbind($ldap_connection); // Close LDAP connection
return redirect('/logout'); // Redirect user to logout
}
//打开LDAP连接
$ldap_connection=$this->connectToActiveDirectory();
if(@ldap\u bind($ldap\u connection,$this->ldap\u username.@.env('ldap\u DOMAIN','localhost'),$request->oldPassword)){
//LDAP连接已建立
$dn=$request->userdn;//用户的可分辨名称
/*
DC要求在UTF-16编码的Unicode中指定密码值
包含由引号包围的密码的字符串,已对其进行BER编码
按照对象(副本链接)语法作为八位字节字符串。
*/
$newPassword=“\”。$request->password。“\”;
$utf16Password=”“;//已转换的密码
$passwordLength=strlen($newPassword);
对于($i=0;$i<$passwordLength;$i++){
$utf16Password.=“{$newPassword{$i}}\000”;
}
$passwordEntry=array('unicodePwd'=>$utf16Password);
//设置新密码
if(@ldap\u mod\u replace($ldap\u connection,$dn,$passwordEntry)){
//成功的
}否则{
//错误,可能没有足够的权限
return back();//将用户重定向到上一页
}
ldap_解除绑定($ldap_连接);//关闭ldap连接
返回重定向('/logout');//将用户重定向到注销
}
我想更改密码而不是重置密码,但我找不到解决方案。也许你们中的一些人遇到过这个问题,我非常感谢你们的帮助 根据,这是您的操作方式:
如果修改请求包含一个删除操作,该操作包含unicodePwd的值Vdel,然后是一个添加操作,该操作包含unicodePwd的值Vadd,则服务器将该请求视为更改密码的请求。。。Vdel是旧密码,而Vadd是新密码
简而言之,您需要在一个LDAP请求中删除该值并添加该值。在PHP中,这意味着使用函数。事实上,在该文档中,关于如何更改密码:
更改和重置有什么区别?@GiacomoM重置密码时,您不必知道旧密码,例如管理员会重置密码。更改密码时,您必须知道旧密码。授予用户重置自己密码的权限的问题在于,当他与用户一起登录并保持计算机未锁定时,任何人都可以更改自己的密码,而无需知道旧密码。