我有一个Web方法,它返回特定登录用户的安全组。下面的代码运行良好,但要获得结果却花费了将近45秒的时间。
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或线程等优化代码吗?
发布于 2019-10-17 08:24:13
让我们先回顾一下代码。
usings会降低压痕的程度。Filter的DirectorySearcher传递给构造函数。FindAll()调用的预期结果将是巨大的,则应该考虑通过使用DirectorySearcher类的这个过载构造函数返回所需的属性。SearchResultCollection由DirectorySearcher.FindAll()返回,实现了IDisposable接口,因此它也应该包含在using中。文档的备注部分声明:由于实现限制,SearchResultCollection类在垃圾收集时不能释放其所有非托管资源。若要防止内存泄漏,必须在不再需要SearchResultCollection对象时调用Dispose方法。实现其中的一些更改如下所示
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()
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);
}https://codereview.stackexchange.com/questions/230885
复制相似问题