2013-04-24 107 views
1

這裏是我的問題:我需要枚舉我們的Active Directory中的某些組的成員。複雜性在於組的'membersOf'屬性中的對象的DN不包含我需要的標識符。具體來說,用戶對象的CN對我來說沒用,只有用戶對象的屬性(userID)很有用。c#LDAP的成員資格枚舉

所以三種方法浮現在腦海:

  1. 我可以先枚舉組的組中獲得的DN的列表,然後執行每個用戶DN,找出自己的userID查找

  2. 我可以列舉AD中的每個用戶,抓住他們的& membersOf集合,然後檢查他們是否具有正確的成員資格。

  3. 我可以通過他們的CNuserID來獲取所有用戶的列表,然後枚舉這些組以獲得成員CN。然後,我可以加入原始列表中的列表以獲取我的成員名單userID的。

幾個問題立刻出現 - 選項1)將產生極其大量的子查詢和擁塞的網絡流量(不希望的),以及選項2)拉動從AD數據的量巨大(類似30MB)。選項3)在道路中間 - 但它仍然拉取相當多的數據並有多個查詢。如何做到這一點沒有這些問題,還有其他選擇嗎?

我在c#中使用System.DirectoryServices工具。

預先感謝您的時間和考慮。

回答

1

也許有一個選項#4,太:

  • 你可以建立一個DirectorySearcher其中列舉的用戶
  • 你可以定義memberOf=.......作爲搜索條件之一
  • 您可以定義什麼屬性你需要從目錄搜索器非常容易

如果這項工作(和我的印象我得到這個工作之前 - 但它是相當長一段時間!),那麼你可以做一個單一的相當集中的搜索,並自動獲得你需要的信息。

嘗試這樣:

// define the "root" of your search (where to begin) 
DirectoryEntry searchRoot = new DirectoryEntry("LDAP://cn=users,dc=yourcompany,dc=com"); 

DirectorySearcher searcher = new DirectorySearcher(searchRoot); 

// set properties 
searcher.SearchScope = SearchScope.Subtree; 

// define search filter 
searcher.Filter = "(&(objectCategory=Person)(memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))"; 

// define attributes to load 
searcher.PropertiesToLoad.Add("userid"); 
... add more if needed ..... 

foreach(SearchResult entry in searcher.FindAll()) 
{ 
    string userid = entry.Properties["userid"][0].ToString(); 
}