Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP LDAP更改(而不是重置)用户密码_Php_Laravel_Active Directory_Ldap - Fatal编程技术网

使用PHP LDAP更改(而不是重置)用户密码

使用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

我正在尝试使用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->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重置密码时,您不必知道旧密码,例如管理员会重置密码。更改密码时,您必须知道旧密码。授予用户重置自己密码的权限的问题在于,当他与用户一起登录并保持计算机未锁定时,任何人都可以更改自己的密码,而无需知道旧密码。