4

いくつかの拡張ADプロパティを取得するために使用される独自の派生UserPrincipalタイプを作成しました。これは正常に機能します。

ここで、groupprincipalオブジェクトのGetMembers()メソッドを使用して、カスタムUserPrincipalタイプのリストを返す方法を探しています。

FindByIdentityWithTypeがUserPrincipalで機能するのと少し同じ方法で、独自のPrincipalTypeを指定できるオーバーロードがあります。

GetMembersメソッドでこれを行う方法はありますか?

4

2 に答える 2

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;
            }
        }
    }
于 2012-05-03T20:40:16.067 に答える
0

GetMembers関数からカスタムユーザープリンシパルを返す簡単な方法を見つけることができませんでした。返されたUserPrincipalをカスタムuserprincipalに変換することさえできませんでした。

最後に、PrincipalSearcherオブジェクトのFindAllメソッドを使用してOUからすべてのユーザーを取得し、そのqueryfilterを新しいタイプのカスタムuserprincipalに設定することで、これを解決しました。

次に、基本userprincipalクラスのGetGroupsメソッドを使用して、各ユーザーがグループのメンバーであるかどうかを確認します。

于 2012-04-10T07:52:38.507 に答える