2012-05-26 17 views
5

otrzymuję błąd:ldap_mod_replace() [function.ldap-mod-replace]: Modyfikacja: Serwer nie chce wykonać

Server is unwilling to perform

podczas zmiany unicodePwd w AD przez PHP. Jednak jestem w stanie wyszukiwać, dodawać, usuwać i modyfikować wszelkie atrybuty użytkowników.

Użycie konta administratora do powiązania i administratora ma pełne prawa do zmiany haseł wszystkich użytkowników.

Oto kod używam:

<?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); 
?> 

Odpowiedz

9

Istnieje wiele rzeczy, które trzeba uzyskać dokładnie prawo, aby ustawić hasło w AD poprzez LDAP.

  • trzeba użyć połączenia SSL (LDAPS: //)

  • hasło musi być ujęty w cudzysłów

  • The (cytowany) hasło musi być zakodowane w 16- bit Unicode (UTF-16LE)

Zakładając hasło próbujesz ustawić to zwykłe znaki ASCII, Unicode konwersji można osiągnąć przez dodanie \ 000 bajt po każdym bajcie ciągu ascii, jak pokazano w this code sample.

Więc zamiast Przykładem może wyglądać następująco:

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

Bardzo dziękuję David, ale jestem nieco zdezorientowany. Kiedy próbowałem użyć połączenia SSL, (ldaps: //), to nawet nie wiąże się z AD. Mam na myśli, czy powinienem coś zrobić, aby włączyć obsługę SSL w Apache lub PHP? Jeśli tak, jak mogę to zrobić. –

+0

nie powinno "{$ newpassword {$ i}} \ 000" be "{$ newpassword [$ i]} \ 000" tj. Nawiasów kwadratowych zamiast kręconych? – redreinard

2

Po wyszukaniu dużo i spędza dużo czasu, jestem w końcu w stanie zmodyfikować Active Directory hasło użytkownika z kodu PHP przy użyciu biblioteki LDAP.

Potrzebujemy połączenia LDAP z aktywnym serwerem katalogów z kodu PHP; i musisz zmodyfikować pole unicodePwd.

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

Po zainstalowaniu mojego certyfikatu ciągle myślałem, że to mój problem, ale po przeczytaniu tego, co napisałeś, użyłem "userPassword" zamiast "unicodePwd". Dzięki. – geekinit