2013-08-08 25 views
5

Yani AD grup üyeliğini yinelemeli olarak sıralayan bir şey almaya çalışıyorum. Şu anda ...C# - GroupPrincipal.GetMembers (true) - hangi grup?

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "mine.domain.com"); 
GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, "myADGroup"); 
if (grp != null) 
{ 
    foreach (Principal p in grp.GetMembers(true)) 
    { 
     Console.WriteLine(p.Name); 
    } 
} 

Bu, elbette harika çalışıyor. Grubun üyesi olan tüm kullanıcıları ve içine yerleştirilmiş grupların tüm kullanıcılarını listeler, ancak çok sayıda yuvalama düzeyi olabilir. Hangisi harika.

Gerçekten ihtiyacım olan şey, bu küçük yuvadaki kullanıcının grubunun ne olduğunu bilmek. Ben kullanıcı ve o gelen CTP-MainProject üyeliğini miras CTP-Sanatçılar olduğu gerçeğini dönen hakkında gitmeli nasıl -

GRP-MainProject 
    -- GRP-Producers 
    -- GRP-Artists 
    -- UserA 

UserA dönecektir CTP-MainProject karşı benim şimdiki sorguyu çalıştırma?

UserA konularda durumda, yaklaşık 40 gruplar ya da öylesine bir üyesidir. Düzenleme - kullanıcı, birden çok iç içe gruptan gruba üye olabilir.

Herhangi bir düşünce mutluluk duyacağız.

+1

Zaten bu satırı foreach içinde biliyorum (grp.GetMembers (gerçek) içinde p) sadece grp sadece senin p.Name – Raymund

+0

ile çıktı Eğer grp çıktı zaman, sadece "GRP-MainProject" çıktılar UserA için grup olarak, GRP-Sanatçılar kullanıcı grubu olarak dönmeliyim. GetMembers için boole değeri true olduğundan, yinelenen çıktısı, gerçek yuvalanmış grup üyeliğinden bağımsız olarak, GRP-MainProject içinde bulunan tüm kullanıcıları sayar. Bir şekilde 'userGroup' grp'' üyesi bilgisi çıktısını almadan olup olmadığını test etmek için bir işareti eklenir eğer – dotalchemy

cevap

2

belki böyle bir şey deneyin Bu sana istediğini vermeli gibi görünüyor.

+0

Bu işe yarayabilir. Ben sadece biraz oynamak istiyorum, çıktı sadece GroupPrincipal -> GroupPrincipal -> UserPrincipal u == "Joe Blogs" - Ben yarın oynayacağım umarım. Teşekkürler. – dotalchemy

+0

Yani, bunun temelleri var, ama nihayetinde sadece grup grup üyeliğini geri çekiyor. Bir kullanıcı adını nasıl geçireceğimi anlamaya çalışıyorum ve bu kullanıcı adıyla ilgili kullanıcı adını taşıyan GroupPrincipal nesnelerini iade etmem gerekiyor. Yüksek seviyeli son hedef, "UserA'nın bu klasöre erişimi var - nereden alıyor?" Sorusunu yanıtlamaktır. – dotalchemy

+0

@dotalchemy Tamam, şimdi aradığınızı anlıyorum. Cevabımı birkaç dakika içinde güncelleyeceğim ve daha yakından alabileceğimi göreceğim – randcd

0

ne dersiniz:

beyan Statik Grubu Nesneleri listesi (GroupPrincipal, tamsayı seviyesinin basit sınıf ve veli GroupPrincipal)

public class SomeDirTraverser 
{ 
    private static List<GroupObj> _groups = new List<GroupObj>(); 

    public List<string> GetMembershipWithPath(string groupname) 
    { 
     List<string> retVal = new List<string>(); 

     PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 
     GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupname); 
     if (grp != null) 
     { 
      BuildHList(grp, 0, null); 
      foreach (UserPrincipal usr in grp.GetMembers(true)) 
       retVal.Add(GetMbrPath(usr)); 
     } 

     return retVal; 
    } 

    private void BuildHList(GroupPrincipal node, int level, GroupPrincipal parent) 
    { 
     PrincipalSearchResult<Principal> rslts = node.GetMembers(); 
     _groups.Add(new GroupObj() { Group = node, Level = level, Parent = parent }); 
     foreach (GroupPrincipal grp in rslts.Where(g => g is GroupPrincipal)) 
      BuildHList(grp, level + 1, node); 
    } 

    private string GetMbrPath(UserPrincipal usr) 
    { 
     Stack<string> output = new Stack<string>(); 
     StringBuilder retVal = new StringBuilder(); 
     GroupObj fg = null, tg = null; 
     output.Push(usr.Name); 
     foreach (GroupObj go in _groups) 
     { 
      if (usr.IsMemberOf(go.Group)) 
      { 
       output.Push(go.Group.Name); 
       fg = go; 
       while (fg.Parent != null) 
       { 
        output.Push(fg.Parent.Name); 
        tg = (from g in _groups where g.Group == fg.Parent select g).FirstOrDefault(); 
        fg = tg; 
       } 
       break; 
      } 
     } 
     while (output.Count > 1) 
      retVal.AppendFormat("{0} ->", output.Pop()); 
     retVal.Append(output.Pop()); 

     return retVal.ToString(); 
    } 
} 

public class GroupObj 
{ 
    public GroupPrincipal Group { get; set; } 
    public int Level { get; set; } 
    public GroupPrincipal Parent { get; set; } 
} 

:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "mine.domain.com"); 
GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, "myADGroup"); 
if (grp != null) 
{ 
    foreach (UserPrincipal user in grp.GetMembers(true)) 
    { 
     Console.WriteLine("User: {0}", user.Name); 
     foreach (Principal userGroup in user.GetGroups(ctx)) 
     { 
      Console.WriteLine(" - Member of Group: {0}", userGroup.Name); 
     } 
    } 
} 
+0

Bu iyi bir fikir olabilir ... –