2012-05-26 58 views
5

獲得一個錯誤。但是,我可以搜索,添加,刪除和修改用戶的任何屬性。ldap_mod_replace()[function.ldap-MOD-取代]:修改:服務器是不願意執行

使用管理員帳戶進行綁定,管理員擁有更改任何用戶密碼的完整權限。

下面是我使用的代碼:

<?php 
$dn = "CN=Vishal Makwana,OU=Address Book,DC=example,DC=com"; 
$ad = ldap_connect("ldap://example.com") 
     or die("Couldn't connect to AD!"); 
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3); 
$bd = ldap_bind($ad,"[email protected]mple.com","admin1"); 

    if($bd) { 
     echo "AD bind successfully"; 
     } 
    else { 
     echo "Couldn't bind AD";; 
    } 

$user["unicodePwd"] = "asdf1234"; 

$result = ldap_mod_replace($ad, $dn, $user); 
if ($result) echo "User modified!"; else 
      echo "There was a problem!"; 

ldap_unbind($ad); 
?> 

回答

9

有一些的,你需要得到通過LDAP於公元設置密碼完全正確的事情。

  • 你需要使用SSL連接(LDAPS://)

  • 密碼需要用引號括起來

  • 的(引用)密碼需要16進行編碼位Unicode(UTF-16LE)

假設你想設置的密碼是普通的ASCII字符,則Unicode轉換可以通過添加\ 000字節來完成在ascii字符串的每個字節之後,如this code sample所示。

所以,你的例子,而不是看起來像:

$newpassword = "asdf1234"; 
$newpassword = "\"" . $newpassword . "\""; 
$len = strlen($newpassword); 
for ($i = 0; $i < $len; $i++) $newpass .= "{$newpassword{$i}}\000"; 
$user["unicodePwd"] = $newpass; 
+0

非常感謝大衛,但我有點困惑。當我嘗試使用SSL連接時,(ldaps://)它甚至不與AD綁定。我的意思是,我是否需要在Apache或PHP中啓用SSL支持?如果是的話,我該怎麼做。 –

+0

不應該「{$ newpassword {$ i}} \ 000」爲「{$ newpassword [$ i]} \ 000」即方括號而不是捲曲嗎? – redreinard

2

搜索了很多,花費了大量的時間後,我終於能夠修改從使用LDAP庫PHP代碼中的Active Directory用戶密碼。

我們需要LDAP與PHP代碼中的活動目錄服務器的連接;並且您必須修改unicodePwd字段。

ldap_connect(ldaps://IP, 636); 
ldap_connect(ldaps://IP, 389); 
+0

安裝我的證書後,我一直認爲這是我的問題,但在閱讀您所寫的內容後,我使用「userPassword」而不是「unicodePwd」。謝謝。 – geekinit

相關問題