通过ldap从Active Directory获取不同的城市列表

时间:2013-08-19 18:28:51

标签: php active-directory ldap

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

有更好的方法吗?我正在使用PHP,目前正在使用Usersldap_search

1 个答案:

答案 0 :(得分:1)

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

这通常需要一些代码来完成所有事情。我建议如果你打算用ldap做更多的事情,看看一些成熟的php库,比如adLDAPAD-X

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

  1. 您搜索所有填写了l属性的用户: (及(objectcategory =人)(L = *)) (这也将包括联系对象 - 如果您不想这样做,请用objectclass=user替换第一部分)
  2. 您可以使用l函数获取array_unique属性的值并执行该集的 uniquification
  3. 如果你决定使用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
    

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

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