我是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);
答案 0 :(得分:10)
除了Terry Gardner已经注意到的不必要的过滤器组件CN = *之外,您的过滤器似乎是正确的。因此,我怀疑您的代码存在其他可能的问题:
尽可能在Active Directory中使用 ldap v3 协议。这应该在绑定之前设置:
ldap_set_option( $ds, LDAP_OPT_PROTOCOL_VERSION, 3 );
我建议您也关闭ldap v3的推荐处理,因为它有时会导致AD出现一些奇怪的行为:
ldap_set_option( $ds, LDAP_OPT_REFERRALS, 0 );
执行这样的搜索操作时,“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浏览器中查找内容......
有什么想法吗?