首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectorySearcher.FindAll()方法中的foreach循环

DirectorySearcher.FindAll()方法中的foreach循环
EN

Stack Overflow用户
提问于 2014-09-03 09:21:34
回答 2查看 7.3K关注 0票数 0

我需要在DirectorySearcher.FindAll()中运行一个foreach循环,并获取displayname属性。这似乎是内存问题(参考链接:Memory Leak when using DirectorySearcher.FindAll())。我的代码如下:

代码语言:javascript
复制
List<string> usersList = new List<string>();
        string displayName = string.Empty;
        try
        {
            using (DirectoryEntry directoryEntry = new DirectoryEntry(ldap, userName, password))
            {
                DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry);
                directorySearcher.PageSize = 500;  // ADD THIS LINE HERE !
                string strFilter = "(&(objectCategory=User))";
                directorySearcher.PropertiesToLoad.Add("displayname");//first name
                directorySearcher.Filter = strFilter;
                directorySearcher.CacheResults = false;
                SearchResult result;
                var resultOne = directorySearcher.FindOne();

                using (var resultCol = directorySearcher.FindAll())
                {
                    for (int counter = 0; counter < resultCol.Count; counter++)
                    {
                        result = resultCol[counter];
                        if (result.Properties.Contains("displayname"))
                        {
                            displayName = (String)result.Properties["displayname"][0];
                            usersList.Add(displayName);
                        }
                    }
                } 
            }
        }

有没有什么可能的循环方法。我也尝试过调用Dispose()方法,但它不起作用。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2018-04-17 23:24:50

这是我为我正在做的一个项目想出的一个解决方案,我认为它会对你起作用。我的解决方案遍历搜索结果,并在字符串列表中返回显示名称,最多20个字符。

代码语言:javascript
复制
using (DirectorySearcher ds = new DirectorySearcher())
        {
            //My original filter
            //ds.Filter = string.Format("(|(&(objectClass=group)(|(samaccountname=*{0}*)(displayname=*{0}*)))(&(objectCategory=person)(objectClass=user)(|(samaccountname=*{0}*)(displayname=*{0}*))))", name);

            //Your Modified filter                
            ds.filter = "(objectCategory=User)"


            ds.PropertiesToLoad.Add("displayname");

            ds.SizeLimit = 20;

            SearchResultCollection result = ds.FindAll();

            List<string> names = new List<string>();

            foreach (SearchResult r in result)
            {
                var n = r.Properties["displayname"][0].ToString();
                if (!names.Contains(n))
                    names.Add(n);
            }

            return Json(names, JsonRequestBehavior.AllowGet);
        }
票数 1
EN

Stack Overflow用户

发布于 2014-09-03 10:32:05

如果它在托管代码中不是有效解决方案,并且您的代码严重依赖于非托管内容,例如Active Directory,我认为将目录搜索的逻辑从主应用程序域中隔离出来是个好主意。这是一种不会与风对抗的方法。

对于我来说,更好的方法是使用外部控制台进程,将参数发送到参数字符串并捕获StandardOutput。

它会更慢,但内存不会泄漏,因为它会在控制台进程死后被系统释放。

此外,在这种情况下,你不能自己制作ad_searcher.ex,而是使用标准的dsquery等。例如:

[https://serverfault.com/questions/49405/command-line-to-list-users-in-a-windows-active-directory-group]

另一种方法-使用托管子域,但我认为这更难,而且我不确定所有非托管资源是否都会被释放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25634811

复制
相关文章

相似问题

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