2012-04-06 5 views
4

Я создал свой собственный производный тип UserPrincipal, который используется для получения некоторых расширенных свойств AD. Это прекрасно работает.Получение членов группы AD, где тип результата является пользовательским производным UserPrincipal

Теперь я ищу способ использования метода GetMembers() объекта groupprincipal, чтобы вернуть мне список моего пользовательского типа UserPrincipal.

Точно так же FindByIdentityWithType работает на UserPrincipal, где есть перегрузка, на которой вы можете указать свой собственный PrincipalType.

Есть ли способ сделать это по методу GetMembers?

ответ

0

Мне не удалось найти простой способ вернуть пользовательские пользовательские шаблоны из функции GetMembers. Я даже не смог преобразовать возвращенный UserPrincipal в пользовательский пользовательский интерфейс.

Наконец, я решил это, забрав всех пользователей из моего подразделения с помощью метода FindAll на объекте PrincipalSearcher и установив его queryfilter в новый тип пользовательского пользовательского интерфейса.

Затем проверка каждого пользователя независимо от того, является ли он членом группы с помощью метода GetGroups базового класса userprincipal.

4

Вместо GroupPrincipal.GetMembers, я закончил использование AdvancedSearchFilter для создания запроса LDAP-члена.

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 (исправлено) комментарий на это - вы можете захотеть использовать qbe.IsMemberOf() вместо дополнительного фильтра поиска, но мой опыт показал, что не работает. Так что не делай этого. –