我需要在DirectorySearcher.FindAll()中运行一个foreach循环,并获取displayname属性。这似乎是内存问题(参考链接:Memory Leak when using DirectorySearcher.FindAll())。我的代码如下:
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()方法,但它不起作用。任何帮助都是非常感谢的。
发布于 2018-04-17 23:24:50
这是我为我正在做的一个项目想出的一个解决方案,我认为它会对你起作用。我的解决方案遍历搜索结果,并在字符串列表中返回显示名称,最多20个字符。
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);
}发布于 2014-09-03 10:32:05
如果它在托管代码中不是有效解决方案,并且您的代码严重依赖于非托管内容,例如Active Directory,我认为将目录搜索的逻辑从主应用程序域中隔离出来是个好主意。这是一种不会与风对抗的方法。
对于我来说,更好的方法是使用外部控制台进程,将参数发送到参数字符串并捕获StandardOutput。
它会更慢,但内存不会泄漏,因为它会在控制台进程死后被系统释放。
此外,在这种情况下,你不能自己制作ad_searcher.ex,而是使用标准的dsquery等。例如:
另一种方法-使用托管子域,但我认为这更难,而且我不确定所有非托管资源是否都会被释放。
https://stackoverflow.com/questions/25634811
复制相似问题