【问题标题】:ldap_get_entries returns array with element count=zeroldap_get_entries 返回元素计数 = 零的数组
【发布时间】:2011-04-12 15:03:04
【问题描述】:

在某些情况下,ldap_get_entries 返回元素计数为零的数组,因此我有一个类似 array('count'=>0) 的数组,没有任何其他条目。

发生这种情况的条件是什么?

PS:

  • 如果我正在搜索的 OU 为空,我会收到另一个错误(无效的 Base DN)
  • 如果用户没有 OU 的权限,我会遇到与上述相同的错误

编辑:

  • PHP 代码无关紧要,因为我可以用它进行各种搜索,而上述问题只发生在一些奇怪的 Active Directory 配置中
  • 如果你还坚持...$entries = ldap_get_entries($this->ldap_connection, $search_result);
  • ldap_get_entries 在大多数情况下返回我期望它返回的正确错误

所以,重申一下我的问题,ldap_get_entries 返回 count=0 且没有任何错误的数组的条件是什么。我的意思是:

  • Active Directory 权限和权限
  • 用户权限
  • OU 权限(又名安全选项卡)
  • 有关何时发生这种情况的任何 PHP 相关信息

谢谢

EDIT2 - 根据要求,以下是其余代码:

public function connect() {

    // connect to the server
    $this->ldap_connection = ldap_connect($this->ldap_server);
    if (!$this->ldap_connection){
        $error_message= "LDAP-Connect-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }

    // set protocol version
    if (!ldap_set_option($this->ldap_connection, LDAP_OPT_PROTOCOL_VERSION, $this->ldap_protocol_version)){
        $error_message= "LDAP-SetProtocolVersion-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }

    // set with/without referrals (limit/do not limit search on current server)
    if (!ldap_set_option($this->ldap_connection, LDAP_OPT_REFERRALS, $this->ldap_protocol_referrals)){
        $error_message= "LDAP-SetReferrals-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }

    // binding to ldap server
    if (!@ldap_bind($this->ldap_connection, $this->ldap_auth_rdn, $this->ldap_auth_pass)){
        $error_message= "LDAP-Bind-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }
}

public function search($filter,$fields){
    if (!$this->ldap_connection) {
        $this->connect();
    }

    // search the ldap
    $search_result = @ldap_search($this->ldap_connection, $this->ldap_base_distinguished_name, $filter,$fields);
    if ($search_result===false){
        $error_message= "LDAP-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }

    //Create result set
    $entries = ldap_get_entries($this->ldap_connection, $search_result);
    if ($entries === false ){
        $error_message= "LDAP-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }

    return (is_null($entries) ? array() : $entries); // http://bugs.php.net/48469
}

【问题讨论】:

  • 您的 PHP 代码是相关的。我们不知道您是如何设置连接的。例如,您需要在 PHP 代码中设置 AD 的某些选项。

标签: php ldap ldap-query


【解决方案1】:

ldap_connect 似乎已成功连接到您的服务器。

我认为问题出在 ldap_search 中的 ldap_base_distinguished_name 参数上,请确保它是正确的,并且您的 AD 树中有该基本专有名称。

【讨论】:

    【解决方案2】:

    这意味着您正在搜索的内容没有返回结果,因为它不存在或者您没有正确搜索。

    【讨论】:

    • 使用可视化 LDAP 浏览器确保数据存在,以免自己发疯!
    • 所以,这里有一个例子,如果我搜索服务器的基本 dn,我得到 count=0 并且绝对没有错误。我想了解发生这种情况的条件是什么。
    • @Emyr:这是世界另一端的一个孤立网络,不幸的是,除了支持 PHP 的基于 Linux 的网络设备之外,我无法访问任何东西。
    • @Patkos,编辑您的问题并抛出您正在使用的代码。这样我们就不会瞎了。
    【解决方案3】:
    $ldap = new stdclass;
    $ldap->host = 'YOUR_HOST';
    $ldap->port = 'PORT'; 
    $ldap->user = 'YOUR_USER';
    $ldap->pass = 'YOUR_PASS';
    $ldap->dn  = "CN=Users,DC=DOMAIN,DC=COM,DC=br";
    $ldap->filter = '(sAMAccountName=YOUR_USER_NAME)';
    
    try {
        $ldap->conn = ldap_connect($ldap->host,$ldap->port);
        $ldap->bind = ldap_bind($ldap->conn, $ldap->user, $ldap->pass);
        $ldap->option[] = ldap_set_option($ldap->conn, LDAP_OPT_PROTOCOL_VERSION,3);
        $ldap->option[] = ldap_set_option($ldap->conn, LDAP_OPT_REFERRALS,0);
        $ldap->seach=ldap_search($ldap->conn,  $ldap->dn, $ldap->filter);
        $ldap->info = ldap_get_entries($ldap->conn, $ldap->seach); 
        var_dump($ldap);
    } catch (Exception $error_message) {
        throw new RuntimeErrorException($error_message);
    }
    

    【讨论】:

    • 在您的帖子中,请解释您的答案以及您发布的代码,以便此问题的访问者更容易理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多