我有这个方法来更改AD用户密码:
public function changePassword($ldapUserIdentifier, $oldPassword, $newPassword): string
{
try {
$this->ldap->bind("DOMAIN\\".$ldapUserIdentifier, $oldPassword);
$query = $this->ldap->query('dc=domain,dc=com', '(&(sAMAccountName=' . $ldapUserIdentifier . '))');
$result = $query->execute();
$entry = $result[0];
$newPassword = mb_convert_encoding('"' . $newPassword . '"', 'utf-16le');
$entryManager = $this->ldap->getEntryManager();
$entryManager->applyOperations($entry->getDn(), [
new UpdateOperation(LDAP_MODIFY_BATCH_REPLACE, 'unicodePwd', [$newPassword])
]);
dd("wait");
} catch (\Throwable $th)
{dd($th);
return $th->getMessage();
}
效果很好,但脚本不关心 AD 约束。 我的 Active Directory 限制是:
但是我的代码不遵守这个约束。
我想尊重AD约束
过了很多天,我解决了这个问题。
在这种情况下:
$entryManager->applyOperations($entry->getDn(), [
new UpdateOperation(LDAP_MODIFY_BATCH_REPLACE, 'unicodePwd', [$newPassword])
]);
Active Directory 认为他需要重置密码并需要管理员帐户。
在这种情况下:
$entryManager->applyOperations($entry->getDn(), [
new UpdateOperation(LDAP_MODIFY_BATCH_REMOVE, 'unicodePwd', [$oldPassword]),
new UpdateOperation(LDAP_MODIFY_BATCH_ADD, 'unicodePwd', [$newPassword])
]);
Active Directory 认为他需要更改密码并且不需要管理员帐户。
或这里: