2012-04-06 12 views
4

Ich habe meinen eigenen abgeleiteten UserPrincipal-Typ erstellt, der verwendet wird, um einige erweiterte AD-Eigenschaften zu erhalten. Das funktioniert gut.Abrufen von Mitgliedern einer AD-Gruppe, deren Ergebnistyp ein benutzerdefiniertes UserPrincipal ist

Jetzt bin ich auf der Suche nach einer Möglichkeit, die Methode GetMembers() des groupprincipal-Objekts zu verwenden, um mir eine Liste meiner benutzerdefinierten UserPrincipal-Typ zurückzugeben.

Ein bisschen die gleiche Weise FindByIdentityWithType funktioniert auf dem UserPrincipal, wo es eine Überladung gibt, auf der Sie Ihren eigenen PrincipalType angeben können.

Gibt es eine Möglichkeit, dies mit der GetMembers-Methode zu tun?

Antwort

0

Ich habe es nicht geschafft, eine einfache Möglichkeit zu finden, benutzerdefinierte Benutzerprincipals aus der GetMembers-Funktion zurückzugeben. Ich war nicht einmal in der Lage, das zurückgegebene UserPrincipal in mein benutzerdefiniertes Userprincipal zu konvertieren.

Endlich habe ich das gelöst, indem ich alle Benutzer von meiner OU mit der FindAll-Methode auf dem PrincipalSearcher-Objekt und seinem Abfragefilter auf einen neuen Typ meines benutzerdefinierten Userprincipal gesetzt habe.

Dann überprüfen Sie jeden Benutzer, ob es ein Mitglied einer Gruppe ist oder nicht, indem Sie die GetGroups-Methode der base userprincipal-Klasse verwenden.

4

Anstelle von GroupPrincipal.GetMembers habe ich mit AdvancedSearchFilter das LDAP-Member der Abfrage erstellt.

static void Main(string[] args) 
    { 
     using (var context = new PrincipalContext(ContextType.Domain)) 
     { 
      var group = GroupPrincipal.FindByIdentity(context, IdentityType.Name, "Group Name"); 

      UserPrincipalEx qbe = new UserPrincipalEx(context); 
      qbe.AdvancedSearchFilter.MemberOf(group); 
      PrincipalSearcher searcher = new PrincipalSearcher(qbe); 

      var all = searcher.FindAll().OfType<UserPrincipalEx>().ToList(); 

      foreach (var member in all) 
      { 
       Console.WriteLine(member.DisplayName); 
      } 
     } 
    } 

    public class UserPrincipalExSearchFilter : AdvancedFilters 
    { 
     public UserPrincipalExSearchFilter(Principal p) : base(p) { } 

     public void MemberOf(GroupPrincipal group) 
     { 
      this.AdvancedFilterSet("memberof", group.DistinguishedName, typeof(string), MatchType.Equals); 
     } 
    } 

    [DirectoryRdnPrefix("CN")] 
    [DirectoryObjectClass("User")] 
    public class UserPrincipalEx : UserPrincipal 
    { 
     private UserPrincipalExSearchFilter searchFilter; 

     public UserPrincipalEx(PrincipalContext context) 
      : base(context) 
     { 

     } 

     public UserPrincipalEx(PrincipalContext context, 
          string samAccountName, 
          string password, 
          bool enabled) 
      : base(context, 
        samAccountName, 
        password, 
        enabled) 
     { 
     } 

     public new UserPrincipalExSearchFilter AdvancedSearchFilter 
     { 
      get 
      { 
       if (null == searchFilter) 
        searchFilter = new UserPrincipalExSearchFilter(this); 

       return searchFilter; 
      } 
     } 
    } 
+0

One (korrigiert) Kommentar zu diesem Thema - Sie könnten versucht sein, qbe.IsMemberOf() anstelle des zusätzlichen Suchfilter zu verwenden, aber meine Erfahrung war, dass nicht funktionierte. Also tu es nicht. –