2008-09-17 40 views
4

我有一個Active Directory同步工具(.NET 2.0/C#)寫成,我已經工作了一段時間,最近一個Windows服務一直負責根據團體成員的變化增加推動活動的能力。基本情況是用戶與安全數據庫同步,並且當組成員變化時,用戶需要改變他們的訪問權限(即,如果我現在是「IT員工」的成員,那麼我應該自動接收服務器機房,如果我從該組中刪除,那麼我應該自動失去對服務器機房的訪問權限)。監測組成員

問題是,當針對組收到已加入/刪除成員的組時,當您抓取成員列表時,您將收到該組中所有成員的列表只是已添加或刪除的成員。這導致我相當有效率的問題 - 即爲了知道用戶是否已被添加或刪除,我將不得不在本地保存每個組和所有成員的列表,並將其與當前列表進行比較,以查看誰已被添加(不在本地列表中)以及誰已被刪除(在本地列表中,不在當前成員列表中)。

我辯論只是存儲組成員的詳細信息,在內存中的數據集,我已經處理新成員的變化,每次寫入磁盤。這樣,如果服務停止/崩潰或重新啓動計算機,我仍然可以通過比較磁盤上的最新信息與當前組成員列表中的最新信息,來獲得安全數據庫中Active Directory的當前狀態。然而,這看起來非常低效 - 通過組中的每個成員運行以與數據集中的數據進行比較,然後在每次列表發生更改時將更改寫入磁盤。

有沒有人處理之前,這一幕?有沒有找到某種方法可以檢索到只有三角組的成員?在這種情況下你會做什麼來確保你不會錯過任何改變,同時儘可能降低性能?

編輯:廣告可能包含500個用戶,它可能包含20萬個用戶 - 這取決於客戶,而最重要的是普通用戶多少組是

+0

你有沒有得到最好的模式和練習高效訪問AD? – Kiquenet 2016-02-16 08:10:37

回答

1

成員,我會說這取決於你需要追蹤多少個活動目錄對象。如果數量很少(少於1000個用戶),則可以將狀態數據序列化到磁盤上,但幾乎不會導致性能下降。如果你處理的對象數量非常多,那麼在SQL Express之類的東西中創建一個簡單的持久性模式並使用它可能會更有效率。

2

您可以設置審覈帳戶修改組策略編輯器中成功

然後,您可以監視項安全日誌和處理服務器的登錄帳戶修改條目。

E.g.

 EventLog myLog = new EventLog("Security"); 

     // set event handler 
     myLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten); 
     myLog.EnableRaisingEvents = true; 

請確保您有權限來存取權限安全事件日誌 http://support.microsoft.com/kb/323076

1

你知道有哪些幫助您與目錄同步和用戶配置(谷歌這些條款)的產品呢?不是在這裏和所有這些發明,你可能需要證明對當前環境的投資是合理的,但開發和維護已有商業解決方案的代碼並不是,我們說,總是在長期內最具成本效益的方式跑。

不是所有的支持事件/供應,但他們確實支持跟蹤更改並分發它們:在這些功能之上創建事件解決方案並不是什麼大事。

Microsoft已將Identity Integration Server(MISS)重新打包爲Identity Lifecycle Manager的一部分。它最初建立在更一般的元數據/主數據管理產品上,但是可行。 IBM擁有Tivoli Directory Integrator(但是您需要跟上雙倍的名稱更改!)。 Oracle有Oracle Identity Manager,Sun有Identity Manager。其中大多數是主要參與者爲了彌補其投資組合缺口而購買的主要產品。

當然,這些都是企業級產品,這意味着很大的昂貴的,但通常是相當安全和可擴展的。如果你不需要他們的全部力量(但!),你需要考慮爲自己存儲一份副本。在那種情況下,你是否考慮過使用AD LDS(以前的AD/AM)存儲最後一個已知AD樹的副本?它並不是一個用於比較差異的最佳格式,但是目錄數據庫可以很好地擴展,即使是輕量級也是如此。