Cela fait quelques jours que je suis perplexe. J'ai essayé différentes solutions en vain. S'il vous plaît aider ...Modifier le mot de passe AD à l'aide de PHP/COM/ADSI/LDAP
Problème: Nous avons deux contrôleur de domaine, qui ne sont pas sous notre gestion. Nous sommes en mesure de se connecter via LDAP sur le port 389, mais ne pouvons pas se connecter en toute sécurité sur le port 636.
Nous développons un système permettant un certain nombre d'installations en libre-service, dont un outil de récupération de mot de passe. Cela fonctionne jusqu'à réinitialiser le mot de passe des utilisateurs.
J'ai trouvé un code via the PHP manual qui semble faire ce dont nous avons besoin, mais je n'arrive pas à le faire fonctionner.
C'est le code que j'ai donc loin
if ($caller==="change"){
if (($newPword1 === NULL)||($newPword1 === "")){ return false;}
if (($newPword2 === NULL)||($newPword2 === "")){ return false;}
if ($newPword1 != $newPword2) {
$result["ERROR"]="1";
$result["DETAILS"]="Your new password and the confirmation must match!";
exit();
}
try {
$adldap = new adLDAP();
} catch (adLDAPException $e) {
$result["ERROR"]="1";
$result["DETAILS"]="An error occurred in adLDAP";
echo json_encode($result);
exit();
}
$userinfo = $adldap->user()->info($username, array("givenname","dn","lockouttime"));
$res = $userinfo[0]["lockouttime"];
$userDN = $userinfo[0]["dn"];
$firstName = $userinfo[0]["givenname"];
$authUser = $adldap->authenticate($username,$currentPword);
if ($authUser){
try {
$adminUsername = $domain."\\".$adminUsername;
$srvDN = "LDAP://".$server."/";
try {
$ADSI = new COM("LDAP:");
} catch (exception $e){
$result["ERROR"]="1";
$result["ERRORmsg"]=$e->getMessage();
echo json_encode($result);
exit();
}
try {
$user = $ADSI->OpenDSObject($srvDN.$userDN, $adminUsername, $adminPassword, 1);
} catch (exception $e){
$result["ERROR"]="2";
$result["ERRORmsg"]= $e->getMessage();
echo json_encode($result);
exit();
}
try { //set password
if ($user){
$result["object"]="Success";
} else {
$result["object"]="Failed";
}
$user->SetPassword($newPword1); //line:114 -> error occurring on this line
$user->SetInfo();
$result["ERROR"]="0";
$result["DETAILS"]="Thank you $firstName[0]<br><strong>Your password has been changed</strong><br><br>This may take up to 30 minutes to take effect depending on your location";
} catch (exception $e) {
$result["ERROR"]="3";
$result["ERRORmsg"]=$e." - ".$e->getMessage();
$result["DETAILS"]="An Error Occurred.";
}
unset($user);
unset($ADSI);
} catch (exception $e){
$result["ERROR"]="1";
$result["DETAILS"]="An Error Occurred in the ADSI COM";
echo json_encode($result);
exit();
}
} else {
if ($res[0] != "0"){
$result["ERROR"]="1";
$result["DETAILS"]="Im sorry $firstName[0].<br>Your account is now locked. Please contact the IT Service Desk for advice";
} else {
$result["ERROR"]="1";
$result["DETAILS"]="Im sorry $firstName[0].<br>Your current password is incorrect";
}
}
Dans les tests $result["object"]
retours "succès". Mais le code semble échouer sur la ligne $user->SetPassword($newPword1);
.
L'erreur qui est renvoyée est:
ERROR -> "3"
object -> "Success"
ERRORmsg -> "exception 'com_exception' with message '<b>Source:</b> Unknown<br/><b>Description:</b> Unknown' in C:\inetpub\wwwroot\<path>\<filename>.php:114
Stack trace:
#0 C:\inetpub\wwwroot\<path>\<filename>.php(114): variant->SetPassword('[email protected]')
#1 {main} - <b>Source:</b> Unknown<br/><b>Description:</b> Unknown"
DETAILS -> "An Error Occurred."
Le code ci-dessus est dans un php doc sur un serveur Web IIS qui est appelé par une page visible de l'utilisateur via https
Êtes-vous en mesure de offrir des conseils ou des conseils?
Je suis assez sûr que AD est assez difficile de ne pas mettre les mots de passe sur LDAP en texte clair. Vous en avez besoin pour activer SSL sur LDAP. – geoffc
Avez-vous essayé phpLdapAdmin? –
** UPDATE 29 décembre 12 à 16: 46 ** J'ai pu prouver depuis que 'new COM (" LDAP: ")' s'initialise avec succès et '$ ADSI-> OpenDSObject' ouvre avec succès l'objet AD. J'ai essayé contre d'autres comptes AD utilisateur et le script échoue sur la même ligne ** Dec 29 '12 à 17:57 ** ont remplacé '$ user-> SetPassword ($ newPword1);' avec '$ user-> Put ("pwdLastSet", 0); 'et il a correctement mis à jour l'attribut AD approprié. Donc, cela montre que la connexion ADSI fonctionne – ChrisM