Active Directory Domain Servicesの変更通知
Active Directory Domain Servicesは、クライアント アプリケーションがドメイン コントローラーに登録して変更通知を受信するためのメカニズムを提供します。 これを行うために、クライアントは非同期 LDAP 検索操作で LDAP 変更通知制御を指定します。 クライアントは、次の検索パラメーターも指定します。
パラメーター | 説明 |
---|---|
スコープ |
LDAP_SCOPE_BASE を指定してオブジェクトのみを監視するか、LDAP_SCOPE_ONELEVEL を指定してオブジェクト自体を含まないオブジェクトの直接の子をモニターします。 LDAP_SCOPE_SUBTREEは指定しないでください。 サブツリーのスコープは、基本オブジェクトがネーミングコンテキストのルートである場合にサポートされますが、ネーミングコンテキスト内のオブジェクトが変更されるたびにLDAP検索結果メッセージが生成されるため、サブツリー・スコープを使用すると、サーバーのパフォーマンスに重大な影響を与える可能性があります。 任意のサブツリーにLDAP_SCOPE_SUBTREEを指定することはできません。 |
Assert |
検索フィルタを "(objectclass=*)" に指定すると、指定したスコープ内のオブジェクトに対する変更の通知を受信します。 |
属性 |
変更が発生したときに返す属性のリストを指定します。 通知は、指定した属性だけでなく、属性が変更されたときにも受信されることに注意してください。 |
1 つの LDAP 接続で最大 5 つの通知要求を登録できます。 通知を待機し、迅速に処理する専用スレッドが必要です。 ldap_search_ext 関数を呼び出して通知要求を登録すると、関数はその要求を識別するメッセージ識別子を返します。 次に、ldap_result 関数を使用して変更通知を待機します。 変更が発生すると、サーバーは、通知を生成した通知要求のメッセージ識別子を含む LDAP メッセージを送信します。 これにより、ldap_result 関数は、変更されたオブジェクトを識別する検索結果を返します。
クライアント アプリケーションは、監視対象のオブジェクトの初期状態を判断する必要があります。 これを行うには、まず通知要求を登録してから、現在の状態を読み取る必要があります。
クライアント アプリケーションでは、変更の原因も特定する必要があります。 基本レベルのサーチでは、属性が変更されたとき、またはオブジェクトが削除または移動されたときに通知が発生します。 1 レベル検索の場合、子オブジェクトが作成、削除、移動、または変更されると通知が発生します。 ターゲットオブジェクトの上の階層内のオブジェクトを移動または名前変更しても、結果としてターゲットの識別名が変更されても、通知は生成されないことに注意してください。 たとえば、コンテナー内の子オブジェクトに対する監視の変更の場合、コンテナー自体が移動または名前変更されても通知は受信されません。
クライアントは、検索結果を処理するときに、ldap_get_dn 関数を使用して、変更されたオブジェクトの識別名を取得できます。 識別名は変更される可能性があるため、追跡対象のオブジェクトの識別に識別名を使用しないでください。 代わりに、取得する属性の一覧に objectGUID 属性を含めます。 各オブジェクトの objectGUID は、エンタープライズ フォレスト内のどこにオブジェクトが移動されても変更されません。
検索範囲内のオブジェクトが削除されると、クライアントは変更通知を受け取り、オブジェクトの isDeleted 属性が TRUE に設定されます。 この場合、検索結果には、そのパーティションの [削除済みオブジェクト] コンテナー内のオブジェクトの新しい識別名が報告されます。 オブジェクト削除の通知を受け取るために廃棄コントロール LDAP_SERVER_SHOW_DELETED_OIDを指定する必要はありません。 詳細については、削除されたオブジェクトの取得を参照してください。
クライアントが通知要求を登録すると、接続が切断されるか、クライアントが ldap_abandon 関数を呼び出して検索を中止するまで、クライアントは通知を受信し続けます。 クライアントまたはサーバーが切断された場合 (たとえば、サーバーに障害が発生した場合)、通知要求は終了します。 クライアントが再接続すると、通知に再度登録し、クライアントが切断されている間に変更があった場合に備えて、対象のオブジェクトの現在の状態を読み取る必要があります。
クライアントは、オブジェクトの uSNChanged 属性の値を使用して、サーバー上のオブジェクトの現在の状態が、クライアントが受信した最新の変更を反映しているかどうかを判断できます。 システムは、オブジェクトが移動または変更されると、オブジェクトの uSNChanged 属性を増やします。 たとえば、サーバーに障害が発生し、ディレクトリ パーティションがバックアップから復元された場合、サーバーのオブジェクトのレプリカには、以前にクライアントに報告された変更が反映されない可能性があり、その場合、サーバー上の uSNChanged 値は、クライアントによって格納された値よりも低くなります。
詳細と、非同期 LDAP 検索操作で LDAP 変更通知コントロールを使用するコード例については、変更通知を受信するためのコード例を参照してください。
LDAP 変更通知コントロールを使用する状況の詳細については、変更追跡手法の概要を参照してください。