php iis active-directory adsi change-password

Cambiar la contraseña AD utilizando PHP/COM/ADSI/LDAP



iis active-directory (2)

Descubrí que el sistema operativo que está utilizando tiene un impacto directo en el uso de este código.

Estaba haciendo mi trabajo de desarrollo en mi escritorio usando una versión local IIS (Windows 7 Enterprise, IIS 7.5) y seguí corriendo este error desconocido.

Sin embargo, una vez que probé mi código de restablecimiento de contraseña ADSI en un servidor real (Windows Server 2008 R2), funcionó a la perfección.

Para referencia: el código de error que obtuve (usando la respuesta de Ian) fue 0x80020009 que parece estar relacionado con esta pregunta: (El registro de un dll devuelve el error 0x80020009 )

Entonces, lo que está yendo mal parece ser más profundo que ADSI y PHP / COM.

NOTA: Al igual que ChrisM, pude usar la conexión ADSI para consultar información, la falla solo ocurrió cuando traté de usar SetPassword ()

Me he quedado perplejo con esto por un par de días. He intentado varias soluciones inútilmente. Por favor ayuda...

Problema: Tenemos dos controladores de dominio, que no están bajo nuestra administración. Podemos conectarnos a través de LDAP en el puerto 389, pero no podemos conectarnos de manera segura a través del puerto 636.

Estamos desarrollando un sistema para permitir varias instalaciones de autoservicio, una de las cuales es una herramienta de recuperación de contraseñas. Esto funciona hasta el punto de restablecer la contraseña de los usuarios.

He encontrado un código a través del manual de PHP que parece hacer lo que necesitamos, pero parece que no puede hacer que funcione.

Este es el código que tengo hasta ahora

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"; } }

En las pruebas, $result["object"] devuelve "Success". Pero el código parece fallar en $user->SetPassword($newPword1); línea.

El error que se devuelve es:

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(''P@ssw0rd'') #1 {main} - <b>Source:</b> Unknown<br/><b>Description:</b> Unknown" DETAILS -> "An Error Occurred."

El código anterior se encuentra en un documento php en un servidor web IIS que es llamado por una página visible por el usuario en https

¿Eres capaz de ofrecer algún consejo u orientación?


Estoy haciendo prácticamente lo mismo y ahora tengo que funcionar, al menos cuando selecciono un Server 2k8R2 DC.

No estoy seguro de por qué estás recibiendo el fracaso, pero hay un par de cosas que he encontrado útiles son:

1) En su controlador catch () recupere el error devuelto por SetPassword (), procese y visualice de la siguiente manera

$rawErr = $e->getCode(); $processedErr = $rawErr + 0x100000000; printf( ''Error code 0x%x'', $processedErr );

Luego mira si puedes encontrarlo aquí . También puede encontrar esto útil.

2) Intente variar la llamada de SetPassword () a ChangePassword (). Esto requiere que ingrese la contraseña anterior también, pero tiene requisitos de privilegios menos estrictos en el DC. Si puede hacer que funcione, podría sugerir que su problema con SetPassword () es que la cuenta de administrador que está utilizando para autenticarse en la llamada a OpenDSObject () no tiene suficientes privilegios en el dominio de destino.

Sin embargo, una palabra de advertencia sobre ChangePassword () es que, a diferencia de SetPassword (), la política de contraseñas se aplica estrictamente. Por lo tanto, debe tener en cuenta aspectos como la antigüedad mínima de la contraseña y la complejidad, y también el historial. Me deshice de ese último.

Muy buena suerte con eso, Ian.