php ldap search:没有这样的对象

时间:2013-02-27 09:52:49

标签: php active-directory ldap

我是LDAP的新手,所以我会尝试正确解释 我有一个主机名"energia.sise"

我需要获取位于energia.sise/nej/users

的所有用户 你能告诉我怎么做吗?

在这段代码中,我试图根据我的电子邮件获取记录,但是它有错误 警告:ldap_search():搜索:没有此类对象

     $base_dn ="OU=users, OU=nej, DC=energia, DC=sise";
     $ds = ldap_connect("energia.sise") or die("Невозможно соединиться с $ldaphost");

     ldap_bind($ds, "login@energia", "password");

     $filter = '(&(objectClass=user)(CN=*)(mail=kosmos*))';

     $sr = ldap_search($ds, $base_dn, $filter);
     $info = ldap_get_entries($ds, $sr);

3 个答案:

答案 0 :(得分:10)

除了Terry Gardner已经注意到的不必要的过滤器组件CN = *之外,您的过滤器似乎是正确的。因此,我怀疑您的代码存在其他可能的问题:

  1. 您使用的用户名格式不正确。尝试使用 login@energia.sise ENERGIA \ login 绑定。
  2. 容器“OU = users,OU = nej,DC = energia,DC = sise”不存在。尝试在整个域中搜索 - “DC = energia,DC = sise”,看看你是否得到任何结果。
  3. 尽可能在Active Directory中使用 ldap v3 协议。这应该在绑定之前设置:

    ldap_set_option( $ds, LDAP_OPT_PROTOCOL_VERSION, 3 );

  4. 我建议您也关闭ldap v3的推荐处理,因为它有时会导致AD出现一些奇怪的行为:

    ldap_set_option( $ds, LDAP_OPT_REFERRALS, 0 );

  5. 执行这样的搜索操作时,“No such object”错误通常是指基本DN不存在的事实。如果没有用户匹配您的过滤器,服务器将返回一个空结果集。

    希望有所帮助!

答案 1 :(得分:4)

指定的基础对象"OU=users, OU=nej, DC=energia, DC=sise"不存在。基础对象是搜索开始的点 - 除了one-level搜索的情况之外,在搜索结果中只返回基础对象或其下的条目,在这种情况下不返回基础对象。

在编写代码之前,请使用ldapsearch之类的已知良好工具来确定所需的请求参数是否正确:

ldapsearch -h energia.sise -p port-number \
     -D login@energia -w password \
     -b ou=users,ou=nej,dc=energia,dc=sise -s sub \
     '(&)' 1.1

如果上面显示错误,指示基础对象不存在,则找到正确的基础对象,然后重试。

作为旁注,与基础对象不存在的问题无关,过滤器组件cn=*不是必需的,并且会导致搜索时间增加,因为cn=*当前过滤器,表示包含cn属性的条目将与搜索条件匹配。除非我弄错了,cn objectClass需要User属性,因此使用同时&objectClass=User的{​​{1}}过滤器不会导致服务器要花更多时间在搜索上。

另见

答案 2 :(得分:1)

更新:使用LDAP浏览器免费版(查看here)非常好,因为您只需浏览LDAP服务器,它可以帮助您了解是否可以绑定匿名等等等,但最大的好处是获得DN(复制和粘贴)。之后我能够读取数据。

我遇到了以下问题,这就是我的解决方法:

问题1:即使我可以通过LDAP浏览器软件匿名连接也无法绑定

解决方案:在绑定之前添加以下行,如上所示:

ldap_set_option( $ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3 );
ldap_set_option( $ldapconn, LDAP_OPT_REFERRALS, 0 );

在此之后,我能够绑定......

问题2:无法搜索...

解决方案:打开LDAP浏览器。检查连接以确保您可以连接到LDAP服务器。浏览示例记录。右键单击并转到属性并复制DN并将其替换为代码,就是这样!

原帖如下所示:

我似乎无法搜索,我正在使用LDAP Browser 4.5免费版以确保一切正常......

这是我的代码:

function ldap_anon_connect($ein){

    $ldaphost = "ldap://link_to_ldap.com";

    //create a connection to ldap server
    $ldapconn = ldap_connect($ldaphost) or die("Couldn't connect to " .$ldaphost);
        if ($ldapconn) {

            ldap_set_option( $ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3 );
            ldap_set_option( $ldapconn, LDAP_OPT_REFERRALS, 0 );

            $ldapbind = ldap_bind($ldapconn);
            if ($ldapbind) {

                // if binds, look some stuff up
                $info = ldap_annon_get_profile($ein, $ldapconn);
                return $info;
             } 
             else{
                echo "Invalid EIN. Please Try again";
                die();
             }

    }

}

function ldap_annon_get_profile($ein, $ldapconn){

        $filter = "(cn=".$ein.")";

    $justthese = array(
                                "cn","sn","givenName","displayName","mail","EmployeeClass","ManagerEIN",
                                "mobile","title","c","PersonalTitle"
                );

                $sr = ldap_search($ldapconn, "o=CO,ou=COplc,ou=people", $filter, $justthese);
                        $info = ldap_get_entries($ldapconn, $sr);

                        return $info;

    }

我已经仔细检查了我的DN =“o=CO,ou=COplc,ou=people”这是正确的字符串,因为我可以在LDAP浏览器中查找内容......

有什么想法吗?