2

根据php.net 手册中的这些 帖子,应该可以为.ldap_search()

但是,我无法让以下实现工作:

$dn[] = 'ou=Red,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Green,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Blue,ou=Teams,ou=Users,dc=example,dc=org';

$query = ldap_search($conn, $dn, $filter, $attrs);

通过任何单独的 DN 字符串时一切都很好,但提供数组将出错并显示消息:'没有这样的对象'。

一个明显的解决方法是遍历我的 DN 数组以触发单独的查询并将所有内容推送到一个数组中。我想避免这样做,因为我在一个 DN (分页 - 示例 2)中带回了 8000 多个对象,在另外两个中带回了大约 300 个对象。

实际上是否可以搜索多个 DN? 可能是单个 DN 字符串中的特殊语法(符号/字符)?

4

2 回答 2

3

搜索请求必须至少包含以下参数:

  • 搜索开始的基础对象(不返回基础对象之上的对象)
  • 搜索范围:base是基础对象本身,one是基础对象和基础对象下一级,sub是基础对象和基础对象下面的所有条目。
  • 一个过滤器,它将返回的条目限制为与过滤器中的断言匹配的条目

也可以提供属性列表,但如果在搜索请求中没有提供任何用户属性,LDAP API 将请求所有用户属性,但不是全部。

在列出的情况下,将基础对象设置为ou=users,dc=example,dc=com并使用适当的过滤器。如果 LDAP 客户端必须将返回的条目限制为从属于 , 的条目ou=redou=green或者ou=blue可以使用复合可扩展匹配过滤器,例如(&(objectClass=inetOrgPerson)(|(ou:dn:=red)(ou:dn:=green)(ou:dn:=blue)))- 如果数据不使用,则使用正确的对象类inetOrgPerson。所有 LDAP 兼容的服务器都支持可扩展的匹配过滤器,但不兼容的服务器可能不支持此标准过滤器。

不能使用多个基础对象,该scope参数定义了在基础对象下方检查多少从属级别(如果有)。

也可以看看

于 2012-05-09T12:57:24.357 回答
2

您在手册中看到了吗?

这些数组的大小必须与链接标识符数组的大小相同,因为数组的第一个条目用于一次搜索,第二个条目用于另一个搜索,依此类推。

基本上,您的$conn变量需要是一个与数组大小相等的连接$dn数组。

如果数组中有 3 个元素,则$dn数组中需要 3 个元素$conn

$ds = ldap_connect($ldapserver);

$dn[] = 'ou=Red,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Green,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Blue,ou=Teams,ou=Users,dc=example,dc=org';

// Match connection elements to count of dn elements
for($x=0, $x < count($dn), $x++)
{
    $conn[] = $ds;
}

$query = ldap_search($conn, $dn, $filter, $attrs);
于 2012-05-09T12:51:02.117 回答