2012-02-28 114 views
3

我正在查看DirectoryServices名稱空間,我試圖獲取AD中所有組的列表並將它們加載到列表框中。如何查詢所有組和組成員的Active Directory?

當我選擇一個組時,我希望它填充一個帶有管理員姓名的文本框以及另一個包含所有用戶分配給該組的列表框。我很難在這個過程中纏繞我的頭腦。有人可以幫我嗎?

如果我得到一個完整的例子,我相當肯定,我會更好地理解更大的圖景。 TIA

+1

您是否瀏覽過該參考資料:http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C# – Dan 2012-02-28 18:24:31

+0

是的,但我並不完全確定哪個那些適用於我或如何將它們應用於我的目標 – Sinaesthetic 2012-02-28 19:02:23

回答

9

如果你在.NET 3.5或更高版本上運行,你可以使用一個PrincipalSearcher和「查詢通過例如」主要做你的搜索:如果您尚未

// create your domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

// define a "query-by-example" principal - here, we search for a GroupPrincipal 
GroupPrincipal qbeGroup = new GroupPrincipal(ctx); 

// create your principal searcher passing in the QBE principal  
PrincipalSearcher srch = new PrincipalSearcher(qbeGroup); 

// find all matches 
foreach(var found in srch.FindAll()) 
{ 
    GroupPrincipal foundGroup = found as GroupPrincipal; 

    if(foundGroup != null) 
    { 
     // do whatever you need to do, e.g. put name into a list of strings or something 
    } 
} 

- 絕對看MSDN文章Managing Directory Security Principals in the .NET Framework 3.5這很好地說明如何使新功能的最佳使用System.DirectoryServices.AccountManagement

當你有一定的團體,你可以很容易地通過使用獲得其所有組成員:

// find the group in question (or load it from e.g. your list) 
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere"); 

// if found.... 
if (group != null) 
{ 
    // iterate over members 
    foreach (Principal p in group.GetMembers()) 
    { 
     Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName); 
     // do whatever you need to do to those members 
    } 
} 
2

我想出了類似的使用System.DirectoryServices.AccountManagement命名空間marc_s東西:

PrincipalContext context = new PrincipalContext(ContextType.Domain); 
GroupPrincipal queryPrincipal = new GroupPrincipal(context); 

using (PrincipalSearcher searcher = new PrincipalSearcher(queryPrincipal)) 
using (PrincipalSearchResult<Principal> allPrincipals = searcher.FindAll()) 
    foreach (GroupPrincipal groupPrincipal in allPrincipals.OfType<GroupPrincipal>()) 
    { 
     // Process group... 

     foreach (UserPrincipal userPrincipal in groupPrincipal.Members.OfType<UserPrincipal>()) 
     { 
      // Process group member... 
     } 
    } 

UserPrincipal class似乎並沒有暴露,將允許您確定用戶是否和/或擁有校董的成員,但你仍然可以做到這一點通過獲取DirectoryEntry用戶:

DirectoryEntry userEntry = userPrincipal.GetUnderlyingObject() as DirectoryEntry; 

if (userEntry != null) 
{ 
    bool isManager = userEntry.Properties["directReports"].Count > 0; 
    bool isManaged = userEntry.Properties["manager"].Count > 0; 

    // Perform further processing... 
} 

你需要一些額外的邏輯,不過,以確定用戶是否是公司的經理,你目前正在觀察,而比其他一些組織。也許檢查directReports屬性以查看包含在其中的任何用戶是否是當前組的成員。

相關問題