(PHP 4, PHP 5, PHP 7, PHP 8)
ldap_mod_replace — Remplaza un atributo en la entrada actual
$ldap,$dn,$entry,$controls = null
Remplaza uno o varios atributos de la entrada dn.
También puede añadir o eliminar atributos.
ldapUna instancia de LDAP\Connection , devuelta por ldap_connect() .
dnEl nombre DN de la entrada LDAP.
entryArray asociativo que enumera los atributos a reemplazar. El envío de un array vacío como valor eliminará el atributo, mientras que el envío de un atributo que no exista aún en esta entrada lo añadirá.
controlsArray de Controles LDAP a enviar con la petición.
| Versión | Descripción |
|---|---|
| 8.1.0 |
El parámetro ldap ahora espera una instancia de LDAP\Connection
; anteriormente, se esperaba un resource ldap link válido.
|
| 8.0.0 |
controls ahora acepta null ; anteriormente, su valor predeterminado era [].
|
| 7.3.0 |
Soporte para controls ha sido añadido.
|
Nota:
Esta función es segura para sistemas binarios.
You can use arrays for multiple attributes example:
<?php
$entry[mail] = array("example@example.com","example2@example.com");
$results = ldap_mod_add($ldapConnID,$dn, $entry);
?>
or as i did for creating anew user:
<?php
$adduserAD["objectClass"] = array("top","person","organizationalPerson","user");
?>To modify an attribute with a single value:
$entry[mail] = "newmail@aelana.com";
$results = ldap_mod_add($ldapConnID,$dn, $entry);
To modify an attribute with multiple values:
$entry[mail][] = "newmail@aelana.com";
$entry[mail][] = "altnewmail@aelana.com";
$results = ldap_mod_add($ldapConnID,$dn, $entry);
To modify multiple attributes
$entry[mail][] = "newmail@aelana.com";
$entry[mail][] = "altnewmail@aelana.com";
$entry[c] = "US";
$results = ldap_mod_add($ldapConnID,$dn, $entry);this can not be used to change a password on an AD server that requires you to send the old and new password.
in order to do this use on shuts an sever make an admin-account that allows to change other ppl pw without suppling the old password first.Using this function to 'replace' an Active Directory password requires the "Reset Password" security permission as opposed to the "Change Password" permission (which is assigned by default to SELF)Changing a user password in Active Directory.
Securely connect (using ldaps) to the Active Directory and bind using an administrator account.
In this example, $userDn contains the dn of the user I want to modify, and $ad is the Active Directory ldaps connection)
$newPassword = "MyPassword";
$newPassword = "\"" . $newPassword . "\"";
$len = strlen($newPassword);
for ($i = 0; $i < $len; $i++)
$newPassw .= "{$newPassword{$i}}000円";
$newPassword = $newPassw;
$userdata["unicodepwd"] = $newPassword;
$result = ldap_mod_replace($ad, $userDn, $userdata);
if ($result) echo "User modified!" ;
else echo "There was a problem!";
I found it hard to get a proper encoding for the unicodepwd attribute so this piece of code might help you ;-)in openldap 2.0.x you can use method with mod_del/mod_add only if the attribute have defined EQUALITY rule.Here's an easy way to encode AD "unicodepwd" values from linux...
Download and install recode...
http://www.gnu.org/software/recode/recode.html
Then write something like this...
<?php
function ADUnicodePwdValue($plain_txt_value)
{
return str_replace("\n", "", shell_exec("echo -n '\"" . $plain_txt_value . "\"' | recode latin1..utf-16le/base64"));
}
$user["unicodepwd"] = ADUnicodePwdValue("my_password");
?>
[EDITOR thiago NOTE: The following text was sent by boyvanderlaak at gmail dot com as an important complement]
if you do not have access to your linux box but have Multibyte String enabled you could try the following for AD 2008:
<?php
$info["unicodePwd"] = mb_convert_encoding('"' . $newPassword . '"', 'utf-16le');
?>Here is some great information from the OpenLDAP FAQs regarding changing a userPassword attribute with PHP:
http://www.openldap.org/faq/data/cache/347.html
$userpassword = "{SHA}" . base64_encode( pack( "H*", sha1( $pass ) ) );ldap_mod_replace() and ldap_modify() are _exactly_ the same. So, the comment that ldap_mod_replace() "performs the modification at the attribute level as opposed to the object level", has no root in reality.Before you modify values in your ldap directory, first make sure that you have permission to do so. In openldap adding the following acl in slap.conf will allow the user to modify their own userpassword.
access to attr=userPassword
by self write
by anonymous auth
by * noneif i want to replace the special attribute but i don't replace other attribute ,i just use "ldap_mod_del" and "ldap_mod_add" ,the function seems to thatIf you do not wish to set up SSL on your active directory, and you are running on Windows, you can use COM and ADSI to set the new password for a user, or to active a user:
<?PHP
// to set a user password
// server is the ldap server
// newuser_dn is the full dn of the user you want to modify
// newuser_password is the password you wish to set for the user
$ADSI = new COM("LDAP:");
$user = $ADSI->OpenDSObject("LDAP://".$server."/".$newuser_dn, $adminuser, $adminpassword, 1);
$user->SetPassword($newuser_password);
$user->SetInfo();
// to activate a user
$ADSI = new COM("LDAP:");
$user = $ADSI->OpenDSObject("LDAP://".$server."/".$newuser_dn, $adminuser, $adminpassword, 1);
$user->AccountDisabled = false;
$user->SetInfo();
?>An bettter method to create the unicodePwd Active Directory LDAP field from PHP is:
$unicodePwd = iconv("UTF-8", "UTF-16LE", "\"".$password."\"");
It works when $password is coming from a UTF-8 page. If your $password is not utf-8, change the 1st parameter of iconv.