2013-02-18 92 views
3

我的目標是使用PHPIIS通過Web界面更改Active Directory中的密碼。PHP和IIS:用於密碼更改的LDAPS連接

我一直在下面的說明http://www.ashleyknowles.net/2011/07/iis-php-and-ldaps-with-active-directory/

此前按照這些說明我不能讓一個綁定到AD的LDAPS連接,但是按照這些說明它似乎連接成功後,又給出了一個錯誤當我嘗試更改「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; 
} 

?> 

回答

4

已解決!

事實證明,通過遵循Ashley Knowles tutorial,我成功建立了LDAP SSL連接,但錯誤是因爲密碼編碼的發生。

成功的密碼編碼的積分是hd42,這個forum post使我能夠相應地修改我的代碼。

因此,一旦您在IIS服務器上的硬盤上正確安裝了證書等,此代碼將成功修改使用PHP通過IIS Web服務器在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)); 
    } 

} 
+0

你先生,真是太棒了:) – GateKiller 2014-09-22 08:39:59