0

Active Directoryからすべてのグループとそのサブグループ、および各グループのメンバーを取得し、そのサブグループの各グループをツリー構造でリンクして、結果をデータベースに保存しようとしています。これにより、の親と子が何であるかを確認できます。各グループ。

DirectoryServicesパフォーマンスをテストするために使用して次のコードを変換するにはどうすればよいですか?

public static List<Group>getUsers()
    {

        // create the "context" in which to operate - your domain here, 
        // as the old-style NetBIOS domain, and the container where to operate in
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "lin.proximus.com");

        // define a "prototype" - an example of what you're searching for
        // Here: just a simple GroupPrincipal - you want all groups
        GroupPrincipal prototype = new GroupPrincipal(ctx);

        // define a PrincipalSearcher to find those principals that match your prototype
        PrincipalSearcher searcher = new PrincipalSearcher(prototype);

        // define a list of strings to hold the group names        
        List<Group> groupNames = new List<Group>();
        int counter = 0;
        // iterate over the result of the .FindAll() call
        foreach (var gp in searcher.FindAll())
        {

            // cast result to GroupPrincipal
            GroupPrincipal groupPrincipal = gp as GroupPrincipal;

            // if everything - grab the group's name and put it into the list
            if (groupPrincipal == null) continue;

            Group group = new Group();
            group.Name = groupPrincipal.Name;
            group.Description = groupPrincipal.Description;
            AddSubGroups(groupPrincipal, ref group);
            AddMemebers(groupPrincipal, ref group);
            counter++;
            groupNames.Add(group);
            Console.WriteLine(counter);
            if (counter > 10000)
                return groupNames;
        }
        return groupNames;
    }

    private static void AddSubGroups(GroupPrincipal gp,ref Group gr)
    {
        gr.SubCounts = 0;
        if (gp.GetGroups().Count() <= 0) return;

        gr.SubCounts = gp.GetGroups().Count();
        gr.SubGroups = new List<string>();
        foreach (var principal in gp.GetGroups())
        {
            gr.SubGroups.Add(principal.Name);
        }
    }

    private static void AddMemebers(GroupPrincipal gp, ref Group gr)
    {
        if (gp.GetMembers().Count() <= 0) return;

        gr.Users = new List<string>();

        foreach (Principal principal in gp.GetMembers())
        {
            gr.Users.Add(principal.Name);
        }
    }
4

1 に答える 1

0

2番目のMarcの提案-パフォーマンスを向上させるためにページングと適切なページサイズプロパティ値を使用します。ちなみに、グループのメンバーシップなど、999を超える値を持つ可能性のある属性を取得しようとしている場合は、ページングが事実上不可欠です。

于 2013-01-30T07:29:11.710 に答える