gpt4 book ai didi

超出 PHP ldap_search 大小限制

转载 作者:可可西里 更新时间:2023-10-31 23:09:09 25 4
gpt4 key购买 nike

我对查询 Microsoft 的 Active Directory 很陌生,遇到了一些困难:

AD 的大小限制为每个请求 1000 个元素。我无法更改大小限制。 PHP好像不支持分页(我用的是5.2版本,生产服务器没办法更新。)

到目前为止,我遇到了两种可能的解决方案:

  1. 按 objectSid 对条目进行排序,并使用过滤器获取所有对象。 Sample Code
    我不喜欢这样有几个原因:
    • 弄乱 objectSid 似乎不可预测,因为你必须将它拆开,将其转换为十进制,再将其转换回来......
    • 我不明白你如何比较这些 ID。
      (我试过:'&((objectClass=user)(objectSid>=0))')

  2. 在对象名称的第一个字母之后过滤(按照建议 here ):
    这不是最佳解决方案,因为我们系统中的许多用户/组都以相同的几个字母作为前缀。

所以我的问题:

这里最好使用什么方法?
如果是第一个,如何确保正确处理 objectSid?

还有其他可能吗?我是否遗漏了一些明显的东西?

更新:
- This相关问题提供了有关简单分页结果扩展为何不起作用的信息。
- Web 服务器在 Linux 服务器上运行,因此 COM 对象/adoDB 不是一个选项。

最佳答案

我能够使用 ldap_control_paged_result 绕过大小限制

ldap_control_paged_result 用于通过发送分页控制来启用 LDAP 分页。以下功能在我的案例中非常有效。这适用于 (PHP 5 >= 5.4.0, PHP 7)

function retrieves_users($conn)
{
$dn = 'ou=,dc=,dc=';
$filter = "(&(objectClass=user)(objectCategory=person)(sn=*))";
$justthese = array();

// enable pagination with a page size of 100.
$pageSize = 100;

$cookie = '';

do {
ldap_control_paged_result($conn, $pageSize, true, $cookie);

$result = ldap_search($conn, $dn, $filter, $justthese);
$entries = ldap_get_entries($conn, $result);

if(!empty($entries)){
for ($i = 0; $i < $entries["count"]; $i++) {
$data['usersLdap'][] = array(
'name' => $entries[$i]["cn"][0],
'username' => $entries[$i]["userprincipalname"][0]
);
}
}
ldap_control_paged_result_response($conn, $result, $cookie);

} while($cookie !== null && $cookie != '');

return $data;
}

如果你现在已经成功更新你的服务器,那么上面的函数可以获取所有条目。我正在使用此功能来获取我们广告中的所有用户。

关于超出 PHP ldap_search 大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8636375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com