2009-04-02 14 views
3

私は、LDAPディレクトリのユーザーを検索するためのC++/Win32コードを作成しています(本当にユーザー名/パスワードが正しいかどうかを検証し、グループメンバーシップを確認する必要があります)。私は、ユーザー名を持っているので、私は次のようなものが動作します願っています:検索用の汎用LDAPベース?

(&(objectCategory=person)(objectClass=user)(uid={username})) 

私は、この検索/フィルタでldap_searchを呼び出すと、私は、検索を開始するベースを(ノード/ OU /何でも)提供する必要があります。しかし、私はどこで検索を始めるべきかわかりません - 私が持っているのはユーザー名だけです。 OpenLDAP、Active Directory、Netscape LDAPなどで動作するツリーのルートを指定する方法はありますか?

また、これにはおそらく役立つ可能性がある:uid属性が普遍的にサポートされているか、私が話しているLDAPサーバーのブランドに応じて別の属性を検索する必要がありますか? (私はuidCN、さらにはSAMAccountNameで検索する必要がある人々への参照を見てきました。

答えて

5

包括的に検索ベースの検索についてのあなたの最初の質問について:。。

すべてのLDAPディレクトリサーバ(と思うLDAPプロトコルに準拠)をいくつかの操作鮫を公開RootDSEというノードの下にあります。RootDSEで取得できるものの1つはnamingContextsこれは本質的に、このサーバー上で異なるツリーがホストされていることを伝えることができます。

これで、ユーザー名検索のトップレベルの検索ベースを取得できます。 注意:いくつかのLDAP(OpenLDAPなど)サーバは複数のツリーをホストできるため、複数のネーミングコンテキストが見つかった場合には解決策が必要です。

でrootDSEはあなたにも、すべての運用属性を取得したいDN「」(空の文字列)とspecifiyngのためのサーバーを照会することによって取得することができます。 OpenLDAPサーバーの例:

ldapsearch -H ldap://ldap.mydomain.com -x -s base -b "" + 
# note the + returns operational attributes 

これは、次のようなものです(OpenLDAP 2.4より)。8) - 括弧内の値は説明を追加され、サーバーから返されていません。http://www.zytrax.com/books/ldap/ch3/#operationalから

dn: 
structuralObjectClass: OpenLDAProotDSE 
configContext: cn=config 
namingContexts: dc=example,dc=com 
namingContexts: dc=example,dc=net 
monitorContext: cn=Monitor 
supportedControl: 1.3.6.1.4.1.4203.1.9.1.1 (Contentsync RFC 4530) 
[...] 
supportedExtension: 1.3.6.1.4.1.4203.1.11.1 (ModifyPassword RFC3088) 
[...] 
supportedFeatures: 1.3.6.1.1.14 (Modify-Increment RFC4525) 
[...] 
supportedLDAPVersion: 3 
supportedSASLMechanisms: NTLM 
[...] 
entryDN: 
subschemaSubentry: cn=Subschema 


uid属性の利用可能性についてのあなたの2番目の質問について:

私は、ユーザーデータを格納するために使用されるスキーマに強く依存しているため、これに頼るべきではないと考えています(ほとんどのユーザースキーマクラスはuid属性と思います)。しかし、それはあなたのプログラムに入れたい柔軟性に依存します。おそらく、最善の方法は、エンドユーザがユーザフィルタ文字列を設定できるようにすることです(検索ベースでこれを行うこともできます。これはパフォーマンス上の利点があります。小さなサブツリーとRootDSEを照会する必要はありません))。

+0

+1 "operatively thingies"というフレーズの使用については、 –

0

あなたは内検索を開始するためにどのようなコンテナを定義する必要があるので、これは

_ADSPathは、サーバのホスト名/ IPである
"LDAP://" + _ADSPath + ":" + _ADSPort + "/" + _ADSRootContainer 

ようなものになるだろう。 _ADSPortはポート番号です(通常はデフォルトで389)。 _ADSRootContainerはコンテナへの残りのパスです(ou = Usersのように) パスは検索対象の実装に依存します。ユーザを保持するコンテナよりも高いレベルで起動し、検索オブジェクトのパラメータをマルチレベルの検索を使用しますが、それははるかに遅くなります

2

私は、LDAPのユーザーエントリの適切な検索属性であるuidに依存しません。多くの企業では、employeeIDがLDAP DIT内で一意であることのみを保証します。

関連する問題