LDAP 函数
在线手册:中文  英文

ldap_mod_replace

(PHP 4, PHP 5)

ldap_mod_replaceReplace attribute values with new ones

说明

bool ldap_mod_replace ( resource $link_identifier , string $dn , array $entry )

Replaces one or more attributes from the specified dn. It performs the modification at the attribute level as opposed to the object level. Object-level modifications are done by the ldap_modify() function.

参数

link_identifier

An LDAP link identifier, returned by ldap_connect().

dn

The distinguished name of an LDAP entity.

entry

返回值

成功时返回 TRUE, 或者在失败时返回 FALSE

注释

Note: 此函数可安全用于二进制对象。

参见


LDAP 函数
在线手册:中文  英文

用户评论:

dynamik (2013-02-15 06:11:40)

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)

freemjohn at gmail dot com (2012-07-09 19:30:51)

For openldap 2.x server ,there is a rule-order, by default(2.3+), rules going in order:
access to * by * read
access to attr=userPassword,SambaNTPassword
by self write
by anonymous auth
by * none
so that will NOT allow yourself to change your password, that will:
access to attr=userPassword,SambaNTPassword
by self write
by anonymous auth
by * none
access to * by * read

Anonymous (2012-06-01 08:32:57)

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.

plex909 (2008-09-30 15:23:36)

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

chris at mr2madness dot com (2007-09-18 07:44:47)

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

mike dot rosile at interzonegames dot com (2007-07-20 09:01:14)

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

aaronfulton at softhome dot net (2006-12-03 20:24:01)

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 * none

erwann at zeflip dot com (2006-10-04 10:41:21)

If 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$adminpassword1);
    
$user->SetPassword($newuser_password);
    
$user->SetInfo();

// to activate a user
    
$ADSI = new COM("LDAP:");
    
$user $ADSI->OpenDSObject("LDAP://".$server."/".$newuser_dn$adminuser$adminpassword1);
    
$user->AccountDisabled false;
    
$user->SetInfo();

?>

EelBait (2006-09-28 16:11:26)

Using ldap_mod_replace to change a user's password will not set the password using a hashed value, but rather in clear text. There doesn't seem to be a way to use the various password-change protocols (e.g. extended operation) using this API. You might be better off using the ldappasswd command-line tool to perform this function.

frederic dot jacquot at insa-lyon dot fr (2004-06-09 04:26:54)

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

(2002-07-18 23:32:34)

Sometime,we cannot replace ldap_mod_replace function with ldap_mod_del function and ldap_mod_add fuction .We don't have permission to delete an attribute but we can replace it.

ondrej at sury dot cz (2002-02-26 05:31:06)

in openldap 2.0.x you can use method with mod_del/mod_add only if the attribute have defined EQUALITY rule.

JoshuaStarr at aelana dot com (2001-08-30 23:28:07)

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

oyvindmo at initio dot no (2000-11-30 04:57:18)

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.

yife at myrice-ltd dot com (2000-11-16 01:57:26)

if 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 that

易百教程