2012-08-09 99 views
1

我有權訪問強制執行5個密碼歷史記錄限制的Active Directory。您擁有的最後5個密碼中的任何密碼都不是可設置或重置爲密碼的可行候選項。如何使ldap尊重活動目錄中的密碼歷史記錄php

我正在使用PHP,並試圖使用ldap調用來重置用戶的密碼。我可以使用ldap_modify調用來重置密碼。不幸的是,ldap_modify完全不關心Active Directory的密碼歷史規則,它會將密碼重置爲您選擇的任何內容,而不會出現任何警告或錯誤。

有沒有辦法讓ldap尊重這個限制?

我已經研究了一段時間,但還沒有找到任何固體解決方案。任何提示或意見非常感謝!

回答

1

如果MODIFY因任何原因失敗,目錄服務器應在MODIFY響應中返回非零結果代碼。在違反屬性約束的情況下(例如,歷史記錄中的密碼或自上次密碼更改或其他任何屬性約束違規以來已經過去的時間不足),目錄服務器必須返回整數結果代碼constraint violation( 19)。

LDAP協議不知道服務器實現如何處理密碼策略。 LDAP客戶端必須使用上述結果代碼來確定LDAP請求是否成功。也就是說,來自服務器實現的LDAP客戶端是獨立的

用戶條目是否受制於密碼策略(或任何其他屬性約束確定)取決於服務器,而不是協議。如果MODIFY請求成功,即使客戶端期望它失敗,問題仍然存在於服務器端或者受密碼策略的限制。

+0

非常好的解釋,謝謝! – 2012-08-10 15:04:18

2

最近我遇到了同樣的問題,發現this post。顯然,密碼修改被認爲是管理密碼重置,您必須指定AD以應用其規則的其他選項。

根據帖子,該控件必須在服務器上可用。這是目前在Windows Server 2008 R2的Service Pack 1,可以使用此修補程序安裝在2008 R2:

$ctrl1 = array(
    // LDAP_SERVER_POLICY_HINTS_OID for Windows 2012 and above 
    "oid" => "1.2.840.113556.1.4.2239", 
    "value" => sprintf("%c%c%c%c%c", 48, 3, 2, 1, 1)); 

$ctrl2 = array(
    // LDAP_SERVER_POLICY_HINTS_DEPRECATED_OID for Windows 2008 R2 SP1 and above 
    "oid" => "1.2.840.113556.1.4.2066", 
    "value" => sprintf("%c%c%c%c%c", 48, 3, 2, 1, 1)); 

if (!ldap_set_option($ds, LDAP_OPT_SERVER_CONTROLS, array($ctrl1, $ctrl2))) { 
    error_log("ERROR: Failed to set server controls"); 
} 

$result = ldap_mod_replace($ds, $dn, $entry); 

非常感謝:http://support.microsoft.com/?id=2386717

然後你發佈你的PHP代碼的修改命令之前配置選項給作者bmaupin(找不到他/她的名字)。 我決定回答這個問題,因爲我在尋找解決相同問題的解決方案時登陸了這裏。