2012-05-26 8 views
5

ottenendo un errore:ldap_mod_replace() [function.ldap-mod-sostituire]: Modifica: Il server non è disposto a svolgere

Server is unwilling to perform

mentre cambiando unicodePwd in AD tramite PHP. Tuttavia, sono in grado di cercare, aggiungere, rimuovere e modificare qualsiasi attributo degli utenti.

L'utilizzo dell'account amministratore per associare e amministrare ha i diritti per modificare le password di tutti gli utenti.

Ecco il codice che sto utilizzando:

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

risposta

9

Ci sono una serie di cose che dovete ottenere esattamente a destra per impostare una password in AD tramite LDAP.

  • è necessario utilizzare una connessione SSL (LDAPS: //)

  • la password deve essere racchiuso tra virgolette

  • la (citato) password deve essere codificato in 16- unicode bit (UTF-16)

Supponendo che la password si sta cercando di impostare è caratteri ASCII ordinari, la conversione unicode può essere realizzato con l'aggiunta di un byte \ 000 dopo ogni byte della stringa ascii, come mostrato in this code sample.

Così il vostro esempio potrebbe invece apparire come:

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

Grazie mille David, ma sono un po 'confuso. Quando ho provato a utilizzare la connessione SSL, (ldaps: //) non si associa nemmeno con l'annuncio. Voglio dire, dovrei aver bisogno di fare qualcosa per abilitare il supporto SSL in Apache o PHP? Se sì, come posso farlo. –

+0

non dovrebbe "{$ newpassword {$ i}} \ 000" essere "{$ newpassword [$ i]} \ 000" cioè parentesi quadre invece di ricci? – redreinard

2

Dopo aver cercato molto e spendere un sacco di tempo, sono finalmente in grado di modificare la password utente di Active Directory da codice PHP utilizzando la libreria LDAP.

Abbiamo bisogno della connessione LDAP con il server di directory attivo dal codice PHP; e che devi modificare il campo unicodePwd.

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

Dopo aver installato il certificato, continuavo a pensare che fosse il mio problema, ma dopo aver letto ciò che hai scritto, stavo usando "userPassword" invece di "unicodePwd". Grazie. – geekinit