[英]php ldap search: no such object
我是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);
除了不必要的過濾器組件CN = *,正如Terry Gardner已經指出的那樣,您的過濾器似乎是正確的。 因此,我懷疑您的代碼存在其他可能的問題:
盡可能在Active Directory中使用ldap v3協議。 這應該在綁定之前設置:
ldap_set_option( $ds, LDAP_OPT_PROTOCOL_VERSION, 3 );
我建議您也關閉ldap v3的引用處理,因為它有時會導致AD的一些奇怪行為:
ldap_set_option( $ds, LDAP_OPT_REFERRALS, 0 );
當執行這樣的搜索操作時, “無此對象”錯誤通常指的是基本DN不存在的事實。 如果沒有用戶匹配您的過濾器,則服務器將返回空結果集。
希望有所幫助!
指定的基礎對象"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
屬性的條目將符合搜索條件。 除非我弄錯了,否則User
objectClass需要cn
屬性,因此使用帶有objectClass=User
和cn=*
的&
過濾器objectClass=User
導致服務器在搜索上花費更多時間。
更新:使用LDAP瀏覽器免費版(在此處查看 )很好,因為您只需瀏覽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瀏覽器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瀏覽器中查找內容...
有任何想法嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.