0

我想为搜索表单制作一个城市选择列表。该列表应仅包括输入到我将要搜索的 Active Directoryl字段中的那些城市。Users据我所知,我需要Users从我的 AD 中获取所有信息并以这种方式生成城市列表。(然后我会缓存列表)。由于这将是一项繁重的操作,并且由于我的 AD 将搜索结果限制为 1000,因此我有一种感觉,我可能无法获得所有Users信息,因此可能会错过一些城市。

有没有更好的办法?我正在使用 PHP,目前正在使用ldap_searchand ldap_get_values

4

1 回答 1

1

您需要执行分页搜索操作以返回超过每个查询的默认 1000 限制的数据。分页搜索的工作原理是每次查询仍然可以获取 1000 个项目,但服务器会记住您的搜索停止的位置,向您发送一个cookie,您可以稍后将此 cookie 用于后续搜索请求。然后服务器将返回另外 1000 个项目,依此类推,直到服务器返回空 cookie -> 结果集完成。

这通常需要一些代码才能使所有事情都正确。我建议如果您打算使用 ldap 做更多事情,请查看一些完善的 php 库,例如adLDAPAD-X

至于搜索查询本身,我建议采用以下方式:

  1. 您对所有填写了该属性的用户执行搜索l: (&(objectcategory=person)(l=*)) (这还将包括联系人对象 - 如果您不想要这个,请将第一部分替换为objectclass=user
  2. 您获取l属性的值并对集合进行唯一化,可能使用array_unique函数。

如果您决定使用 AD-X,那么这个任务就很简单了。

$link = new ADX\Core\Link( 'domain.com' ); // open connection
$link->bind ('username', 'pass'); // Authenticate

// The Task is a configuration object for your search
// request - let's configure it
$task = new ADX\Core\Task( ADX\Enums\Operation::OpSearch, $link );
$task->attributes( 'l' ); // Get these attributes
$task->filter( '(&(objectcategory=person)(l=*))' ); // use this search filter

// Do the search using paged searching, returning
// ALL matching objects
$result = $task->run_paged();

print_r( $result->unique( 'l' ); // Get all unique 'l' values from the set

如果您不想使用库,那么您绝对应该看看构成分页结果搜索功能的这两个函数:

我希望这有帮助!祝你好运!

于 2013-08-20T15:39:09.180 回答