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

Terry Gardnerがすでに指摘したように、不要なフィルターコンポーネントCN = *を除いて、フィルターは正しいようです。そのため、コードに問題がある可能性が他にもあると思います。

  1. 使用しているユーザー名の形式が正しくありません。login@energia.siseまたはENERGIA\loginでバインドしてみてください。
  2. コンテナ「OU=users、OU = nej、DC = energia、DC=sise」は存在しません。ドメイン全体(「DC = energia、DC = sise」)で検索して、結果が得られるかどうかを確認してください。
  3. 可能な限り、ActiveDirectoryでldapv3プロトコルを使用してください。これは、バインドする前に設定する必要があります。

    ldap_set_option( $ds, LDAP_OPT_PROTOCOL_VERSION, 3 );

  4. ldap v3の参照処理もオフにすることをお勧めします。これにより、ADに奇妙な動作が発生することがあります。

    ldap_set_option( $ds, LDAP_OPT_REFERRALS, 0 );

このような検索操作を行う場合、「そのようなオブジェクトはありません」というエラーは、通常、ベース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=*するため、検索時間が長くなります。つまり、属性を含むエントリが検索条件に一致することを意味します。私が間違っていない限り、この属性はobjectClass で必要とされるため、 と の両方でフィルターを使用すると、サーバーが検索により多くの時間を費やすだけになります。cn=*cncnUser&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 Free Edition を使用して、すべてが機能していることを確認しています...

これは私のコードです:

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 に答える