2014-01-17 1 views
0

У меня есть расширение GroupPrincipal, который добавляет несколько extensionAttributes:Как отлит из GroupPrincipal базы для GroupPrincipalsEx

[DirectoryObjectClass("group")] 
[DirectoryRdnPrefix("CN")] 

public class GroupPrincipalsEx : GroupPrincipal 
{ 
    public GroupPrincipalsEx(PrincipalContext context) : base(context) { } 

    public GroupPrincipalsEx(PrincipalContext context, string samAccountName) 
     : base(context, samAccountName) 
    { 
    } 

    [DirectoryProperty("ExtensionAttribute1")] 
    public string ExtensionAttribute1 
    { 
     get 
     { 
      if (ExtensionGet("ExtensionAttribute1").Length != 1) 
       return null; 

      return (string)ExtensionGet("ExtensionAttribute1")[0]; 

     } 
     set { this.ExtensionSet("ExtensionAttribute1", value); } 
    } 

    [DirectoryProperty("ExtensionAttribute2")] 
    public string ExtensionAttribute2 
    { 
     get 
     { 
      if (ExtensionGet("ExtensionAttribute2").Length != 1) 
       return null; 

      return (string)ExtensionGet("ExtensionAttribute2")[0]; 

     } 
     set { this.ExtensionSet("ExtensionAttribute2", value); } 
    } 

    [DirectoryProperty("ExtensionAttribute3")] 
    public string ExtensionAttribute3 
    { 
     get 
     { 
      if (ExtensionGet("ExtensionAttribute3").Length != 1) 
       return null; 

      return (string)ExtensionGet("ExtensionAttribute3")[0]; 

     } 
     set { this.ExtensionSet("ExtensionAttribute3", value); } 
    } 

    [DirectoryProperty("ExtensionAttribute4")] 
    public string ExtensionAttribute14 
    { 
     get 
     { 
      if (ExtensionGet("ExtensionAttribute4").Length != 1) 
       return null; 

      return (string)ExtensionGet("ExtensionAttribute4")[0]; 

     } 
     set { this.ExtensionSet("ExtensionAttribute4", value); } 
    } 
} 

Мне нужно, чтобы получить список групп, которые конкретный пользователь является членом и extensionAttribute1 этой группы является конкретным значением. Он должен возвращать массив пользовательских объектов (группа SamAccountName, DN, extensionAttributes 1-4).

Я знаю, как получить доступ к всем группам пользователей, но у меня возникла проблема с литой GroupPrincipal для GroupPrincipalsEx.

public List<GroupPrincipalsEx> GetGroups(string userName, Boolean Recurent = false) 
    { 
     List<GroupPrincipalsEx> result = new List<GroupPrincipalsEx>(); 

     // establish domain context 
     PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain); 

     // find your user 
     UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName); 

     // if found - grab its groups 
     if (user != null) 
     { 
      PrincipalSearchResult<Principal> groups = Recurent ? user.GetAuthorizationGroups() : user.GetGroups(); 

      // iterate over all groups 
      foreach (Principal p in groups) 
      { 
       // make sure to add only group principals 
       if (p is GroupPrincipal) 
       { 
        //I need a way to cast p from GroupPrincipal to GroupPrincipalsEx and then add it to array 
        GroupPrincipalsEx gp = (GroupPrincipalsEx)p; 
        if(gp.ExtensionAttribute1 == "Specific Value") 
         result.Add(gp); 
       } 
      } 
     } 

     return result; 
    } 

Любая идея, как это сделать без использования DirectoryEntry?

ответ

0

Вы должны пересмотреть свою иерархию классов. Кастинг в класс детей никогда не является лучшей практикой. Во всяком случае я бы закодировать это так:

var gp = p as GroupPrincipalsEx; 
// make sure to add only group principals 
if (gp != null && gp.ExtensionAttribute1 == "Specific Value") 
    result.Add(gp) 
+0

зм получает всегда нуль – Vojin

+0

Хмм я понимаю. Взгляните на http://stackoverflow.com/questions/2668818/extending-groupprincipal-and-members-property Кто-то задал аналогичный вопрос – Sarrus

Смежные вопросы