使用 USNChanged 輪詢變更
DirSync 控件功能強大且有效率,但有兩個重大限制:
- 僅適用於高度特殊許可權的應用程式:若要使用 DirSync 控件,應用程式必須在具有域控制器SE_SYNC_AGENT_NAME許可權的帳戶下執行。 很少有帳戶具有很高的許可權,因此一般用戶無法執行使用 DirSync 控件的應用程式。
- 沒有子樹範圍:DirSync 控制項會傳回命名內容內發生的所有變更。 應用程式只對命名內容之小型子樹狀結構中發生的變更感興趣,必須經過許多無關緊要的變更,這對應用程式和域控制器而言都效率不佳。
您也可以透過查詢 uSNChanged 屬性來取得 Active Directory 的變更,以避免 DirSync 控制件的限制。 此替代方法並不優於所有方面的 DirSync 控件,因為它牽涉到在任何屬性變更時傳輸所有屬性,而且需要應用程式開發人員有更多工作才能正確處理特定失敗案例。 目前,這是撰寫特定變更追蹤應用程式的最佳方式。
當域控制器修改物件時,會將該物件的 uSNChanged 屬性設定為大於該物件上 uSNChanged 屬性值的值,而且大於該域控制器上保留之所有其他物件的 uSNChanged 屬性目前值。 因此,應用程式可以在域控制器上尋找最近變更的物件,方法是尋找具有最大 uSNChanged 值的物件。 域控制器上最近變更的第二個物件會有第二大 uSNChanged 值,依序顯示。
不會復寫 uSNChanged 屬性,因此在兩個不同的域控制器上讀取物件的 uSNChanged 屬性通常會提供不同的值。
例如, uSNChanged 屬性可用來追蹤子樹 S 中的變更。首先,執行子樹 S 的「完整同步處理」假設 S 中任何物件的最大 uSNChanged 值為 U。定期查詢子樹 S 中 uSNChanged 值大於 U 的所有物件。查詢會傳回自完整同步處理后已變更的所有物件。將您設定為這些已變更物件中最大的 uSNChanged ,且您已準備好再次輪詢。
實作 uSNChanged 同步處理應用程式的細微之處包括:
使用 rootDSE 的最高CommittedUSN 屬性來系結 uSNChanged 篩選條件。 也就是說,開始完整同步處理之前,請先讀取 您附屬域控制器的最高CommittedUSN 。 然後,執行完整同步處理查詢(使用分頁結果)來初始化資料庫。 完成時,儲存完整同步查詢之前讀取的最高CommittedUSN 值;以做為下一次同步處理之 uSNChanged 屬性的下限。 稍後若要執行累加同步處理,請重新讀取 最高CommittedUSN rootDSE 屬性。 然後使用分頁結果查詢相關物件,其 uSNChanged 大於從先前同步處理儲存的 uSNChanged 屬性值下限。 使用這項資訊更新資料庫。 完成時,請從累加同步處理查詢之前讀取的最高CommittedUSN 值更新 uSNChanged 屬性的下限。 一律將 uSNChanged 屬性值的下限儲存在應用程式與域控制器內容同步處理所在的相同記憶體中。
遵循此程式,而不是根據 所擷取物件的 uSNChanged 值,避免讓伺服器重新檢查落在適用於應用程式的集合外部的更新物件。
因為 uSNChanged 是非復寫的屬性,所以應用程式每次執行時都必須繫結至相同的域控制器。 如果它無法系結至該域控制器,它必須等到它才能這麼做,或與某些新的域控制器建立關聯,然後與該域控制器執行完整同步處理。 當應用程式聯盟與域控制器一起時,它會在穩定記憶體中記錄該域控制器的 DNS 名稱,這是與域控制器內容保持一致的相同記憶體。 然後,它會使用預存的 DNS 名稱來系結至相同的域控制器,以進行後續的同步處理。
應用程式必須偵測它目前隸屬於的域控制器何時已從備份還原,因為這可能會導致不一致。 當具有域控制器的應用程式聯盟快取穩定記憶體中該域控制器的「調用標識符」時,也就是它與域控制器內容保持一致的相同記憶體。 域控制器的「調用標識碼」是儲存在 域控制器服務物件的invocationID 屬性中的 GUID。 若要取得域控制器服務對象的辨別名稱,請閱讀 rootDSE 的 dsServiceName 屬性。
請注意,從備份還原應用程式的穩定記憶體時,沒有任何一致性問題,因為域控制器名稱、調用標識碼和 uSNChanged 屬性值的下限會與與域控制器內容同步的數據一起儲存。
在查詢伺服器時使用分頁,同時進行完整和增量同步處理,以避免同時擷取大型結果集的可能性。 如需詳細資訊,請參閱 指定其他搜尋選項。
執行以索引為基礎的查詢,以避免在使用分頁結果時強制伺服器儲存大型中繼結果。 如需詳細資訊,請參閱 索引屬性。
一般而言,請勿使用伺服器端排序搜尋結果,這可強制伺服器儲存和排序大型中繼結果。 這同時適用於完整和增量同步處理。 如需詳細資訊,請參閱 指定其他搜尋選項。
正常處理任何父條件。 應用程式可以在辨識其父代之前辨識物件。 視應用程式而定,這可能或可能不是問題。 應用程式一律可以從目錄讀取父系的目前狀態。
若要處理移動或刪除的物件,請儲存 每個追蹤物件的 objectGUID 屬性。 不論對象在樹系中移動的位置為何,物件的 objectGUID 屬性都會保持不變。
若要處理移動的物件,請執行定期的完整同步處理,或增加搜尋範圍,並在客戶端篩選出不感興趣的變更。
若要處理已刪除的物件,請在執行累加同步處理時執行定期完整同步處理,或執行個別搜尋已刪除的物件。 當您查詢已刪除的物件時,擷取 已刪除物件的 objectGUID ,以判斷要從資料庫刪除的物件。 如需詳細資訊,請參閱 擷取已刪除的物件。
請注意,搜尋結果只包含呼叫端有權讀取的對象和屬性(根據各種物件的安全性描述項和 DACL)。 如需詳細資訊,請參閱 安全性對查詢的影響。
如需詳細資訊,以及顯示USNChanged同步處理應用程式基本概念的程式代碼範例,請參閱 使用USNChanged擷取變更的範例程序代碼。