PHP&;IIS:LDAPS连接以更改密码


PHP & IIS: LDAPS Connection for Password Change

我的目标是通过使用PHP&IIS。

我一直在遵循http://www.ashleyknowles.net/2011/07/iis-php-and-ldaps-with-active-directory/

在遵循这些说明之前,我无法为LDAPS连接绑定到AD,但在遵循这些指示之后,它似乎成功地连接了,但当我尝试更改"unicodePwd"值时,会出现"服务器不愿意执行"的错误。

请注意,下面的代码将成功更改AD中用户的任何其他值。

<?php
$ldaprdn  = 'CN=Admin User,OU=*******,OU=Staff,OU=********,DC=********,DC=*******,DC=******,DC=*****';
$ldappass = "*******";  // associated password
$ldapconn = ldap_connect("ldaps://***.***.***.***:636" ) or die("Could not connect to LDAP server.");
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
if ($ldapconn) {
    // binding to ldap server
    $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);
    // verify binding
    if ($ldapbind) {
        echo "LDAP bind successful...";
        $username = '******';
        $dn = "CN=Bob Smith,OU=******,OU=******,OU=******,DC=******,DC=******,DC=******,DC=******";
        $newPassword = 'blah';
        $newEntry = array('unicodePwd' => encodePwd($newPassword));
        print_r($newEntry);
        if(ldap_mod_replace($ldapconn, $dn, $newEntry)) {
            print "<p>succeded</p>";
        } else {
            print "<p>failed</p>";
        }
        print_r(ldap_error($ldapconn));
    } else {
        echo "LDAP bind failed...";
        print_r(ldap_error($ldapconn));
    }
}
// Credit: http://www.cs.bham.ac.uk/~smp/resources/ad-passwds/
function encodePwd($pw) {
    $newpw = '';
    $pw = "'"" . $pw . "'"";
    $len = strlen($pw);
    for ($i = 0; $i < $len; $i++)
        $newpw .= "{$pw{$i}}'000";
    $newpw = base64_encode($newpw);
    return $newpw;
}
?>

已解决

事实证明,通过遵循Ashley Knowles教程,我成功地通过LDAP建立了SSL连接,但由于密码编码,出现了错误。

成功的密码编码归功于这个论坛帖子中的hd42,它使我能够相应地修改我的代码。

因此,一旦您在IIS服务器的硬盘驱动器中正确安装了证书等,此代码将通过IIS web服务器使用PHP成功修改Active Directory中的用户密码(假设$ldaprdn用户具有足够的管理权限):

<?php
$ldaprdn  = 'CN=Admin User,OU=*******,OU=Staff,OU=********,DC=********,DC=*******,DC=******,DC=*****';
$ldappass = "*******";  // associated password
$ldapconn = ldap_connect("ldaps://***.***.***.***:636" ) or die("Could not connect to LDAP server.");
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
if ($ldapconn) {
    // binding to ldap server
    $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);
    // verify binding
    if ($ldapbind) {
        echo "LDAP bind successful...";
        $dn = "CN=Bob Smith,OU=******,OU=******,OU=******,DC=******,DC=******,DC=******,DC=******";
        $newPassword = 'blah';
        $newPassword = "'"" . $newPassword . "'""; 
        $newPass = mb_convert_encoding($newPassword, "UTF-16LE");
        $newEntry = array('unicodePwd' => $newPass);
        print_r($newEntry);
        if(ldap_mod_replace($ldapconn, $dn, $newEntry)) {
            print "<p>succeded</p>";
        } else {
            print "<p>failed</p>";
        }
        print_r(ldap_error($ldapconn));
    } else {
        echo "LDAP bind failed...";
        print_r(ldap_error($ldapconn));
    }
}