有效地合并来自所有域控制器的数据

时间:2016-01-26 10:22:11

标签: c# active-directory

我想合并域中所有域控制器的数据。

例如,我总结所有 logonCount ,我只选择最新的 lastLogon 。这是在private static User MergeData(User alreadyKnownUser, User newlyRetrieveUser)方法中完成的。

这是我的代码:

foreach (Domain domain in this.Domains)
{
    ConcurrentDictionary<string, User> usersFromCurrentDomain = new ConcurrentDictionary<string, User>();

    foreach (ActiveDirectoryDomainController domainController in domain.DomainControllers)
    {
        DirectoryEntry domainControllerDirectoryEntry = domainController.DirectoryEntry;

        ICollection<User> userFromCurrentDomainController = EnumerateAllUsersInDomainController(domainControllerDirectoryEntry);

        Parallel.ForEach(userFromCurrentDomainController, currentUser =>
        {
            string userId = currentUser.Id;

            if(usersFromCurrentDomain.Contains(userId))
            {
                User retrievedUser = usersFromCurrentDomain[userId];
                retrievedUser = MergeData(retrievedUser, currentUser);
                usersFromCurrentDomain[id] = retrievedUser;
            }
            else
            {
                usersFromCurrentDomain.Add(userId, currentUser);
            }
        });
    }
}

我认为它的效率是 O(n²)(对吧?)。

有没有办法让算法更有效?

提前致谢。

1 个答案:

答案 0 :(得分:0)

这不是 O(n ^ 2)。它是 O(n ^ 3),因为您迭代域,在其中迭代域控制器,在其中迭代用户。如果你想优化它,那么首先,你应该看一下EnumerateAllUsersInDomainController(domainControllerDirectoryEntry)的调用。如果你有一个EnumerateAllUsersInDomainControllers的方法可以期待DirectoryEntry的列表,那会好得多吗?如果你有这样的方法,那么优化将包含以下元素:

  • 您迭代this.Domains并将domain.DomainControllers与包含域控制器的列表合并
  • 您在单独的迭代中迭代域控制器,构建DirectoryEntry列表
  • 您调用新创建的EnumerateAllUsersInDomainControllers
  • 您根据需要解析结果