PHP Conference Japan 2024

ldap_mod_replace

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_mod_replace使用新值取代屬性值

說明

ldap_mod_replace(
    LDAP\Connection $ldap,
    字串 $dn,
    陣列 $entry,
    ?陣列 $controls = null
): 布林值

取代指定 dn 的一個或多個屬性。它也可以新增或移除屬性。

參數

ldap

一個 LDAP\Connection 實例,由 ldap_connect() 返回。

dn

LDAP 實體的識別名稱 (Distinguished Name)。

entry

一個列出要取代屬性的關聯式陣列。傳送一個空陣列作為值將會移除該屬性,而傳送一個此項目中尚不存在的屬性將會新增它。

controls

要與請求一起傳送的 LDAP 控制項 陣列。

返回值

成功時返回 true,失敗時返回 false

更新日誌

版本 說明
8.1.0 ldap 參數現在需要一個 LDAP\Connection 實例;以前需要一個有效的 ldap link 資源
8.0.0 controls 現在可以為 null;以前,它的預設值為 []
7.3.0 新增了對 controls 的支援

注意事項

注意此函式是二進位安全 (binary-safe) 的。

參見

新增註釋

使用者貢獻的註釋 14 則註釋

chris at mr2madness dot com
17 年前
您可以使用陣列表示多個屬性,例如:

<?php
$entry
[mail] = array("example@example.com","example2@example.com");
$results = ldap_mod_add($ldapConnID,$dn, $entry);
?>
或者像我建立新使用者時一樣:
<?php
$adduserAD
["objectClass"] = array("top","person","organizationalPerson","user");
?>
JoshuaStarr at aelana dot com
23 年前
修改具有單一值的屬性:
$entry[mail] = "newmail@aelana.com";
$results = ldap_mod_add($ldapConnID,$dn, $entry);

修改具有多個值的屬性:
$entry[mail][] = "newmail@aelana.com";
$entry[mail][] = "altnewmail@aelana.com";
$results = ldap_mod_add($ldapConnID,$dn, $entry);

修改多個屬性
$entry[mail][] = "newmail@aelana.com";
$entry[mail][] = "altnewmail@aelana.com";
$entry[c] = "US";
$results = ldap_mod_add($ldapConnID,$dn, $entry);
匿名
12 年前
這無法用於更改需要同時發送舊密碼和新密碼的 AD 伺服器上的密碼。

要做到這一點,請關閉伺服器並建立一個管理員帳戶,允許在不提供舊密碼的情況下更改其他人的密碼。
dynamik
11 年前
使用此函數「替換」Active Directory 密碼需要「重設密碼」安全權限,而不是「變更密碼」權限(預設指派給 SELF)。
frederic dot jacquot at insa-lyon dot fr
20 年前
更改 Active Directory 中的使用者密碼。
使用安全連線 (ldaps) 連線到 Active Directory 並使用管理員帳戶綁定。

在此範例中,$userDn 包含我要修改的使用者 dn,$ad 是 Active Directory ldaps 連線)

$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 "使用者已修改!" ;
else echo "發生問題!";

我發現很難取得 unicodepwd 屬性的正確編碼,所以這段程式碼可能對您有所幫助 ;-)
ondrej at sury dot cz
22 年前
在 openldap 2.0.x 中,只有當屬性已定義 EQUALITY 規則時,才能使用 mod_del/mod_add 方法。
plex909
16 年前
以下是在 Linux 中編碼 AD "unicodepwd" 值的簡單方法...

下載並安裝 recode...
https://gnu.dev.org.tw/software/recode/recode.html

然後編寫如下內容...
<?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");

?>

[編輯 thiago 備註:以下文字由 boyvanderlaak at gmail dot com 發送,作為重要的補充]

如果您無法存取您的 Linux 電腦,但已啟用多位元組字串,則可以針對 AD 2008 嘗試以下操作

<?php
$info
["unicodePwd"] = mb_convert_encoding('"' . $newPassword . '"', 'utf-16le');
?>
mike dot rosile at interzonegames dot com
17 年前
以下是 OpenLDAP 常見問題解答中關於使用 PHP 更改 userPassword 屬性的一些重要資訊

http://www.openldap.org/faq/data/cache/347.html

$userpassword = "{SHA}" . base64_encode( pack( "H*", sha1( $pass ) ) );
oyvindmo at initio dot no
24 年前
ldap_mod_replace() 和 ldap_modify() 完全相同。所以,ldap_mod_replace()「在屬性級別而非物件級別執行修改」的註釋與事實不符。
aaronfulton at softhome dot net
18 年前
在修改 LDAP 目錄中的值之前,請先確認您擁有執行此操作的權限。在 OpenLDAP 中,在 slap.conf 中添加以下 ACL 將允許使用者修改自己的 userpassword。

access to attr=userPassword
by self write
by anonymous auth
by * none
yife at myrice-ltd dot com
24 年前
如果我只想替換特定屬性,而不是替換其他屬性,我只需使用「ldap_mod_del」和「ldap_mod_add」,這個函數的功能似乎就是這樣。
erwann at zeflip dot com
18 年前
如果您不想在 Active Directory 上設定 SSL,而且您是在 Windows 上執行,則可以使用 COM 和 ADSI 來設定使用者的新密碼或啟用使用者。

<?PHP
// 設定使用者密碼
// $server 是 LDAP 伺服器
// $newuser_dn 是您要修改的使用者完整 DN
// $newuser_password 是您要為使用者設定的密碼

$ADSI = new COM("LDAP:");
$user = $ADSI->OpenDSObject("LDAP://".$server."/".$newuser_dn, $adminuser, $adminpassword, 1);
$user->SetPassword($newuser_password);
$user->SetInfo();

// 啟用使用者
$ADSI = new COM("LDAP:");
$user = $ADSI->OpenDSObject("LDAP://".$server."/".$newuser_dn, $adminuser, $adminpassword, 1);
$user->AccountDisabled = false;
$user->SetInfo();

?>
匿名
22 年前
有時,我們無法使用 ldap_mod_del 函數和 ldap_mod_add 函數來取代 ldap_mod_replace 函數。我們沒有刪除屬性的權限,但我們可以替換它。
giodev at panozzo dot it
4 年前
從 PHP 建立 unicodePwd Active Directory LDAP 欄位的更好方法是:

$unicodePwd = iconv("UTF-8", "UTF-16LE", "\"".$password."\"");

當 $password 來自 UTF-8 頁面時,它可以正常運作。如果您的 $password 不是 UTF-8,請更改 iconv 的第一個參數。
To Top