我想为搜索表单制作城市选项列表。该列表应仅包含我将要搜索的Active Directory中l
的{{1}}字段中输入的城市。据我所知,我需要从我的AD中获取所有Users
并以此方式生成城市列表。 (然后我会缓存列表)。由于这将是一个繁重的操作,并且由于我的AD在1000处搜索结果,我感觉我可能无法获得所有Users
,因此可能会错过一些城市。
有更好的方法吗?我正在使用PHP,目前正在使用Users
和ldap_search
。
答案 0 :(得分:1)
您需要执行分页搜索操作以返回比每个查询的默认1000限制更多的数据。分页搜索的工作原理是每个查询仍然可以获得1000个项目,但服务器会记住搜索停止的位置,向您发送 cookie ,您可以稍后使用此cookie进行后续搜索请求。然后服务器将返回另外1000个项目,依此类推,直到服务器返回空cookie - >结果集已完成。
这通常需要一些代码来完成所有事情。我建议如果你打算用ldap做更多的事情,看看一些成熟的php库,比如adLDAP或AD-X。
至于搜索查询本身,我建议采用以下方式:
l
属性的用户:
(及(objectcategory =人)(L = *))
(这也将包括联系对象 - 如果您不想这样做,请用objectclass=user
替换第一部分)l
函数获取array_unique
属性的值并执行该集的 uniquification 。如果你决定使用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
如果您不想使用库,那么您一定要看看构成分页结果搜索功能的这两个函数:
我希望这有帮助!祝你好运!