このトピックで検索しましたが、特定の属性が存在しないエントリを返すフィルターのみが見つかりました。
(!(manager=*))
ただし、属性は存在するが、null値(つまり、空/空の文字列)を持つエントリを検索したいです。 LDAPフィルターを使用してこれを行うことはできますか?
編集:
確認のため、上記のフィルターは属性のないエントリを検索しますが、属性が空(null文字列)のエントリは検索しません。
これはLDAPの実装に依存していますか?
LDAPには、空の文字列を決定するクエリメソッドはありません。
LDAPの空の値またはnull値はまったく値ではないため、LDAPへのデータ入力をスクラブすることをお勧めします。
これを判別するには、値(manager = *)を使用してすべてを照会し、コードを使用して「スペース」またはヌル値であるものを判別する必要があります。
また、Terryが言ったように、DN構文の属性に空またはnull値を格納するのは間違っています。
一部のLDAPサーバー実装では、DNエントリが存在しないDNの入力が許可されません。
おそらく、DNが一貫している場合は、次のようなものを使用できます。
(&(!(manager=cn*))(manager=*))
これにより、managerの値があり、「cn」で始まっていないマネージャーの値が返されます。
ただし、一部のLDAP実装では、DN構文属性のサブストリング検索が許可されません。
-ジム
\00
を使用してnull値を検索します
例えば:
ldapsearch -D cn=admin -w pass -s sub -b ou=users,dc=acme 'manager=\00' uid manager
OSシェルがNULL文字をLDAPに送信しないように、コマンドラインでNULL値を使用して引用符を使用していることを確認してください。たとえば、これは機能しません。
ldapsearch -D cn=admin -w pass -s sub -b ou=users,dc=acme manager=\00 uid manager
他の特殊文字とともに、これを参照するさまざまなサイトがあります。例:
この記事 http://technet.Microsoft.com/en-us/library/ee198810.aspx は、私を解決に導きました。唯一の変更は感嘆符の配置です。
(!manager=*)
望みどおりに機能しているようです。
ManagedBy値セット(空ではない)を持つすべてのグループを取得するクエリを実行する必要がありましたが、これによりいくつかの素晴らしい結果が得られました。
(!(!managedBy=*))
属性のスキーマ定義は、属性に値が必要かどうかを決定します。指定された例のmanager
属性が RFC4524 with OID 0.9.2342.19200300.100.1.10
、その属性はDN構文を持ちます。 DN構文は相対的な識別名のシーケンスであり、は空であってはなりません。この例で指定されたフィルターは、LDAPディレクトリサーバーが検索結果でLDAPクライアントにmanager
属性を持たないエントリのみを返すようにするために使用されます。
意味的には、LDAPのこれらのケースに違いはありません。