我有以下代码从用户的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。
答案 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的开销,应该更快。它在开始时看起来有点笨拙但是一旦你习惯它,它就没那么糟糕了。另外,您可以进行适当的异步搜索。
看看: