2012-02-28 13 views
3

私はDirectoryServices名前空間を見ています。私はAD内のすべてのグループのリストを取得し、リストボックスにロードしようとしています。Active Directoryにすべてのグループおよびグループメンバーを照会する方法は?

グループを選択すると、そのグループに割り当てられたすべてのユーザーを含む別のリストボックスと同様に、マネージャー名のテキストボックスを入力する必要があります。私はそのプロセスの回りに頭を抱えて苦労している。誰かが私を助けてくれますか?

私がこれの完全な例を得たならば、もっと大きな画像をもっとよく理解することができます。 TIA

+1

この参照を閲覧しましたか?:http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C# – Dan

+0

はい、私は正確にはわかりません私に当てはまるもの、または私の目標にそれらを適用する方法 – Sinaesthetic

答えて

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 
    } 
} 

あなたがまだの場合

// 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 
    } 
} 
0123: - 絶対にあなたが与えられたグループを持っている場合は、あなたが簡単に使用することによって、そのすべてのグループメンバーを取得することができます System.DirectoryServices.AccountManagement

の新機能を最大限に活用する方法をうまく示しMSDNの記事Managing Directory Security Principals in the .NET Framework 3.5を読みます

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 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... 
} 

あなたは、ユーザが現在見ているグループのマネージャがあるかどうかを判断するために、しかし、いくつかの追加のロジックが必要になります:あなたはまだユーザーに対してDirectoryEntryを取得することによってそれを行うことができます他のグループよりもおそらくdirectReportsプロパティをチェックして、その中に含まれているユーザーが現在のグループのメンバーであるかどうかを確認してください。

関連する問題