Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在OpenLDAP中进行分页ldap_搜索以绕过大小限制?_C_Ldap_Openldap - Fatal编程技术网

C 在OpenLDAP中进行分页ldap_搜索以绕过大小限制?

C 在OpenLDAP中进行分页ldap_搜索以绕过大小限制?,c,ldap,openldap,C,Ldap,Openldap,我们目前正在从一个过时的专有目录服务迁移到OpenLDAP。 今天,我们遇到了这样一个问题:如果当前搜索返回的条目数量达到某个限制,那么,或ldapsearch通常不会返回任何结果 不幸的是,在LDAP服务器配置中设置更高的大小限制可能会推迟问题的解决,因为我们有一个非常大的数据库,而且我们每天早上运行的更新机制必须执行大量查询 在MSDN文档中,我注意到有一种机制可以执行一个操作,这将允许我绕过大小限制。 很明显,这也在一份文件中有规定,但尚未最终确定(尚未确定) 无论如何,由于我没有在Win

我们目前正在从一个过时的专有目录服务迁移到OpenLDAP。 今天,我们遇到了这样一个问题:如果当前搜索返回的条目数量达到某个限制,那么,或ldapsearch通常不会返回任何结果

不幸的是,在LDAP服务器配置中设置更高的大小限制可能会推迟问题的解决,因为我们有一个非常大的数据库,而且我们每天早上运行的更新机制必须执行大量查询

在MSDN文档中,我注意到有一种机制可以执行一个操作,这将允许我绕过大小限制。 很明显,这也在一份文件中有规定,但尚未最终确定(尚未确定)

无论如何,由于我没有在Windows Box上工作,我必须使用OpenLDAP API,它似乎没有提供这种机制(至少我在他们的应用程序上找不到)

这就引出了我的问题:你知道我能做些什么,以优雅的方式解决这个问题吗


谢谢你的帮助

使用AD或Novell的eDirectory?;)

OpenLDAP支持通过
ldap\u create\u page\u控件()
和friends进行分页结果检索。是一个描述和示例代码。如果这对我没有帮助,我可能可以提供生产代码的摘录。

我在使用ldap_create_page_控件和ldap_search_ext_s时遇到问题,默认情况下,我的ldap库实现使用的是ldap版本2,看起来版本3+支持它。在我将ldap设置为版本3之前,它从ldap_search_ext_s()返回“不受支持”。

我可以使用

ldap_控件_paged_结果用于通过发送分页控件来启用ldap分页。下面的函数在我的例子中运行得很好

    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;
    }
函数检索用户($conn)
{
$dn='ou=,dc=,dc=';
$filter=“(&(objectClass=user)(objectCategory=person)(sn=*)”;
$justthis=array();
//启用页面大小为100的分页。
$pageSize=100;
$cookie='';
做{
ldap_控制_分页_结果($conn,$pageSize,true,$cookie);
$result=ldap_search($conn、$dn、$filter、$justthis);
$entries=ldap\u get\u条目($conn,$result);
如果(!空($entries)){
对于($i=0;$i<$entries[“count”];$i++){
$data['usersLdap'][]=数组(
“名称”=>$entries[$i][“cn”][0],
'username'=>$entries[$i][“userprincipalname”][0]
);
}
}
ldap_控制_分页_结果_响应($conn,$result,$cookie);
}而($cookie!==null&&$cookie!='');
返回$data;
}

谢谢!我将在周一调查此事!(到目前为止,我只是放弃了这个话题,我们增加了查询限制…)我终于实现了它。它起作用了。非常感谢:)链接现在已断开。看起来它已移动到。所有类型的Active Directory(包括域控制器中使用的Active Directory,以及独立的Active Directory,如ADAM和AD LDS),通常每个请求返回1000个结果,因此如果您希望查询返回更多结果,您必须使用某种分页搜索:要么通过简单的分页结果控件,要么通过虚拟列表视图(VLV)控件。