LDAP搜索多个服务器和域(PHP)

时间:2015-12-07 13:43:01

标签: php ldap

所以我试图用PHP和LDAP搜索AD用户名。但是,有多个服务器和多个域。我想出了如何使登录顺利进行,至少我测试过。但是,搜索功能有点困难。

        $Servers = $LDAP['LDAPSrvs'];
        $Domains = $LDAP['LDAPDoms'];

        $sLoop = 0;
        $dLoop = 0;

        foreach($Servers as $Server)
        {
            $sLoop++;

            $connect = 'ldap://'.$Server;
            $lcon = ldap_connect($connect);

            ldap_set_option($lcon, LDAP_OPT_PROTOCOL_VERSION, 3);
            ldap_set_option($lcon, LDAP_OPT_NETWORK_TIMEOUT, 1);

            $bind = ldap_bind($lcon, $LDAP['LDAPUser'], $LDAP['LDAPPass']);

            if($bind)
            {
                $search = ldap_search($lcon, $DN, "(sAMAccountName=$username)");

                if($search)
                {
                    $info = ldap_get_entries($lcon, $search);
                    echo var_export($info);
                    if(count($info) >= 1)
                        break;
                } else {
                    new MessageHandler('No users were found.', 'INFO');
                }
            }
            else
            {
                new MessageHandler('Something went wrong.', 'ERR');
            }
        }
        @ldap_close($lcon);

上面的代码就是我用来搜索的内容。但是,它会产生很大的延迟,即使是服务器/ DN中的错误,它也没有找到任何具有该用户名的用户。

我对LDAP和PHP的经验非常有限,所以我真的不知道如何解决这个问题。我总是通过尝试和失败来解决问题,所以最终我可能会找到一个有效的黑客。但是,如果有人可以通过向我解释如何做到这一点来帮助我,我将不胜感激!

1 个答案:

答案 0 :(得分:0)

您可以使用ldap_count_entries()从服务器获取快速倒计时,以查看是否找到了某些内容。这可能比首先检索搜索结果并看到其中没有任何内容更快。

所以它可能看起来像这样:

foreach($Servers as $Server) {
    $sLoop++;

    $connect = 'ldap://'.$Server;
    $lcon = ldap_connect($connect);

    ldap_set_option($lcon, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($lcon, LDAP_OPT_NETWORK_TIMEOUT, 1);
    ldap_set_option($lcon, LDAP_OPT_REFERRALS, 0);

    $bind = ldap_bind($lcon, $LDAP['LDAPUser'], $LDAP['LDAPPass']);

    if(! $bind) {
        new MessageHandler('Something went wrong.', 'ERR');
        continue;
    }

    $search = ldap_search($lcon, $DN, "(sAMAccountName=$username)");

    if (ldap_count_entries($lcon, $search) < 1) {
        new MessageHandler('No Users found.', 'ERR');
        continue;
    }

    $info = ldap_get_entries($lcon, $search);
    echo var_export($info);

    @ldap_close($lcon);
}

我不确定它是否会加速。

您还可以在循环中的某处添加类似echo microtime();的内容,以查看某些服务器的响应速度是否比其他服务器慢。