加载用户的DirectoryEntry的最有效方法是什么?

时间:2009-09-04 19:06:02

标签: c# .net optimization active-directory

我有以下代码从用户的SID加载用户的Active Directory DirectoryEntry对象:

public static DirectoryEntry GetUserDirectoryEntry(SecurityIdentifier sid)
{
    return new DirectoryEntry(string.Format("LDAP://<SID={0}>", sid.Value));
}

有更有效的方法吗?由于性能问题,我不得不优化我的代码,我需要尽可能地压缩到​​绝对最快的代码。它不一定要从SID加载。我只需要知道获取用户DirectoryEntry的最有效方法。

编辑:我只能使用.Net 2.0。

4 个答案:

答案 0 :(得分:2)

无论您使用何种方式访问​​目录中的对象,目录操作都相当慢。如果没有更多的上下文,很难推荐一种更有效的方法,但总的来说,您是否考虑过同时抓取多组用户,多线程和缓存来设计问题?

另外,我不能说哪个更高效,但是你在.NET 3.5中尝试过新的System.DirectoryServices.AccountManagement命名空间吗?如果有任何人应该优化了这一点,那就是微软,但我认为我们之前都已经失望了。

答案 1 :(得分:1)

您应该尝试定义更多过滤器并将用户指定为条件中的类型。

答案 2 :(得分:1)

我认为加载DirectoryEntry的方式并不重要 - 无论是通过SID还是通过完全限定的DN - 只需花费一定的时间让AD绑定操作正常工作

当您实例化DirectoryEntry时,实际上不会发生绑定 - 它会延迟,直到您开始使用DirectoryEntry上的属性或访问.NativeObject属性。

所以无论你采用哪种方式 - 根据一些唯一识别值创建DirectoryEntry只需要花费时间。

马克

答案 3 :(得分:1)

System.DirectoryServices.Protocols命名空间怎么样?它没有使用ADSI的开销,应该更快。它在开始时看起来有点笨拙但是一旦你习惯它,它就没那么糟糕了。另外,您可以进行适当的异步搜索。

看看: