2009-12-15 38 views
1

我們在Active Directory中擁有超過70,000個用戶帳戶。我需要檢查是否有人是該組的成員。代碼將在具有大量併發用戶的Web應用程序中運行。如果可能,我寧願堅持System.DirectoryServices.AccountManagement,以減少爲此應用程序編寫的代碼量。DirectoryServices.AccountManagement - 組會員檢查效率

似乎有2種通用的方法來檢查的人是否是一個成員:

  1. 使用UserPrincipal.IsMemberOf()得到一個布爾值,指示成員
  2. 使用UserPrincipal.GetGroups()獲得組成員的名單,我可以手動檢查

我想避免列舉70k用戶檢查是否有人在一個組中,所以選項2似乎更有效的面值。當我開始工作時,我可以針對兩種方法做一些測試,但我希望獲得關於這些方法在封面下的真正做法的一些信息。在我的思想中,我在正確的軌道上嗎?

關於我正在使用的庫的最後一點。如果我完全退出System.DirectoryServices.AccountManagement並編寫自己的LDAP查詢,我可以獲得更好的性能嗎?

回答

1

那麼,你可能想考慮的一件事情是讓事情變得更有效率,這是基於這樣一個事實,即組成員真正由具有作爲其成員的用戶(和組)組成的組管理。用戶的「memberOf」實際上是計算的「後退鏈接」 - 有關更多信息,請參閱此excellent article

因此,如果您需要檢查一個或兩個組中的成員身份,可能會更容易走到這些組並向其請求成員列表,並緩存這些組。評估用戶時,只需檢查他們的DN是否出現在組成員列表中的某個組中,而不會一次又一次地擊中AD。

你會做這樣的事情:

GroupPrincipal myGroup = Group.FindByIdentity(context, "myGroupName"); 

var members = myGroup.GetMembers(); 

有了這個,你應該能夠更好的表現得益於去組成員信息的緩存。嘗試一下!

+0

此方法是否處理用戶屬於所需組的成員的情況? – VoteCoffee 2014-05-19 20:18:50

+0

「優秀的文章」似乎已經移動。它可能是這樣的:http://tutorials.csharp-online.net/User_Management_with_Active_Directory%E2%80%94Determining_User_Group_Membership_in_Active_Directory_and_ADAM – mwardm 2014-06-03 15:02:34