共用方式為


變更 Active Directory 網域服務 中的通知

Active Directory 網域服務 提供一種機制,讓用戶端應用程式向域控制器註冊以接收變更通知。 若要這樣做,用戶端會在異步LDAP搜尋作業中指定LDAP變更通知控制件。 用戶端也會指定下列搜尋參數。

參數 描述
範圍
指定LDAP_SCOPE_BASE只監視物件,或LDAP_SCOPE_ONELEVEL監視物件的直接子系,不包括物件本身。 請勿指定 LDAP_SCOPE_SUBTREE。 雖然如果基底對像是命名內容的根目錄,則子樹範圍受到支援,但其使用可能會嚴重影響伺服器效能,因為它會在每次修改命名內容中的物件時產生LDAP搜尋結果訊息。 您無法為任意子樹指定 LDAP_SCOPE_SUBTREE
篩選器
指定 「(objectclass=*)」 的搜尋篩選,這表示您會收到指定範圍中任何對象的變更通知。
屬性
指定要在發生變更時傳回的屬性清單。 請注意,在修改任何屬性時,您會收到通知,而不只是指定的屬性。

您可以在單一 LDAP 連線上註冊最多五個通知要求。 您必須有一個專用的線程,等候通知並快速處理它們。 當您呼叫 ldap_search_ext 函式來註冊通知要求時,函式會傳回識別該要求的訊息標識碼。 接著, 您可以使用 ldap_result 函式來等候變更通知。 發生變更時,伺服器會傳送LDAP訊息,其中包含產生通知之通知要求的訊息標識碼。 這會導致 ldap_result 函式傳回搜尋結果,以識別已變更的物件。

用戶端應用程式必須判斷受監視物件的初始狀態。 若要這樣做,您必須先註冊通知要求,然後讀取目前狀態。

用戶端應用程式也必須判斷變更的原因。 對於基底層級搜尋,當任何屬性變更或物件遭到刪除或移動時,就會發生通知。 對於單層搜尋,會在建立、刪除、移動或修改子物件時發生通知。 請注意,移動或重新命名目標物件上方階層中的物件不會產生通知,即使目標的辨別名稱因此變更也一樣。 例如,如果監視容器中子對象的變更,如果容器本身已移動或重新命名,您就不會收到通知。

當客戶端處理搜尋結果時,可以使用 ldap_get_dn 函式來取得已變更之對象的辨別名稱。 請勿依賴辨別名稱來識別追蹤的對象,因為辨別名稱可能會變更。 相反地,請在 要擷取的屬性清單中加入 objectGUID 屬性。 不論對象在企業樹系中移動物件的位置為何,每個物件的 objectGUID 都會保持不變。

如果刪除搜尋範圍內的物件,用戶端會收到變更通知,而且 物件的isDeleted 屬性會設定為 TRUE。 在此情況下,搜尋結果會在其分割區的 Deleted Objects 容器中報告物件的新辨別名稱。 不需要指定墓碑控件 (LDAP_SERVER_SHOW_DELETED_OID) 來取得物件刪除的通知。 如需詳細資訊,請參閱 擷取已刪除的物件

當客戶端註冊通知要求時,用戶端會繼續接收通知,直到連線中斷或客戶端藉由呼叫 ldap_abandon 函式來放棄搜尋為止。 如果客戶端或伺服器中斷連線,例如,如果伺服器失敗,則會終止通知要求。 當用戶端重新連線時,它必須再次註冊通知,然後讀取感興趣的物件目前狀態,以防用戶端中斷連線時發生變更。

用戶端可以使用物件的 uSNChanged 屬性值來判斷伺服器上物件的目前狀態是否反映用戶端已收到的最新變更。 當物件移動或修改時,系統會增加物件的 uSNChanged 屬性。 例如,如果伺服器失敗,且目錄分割區是從備份還原,則對象的伺服器複本可能不會反映先前回報給客戶端的變更,在此情況下 ,伺服器上的 uSNChanged 值會低於用戶端儲存的值。

如需詳細資訊和在異步 LDAP 搜尋作業中使用 LDAP 變更通知控件的程式代碼範例,請參閱 接收變更通知的範例程式代碼。

如需何時使用LDAP變更通知控件的詳細資訊,請參閱 變更追蹤技術概觀。