首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Active安全组搜索应用程序优化

Active安全组搜索应用程序优化
EN

Code Review用户
提问于 2019-10-17 03:23:30
回答 1查看 196关注 0票数 2

我有一个Web方法,它返回特定登录用户的安全组。下面的代码运行良好,但要获得结果却花费了将近45秒的时间。

代码语言:javascript
复制
DirectoryEntry root = GetDirectoryEntry()
  using (var groups = root.Children.Find("OU=Sample Security Groups"))
                        {
                            using (var directory = groups.Children.Find("OU=Permissions"))
                            {
                                using (var searcher = new DirectorySearcher(directory))
                                {
                                    searcher.Filter = `filter condition`
                                    var results = searcher.FindAll();
                                    foreach (SearchResult result in results)
                                    {
                                        if (result != null)
                                        {
                                            using (DirectoryEntry group = result.GetDirectoryEntry())
                                            {
                                                items.Add((string)group.Properties["sAMAccountName"].Value);
                                            }
                                        }
                                    }
                                }
                            }
                        }

Update:在GetDirectoryEntry方法中,我们使用用户名和密码创建到活动目录的连接。

有人能帮助使用Parallel.ForEach或线程等优化代码吗?

EN

回答 1

Code Review用户

发布于 2019-10-17 08:24:13

让我们先回顾一下代码。

  • 堆叠usings会降低压痕的程度。
  • 可以将FilterDirectorySearcher传递给构造函数。
  • 如果FindAll()调用的预期结果将是巨大的,则应该考虑通过使用DirectorySearcher类的这个过载构造函数返回所需的属性。
  • SearchResultCollectionDirectorySearcher.FindAll()返回,实现了IDisposable接口,因此它也应该包含在using中。文档的备注部分声明:由于实现限制,SearchResultCollection类在垃圾收集时不能释放其所有非托管资源。若要防止内存泄漏,必须在不再需要SearchResultCollection对象时调用Dispose方法。

实现其中的一些更改如下所示

代码语言:javascript
复制
DirectoryEntry root = GetDirectoryEntry();
using (var groups = root.Children.Find("OU=Sample Security Groups"))
using (var directory = groups.Children.Find("OU=Permissions"))
using (var searcher = new DirectorySearcher(directory, "filter condition"))
using (var results = searcher.FindAll())
{
    foreach (SearchResult result in results)
    {
        if (result != null)
        {
            using (var group = result.GetDirectoryEntry())
            {
                items.Add((string)group.Properties["sAMAccountName"].Value);
            }
        }
    }
}

如果您只需要获得组的SamAccountName's,则特定用户是该组的成员,您可以这样使用UserPrincipal.FindByIdentity()

代码语言:javascript
复制
UserPrincipal user = UserPrincipal.FindByIdentity(new PrincipalContext(ContextType.Domain, "domain", "username", "password"), IdentityType.SamAccountName, "loginUser");

foreach (GroupPrincipal group in user.GetGroups())
{
    Console.Out.WriteLine(group.SamAccountName);
}
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/230885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档