0

多くのメンバーを持つ特定のグループが与えられた場合、グループ内でクエリを実行して、DisplayName が一致するメンバーを見つけたいと考えています。

以下のコードは、私が達成したいことの非機能的な例です。最初にリスト全体をロードしてから「where」を適用したくないことに注意してください。すでにそれを実行できますが、グループが大きいため低速です。

    public static List<Principal> FindUsersOfGroup(string groupName, string displayNameQuery)
    {
        using (var context = new PrincipalContext(ContextType.Machine, Environment.MachineName))
        {
            var search = new GroupPrincipal(context);
            search.SamAccountName = groupName;
            // This where doesn't work, but is what I'm looking for.
            search.Members.Where(m => m.DisplayName == displayNameQuery + "*");

            using (var ps = new PrincipalSearcher(search))
            {
                // Want to get all members that match the query AND belong to the group.
                return ps.FindAll().ToList();
            }
        }
    }

また、実際のコードではコンテキストが Domain になっているので、わざと置き換えました。

4

1 に答える 1

1

DirectorySearcherクラスを使用すると、次のようなことができます。

using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + Environment.UserDomainName))
{
    using (DirectorySearcher searcher = new DirectorySearcher(
        entry,
        string.Format(
            "(&(objectCategory=person)(objectClass=user)(displayName={0}*)(memberof={1}))",
            displayNameQuery,
            groupName)))
    {

        searcher.PropertiesToLoad.Add("samAccountname"); //You can specify which properties you want to load. If you don't specify properties, by default you will get a lot of properties. Loading specific properties is better in terms of performance

        using (var results = searcher.FindAll())
        {
            foreach (var result in results.Cast<SearchResult>())
            {
                //Do something with result
                var properties = result.Properties;

                //Example
                var samAccountName = properties["samAccountName"][0];
                //...
            }
        }
    }
}

groupNameこの場合はグループの識別名です (例: CN=Administrators,CN=Builtin,DC=dnb,DC=lab)

于 2015-12-15T20:26:14.023 に答える