2012-05-26 7 views
5

Erhalten einen Fehler auszuführen:ldap_mod_replace() [function.ldap-mod-ersetzen]: Ändern: Server nicht bereit ist,

Server is unwilling to perform

während unicodePwd in AD durch PHP zu verändern. Ich bin jedoch in der Lage, irgendwelche Attribute der Benutzer zu suchen, hinzuzufügen, zu entfernen und zu ändern.

Verwenden des Administratorkontos zum Binden und des Administrators hat die vollen Rechte zum Ändern der Kennwörter aller Benutzer.

Hier ist der Code, den ich mit:

<?php 
$dn = "CN=Vishal Makwana,OU=Address Book,DC=example,DC=com"; 
$ad = ldap_connect("ldap://example.com") 
     or die("Couldn't connect to AD!"); 
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3); 
$bd = ldap_bind($ad,"[email protected]","admin1"); 

    if($bd) { 
     echo "AD bind successfully"; 
     } 
    else { 
     echo "Couldn't bind AD";; 
    } 

$user["unicodePwd"] = "asdf1234"; 

$result = ldap_mod_replace($ad, $dn, $user); 
if ($result) echo "User modified!"; else 
      echo "There was a problem!"; 

ldap_unbind($ad); 
?> 

Antwort

9

Es gibt eine Reihe von Dingen, die Sie genau richtig zu machen brauchen ein Kennwort in AD über LDAP einzustellen.

  • benötigen Sie eine SSL-Verbindung zu verwenden (ldaps: //)

  • das Passwort in Anführungszeichen eingeschlossen werden muss

  • die (zitiert) Passwort in 16- codiert werden muss, bit Unicode (UTF-16 LE)

das Passwort Angenommen, Sie ist gewöhnlichen ASCII-Zeichen zu setzen sind versuchen, kann die Unicode-Konvertierung durch Hinzufügen eines \ 000 Byte erreicht werden nach jedem Byte der ASCII-Zeichenfolge, wie in this code sample gezeigt.

So würde Ihr Beispiel anstatt wie folgt aussehen:

$newpassword = "asdf1234"; 
$newpassword = "\"" . $newpassword . "\""; 
$len = strlen($newpassword); 
for ($i = 0; $i < $len; $i++) $newpass .= "{$newpassword{$i}}\000"; 
$user["unicodePwd"] = $newpass; 
+0

Vielen Dank David, aber ich bin etwas verwirrt. Als ich versuchte, eine SSL-Verbindung (ldaps: //) zu verwenden, bindet es nicht einmal an den AD. Ich meine, sollte ich etwas tun müssen, um die SSL-Unterstützung in Apache oder PHP zu aktivieren? Wenn ja, wie kann ich das tun? –

+0

sollte nicht "{$ newpassword {$ i}} \ 000" "{$ newpassword [$ i]} \ 000" sein, also eckige Klammern statt lockig? – redreinard

2

Nach viel Suchen und viel Zeit zu verbringen, ich bin endlich in der Lage, die Active Directory-Benutzer-Passwort von PHP-Code mithilfe von LDAP-Bibliothek zu ändern.

Wir benötigen die LDAP-Verbindung mit dem Active Directory-Server aus dem PHP-Code; und dass Sie das Feld unicodePwd ändern müssen.

ldap_connect(ldaps://IP, 636); 
ldap_connect(ldaps://IP, 389); 
+0

Nachdem ich mein Zertifikat installiert hatte, dachte ich, das sei mein Problem, aber nachdem ich gelesen habe, was du geschrieben hast, habe ich "userPassword" anstelle von "unicodePwd" verwendet. Vielen Dank. – geekinit