web-dev-qa-db-ja.com

PHP)のopenLDAPからすべての可能な属性とすべてのobjectClassesを取得します

LDAPエディターをPHPで作成する必要があります。 LDAPは、ストアネットワークデバイス(スイッチ、AP、..)に使用されます。それで、それは通常の機能ではなく、私は多くの問題を見つけました。最大の問題は次のとおりです。

データベースからすべてのobjectClassesと、指定されたobjectClassのすべての属性を読み取ることは可能ですか?

すべての返信をありがとう! Ajax

13
Ajax

何故なの?

サーバーごとに、すべてのオブジェクトクラスと属性タイプで構成されるサブスキーマエントリがあります。 (ADを含む)

ただし、サブスキーマエントリdnは実装ごとに異なる場合があります。これは、rootDSE属性「subschemasubentry」から検索できます。

-AD example-
ldapsearch -s base -b "" -D cn=Administrator,cn=users,dc=domain,dc=com -w 'password' -x -h 192.168.3.10 objectClass=* subschemasubentry

**OUTPUT:**
dn:
subschemaSubentry: CN=Aggregate,CN=Schema,CN=Configuration,DC=domain,DC=com


-OpenLdap example-
ldapsearch -s base -b "" -D cn=Administrator,dc=capua,dc=com -w password -x -h 192.168.3.11 subschemaSubentry 

**OUTPUT:**
#
dn:
objectClass: top
objectClass: OpenLDAProotDSE
subschemaSubentry: cn=Subschema

また、検索範囲にも注意してください。 BASE_LEVELである必要があります。そうでない場合、結果は返されません。

この後、サブスキーマでオブジェクトクラスと属性タイプを検索します。

ldapsearch -s base -b "cn=subschema" -D cn=Administrator,dc=capua,dc=com -w password -x -h 192.168.3.11  objectclass=subschema objectclasses attributetypes

これにより、すべてのオブジェクトクラスと属性タイプが文字列として返されます。特定のオブジェクトクラスの属性のリストをクエリするオプションはありません。保存されているすべてのオブジェクトクラスと属性のldif出力のみを取得できます。おそらく、パーサーを作成するか、それが機能する場合はldifオブジェクトを作成できます。ただし、ADの場合は、cn = Schema、cn = configurationを直接クエリすることで柔軟性がほとんどない可能性があります。

Phpコードを見てください。 $ ldが接続されていると仮定します。一部のディレクトリサーバーでは、サブスキーマでの匿名読み取りが許可されています。この場合、バインドする必要はありません。

  //Get the subschema dn from rootDSE
  $search = ldap_read($ld, "", "objectclass=*", array('*', 'subschemasubentry'));
  $entries = ldap_get_entries($ld, $search);
  $schemadn = $entries[0]["subschemasubentry"][0];

  print "Searching ". $schemadn . "<br/>";

  // Read all objectclass, attributetype from subschema
  $schsearch = ldap_read($ld, $schemadn, "objectClass=subSchema", array('objectclasses', 'attributetypes'));
  $schentries = ldap_get_entries($ld, $schsearch);

  $count = $schentries[0]["attributetypes"]["count"];

  print "Printing all attribute types <br/>";
  for ($i=0; $i<$count; $i++)
     print $schentries[0]["attributetypes"][$i] . "<br/>";


  $count = $schentries[0]["objectclasses"]["count"];

  print "Printing all objectclasses <br/>";
  for ($i=0; $i<$count; $i++)
     print $schentries[0]["objectclasses"][$i] . "<br/>";
20
kalyan

おそらく、 Zend Framework のLDAPコンポーネントであるZend_Ldapを確認する必要があります。これにより、OpenLDAPサーバーおよびOpenLDAPと互換性のあるサーバーのスキーマイントロスペクションが可能になります。コードは、これを行う方法に関するいくつかのヒントを提供する場合があります。

Active Directoryサーバーは、ページングがサポートされていないため、ext/phpで取得できない形式でスキーマ情報を格納するため、この手順は実行できないことに注意してください。

1
Stefan Gehrig