获取AD组的成员,其结果类型是自定义派生的UserPrincipal

时间:2012-04-06 11:13:05

标签: .net active-directory directoryservices userprincipal

我已经创建了自己的派生UserPrincipal类型,用于获取一些扩展的AD属性。这很好。

现在我正在寻找一种方法来使用groupprincipal对象的GetMembers()方法返回一个自定义UserPrincipal类型的列表。

有点像FindByIdentityWithType在UserPrincipal上工作的方式,其中有一个重载,您可以在其上指定自己的PrincipalType。

有没有办法在GetMembers方法上执行此操作?

2 个答案:

答案 0 :(得分:4)

我最终使用AdvancedSearchFilter来构建查询的LDAP成员,而不是GroupPrincipal.GetMembers。

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

答案 1 :(得分:0)

我没有找到一种从GetMembers函数返回自定义userprincipals的简单方法。我甚至无法将返回的UserPrincipal转换为我的自定义userprincipal。

最后,我通过使用PrincipalSearcher对象上的FindAll方法从我的OU获取所有用户并将其queryfilter设置为我的自定义userprincipal的新类型来解决这个问题。

然后使用基本userprincipal类的GetGroups方法检查每个用户是否是组的成员。