8

我是 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);
4

3 回答 3

11

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

  1. 您使用的用户名格式不正确。尝试使用login@energia.siseENERGIA\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 );

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

希望有帮助!

于 2013-03-04T00:32:40.307 回答
5

指定的基础对象"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属性的条目将匹配搜索条件。除非我弄错了,否则objectClasscn需要该属性,因此使用两者的过滤器只会导致服务器在搜索上花费更多时间。User&objectClass=Usercn=*

也可以看看

于 2013-02-27T11:05:04.120 回答
1

更新

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

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

问题 1

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

  • 解决方案:按照上面的建议在绑定之前添加以下行:

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

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

问题 2

  • 问题 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 浏览器中查找这些内容...

有任何想法吗?

于 2015-03-09T17:34:42.607 回答