1

私の最終的な仕事は、ユーザーの仕事用マシンに保存されている AD 資格情報を使用して、ユーザーが自分のシステムにログインするためのシングル サインオン ソリューションを実装することです。ldap_PHPの関数を使用しています。

私が抱えている問題は、資格情報を複数の OU (現時点では約 30) に対してチェックする必要があり、AD システムからそれらの OU を取得する方法が見つからないため、多数の OU があることです。応急処置として。このリストは ADexplorer で取得しました。PHPでこれを行う方法はありますか?

私の母国語は英語ではないので、Adriano にこれを翻訳してもらっていますが、ドキュメントを理解するのにも問題があります。

この段階では、基本的にldap_search manpageの例からこのコードをコピーしています。

<?php
$ds=ldap_connect($ldapserver);

// 42 OUs in our case
$dn[]='OU=ABC,DC=xyz,DC=ac,DC=uk';
$dn[]='OU=DEF,DC=xyz,DC=ac,DC=uk';
// ...

$totalDns = count($dn);
for ($i = 0; $i < $totalDns; $i++) {
    $id[] = $ds;
}

$filter = 'samaccountname='.$_POST['username'];

$result = ldap_search($id,$dn,$filter);

$search = false;

foreach ($result as $value) {
    if(ldap_count_entries($ds,$value)>0){
        $search = $value;
        break;
    }
}

if($search){
    $info = ldap_get_entries($ds, $search);
}else{
    $info = 'No results found';
}

アップデート

Vladislav Ross が提案した解決策を試してみましたが、数秒後、サーバーはこれを吐き出しました。

mod_fcgid: stderr: PHP Warning:  ldap_search() [<a href='function.ldap-search'>function.ldap-search</a>]: Search: Can't contact LDAP server in ... on line 28

特定の OU を同じ検索の先頭に追加すると、これは発生しません。もしそうならIE

$sr = ldap_search(
     $ds,
     "OU=Usuarios,dc=test,dc=com",
     "ObjectClass=organizationalUnit",
     array("")
);

それ以外の

$sr = ldap_search(
      $ds,
      "dc=test,dc=com",
      "ObjectClass=organizationalUnit",
      array("")
);

正しい結果が得られます。timelimit および sizelimit パラメータを 0 に設定しようとしましたが、結果は同じでした。私は現在、サーバー担当者と相談して、彼らの限界を確認しています。

4

3 に答える 3

2

フィルタ ObjectClass=organizationalUnit で ldap_search を使用してみてください:

    $ds = ldap_connect($AD_server);
    if(!$ds) die("cannot connect to LDAP server at $AD_server.");

    $r = ldap_bind($ds, $AD_Auth_User, $AD_Auth_PWD);
    if(!$r)
    {
        ldap_get_option($ds,LDAP_OPT_ERROR_STRING,$error);
        die("cannot bind to LDAP server at $AD_server ($error).");
    };

    $sr=ldap_search($ds,"dc=test,dc=com","ObjectClass=organizationalUnit",array(""));
    $info = ldap_get_entries($ds, $sr);

    print_r($info); //<--array with OU's you need

再帰検索が必要ない場合は、ldap_search の代わりに ldap_list を使用してください。

于 2013-01-16T14:47:58.897 に答える
1

ADシステムからこれらのOUを取得する方法が見つかりません

上記の例は、これらのOUがDC = xyz、DC = ac、DC = ukの直接の子であることを示していますか?その場合、これらを見つけるための最も効率的なLDAP検索は次のとおりです。

  • 検索ベース:DC = xyz、DC = ac、DC = uk
  • 検索範囲:1レベル <-検索ベースの直接の子
  • 検索フィルター:(objectclass = OrganizationalUnit)

次のような対応するldapsearchコマンドラインを使用してテストします...

ldapsearch -h <hostname> -s onelevel -b "DC=xyz,DC=ac,DC=uk" "(objectclass=organizationalUnit)"
于 2013-01-18T14:26:11.690 に答える
1

ドメイン内の任意のユーザーを認証したいようです。複数の DN を検索しないでください。ドメインのルートから 1 回だけ検索してください。したがって、を使用する代わりに、を'OU=ABC,DC=xyz,DC=ac,DC=uk'使用します'DC=xyz,DC=ac,DC=uk'

于 2013-01-17T14:09:51.377 に答える