我有一个简单的GetStaff函数,它应该从活动目录中检索所有用户。我们有超过1000个用户,因此目录搜索器正在使用分页,因为AD MaxPageSize的默认值为1000.
目前,当我构建并发送回所有1054个用户时,搜索“有时”工作,有时它只返回1000.如果它工作一次,它会一直工作。如果失败一次,它会一直失败。我已经在using语句中设置了所有内容以确保对象被销毁,但它似乎并不总是尊重PageSize属性。默认情况下,如果设置了PageSize属性,则搜索者应使用SizeLimit 0.我尝试将大小限制设置为0,将其设置为0,并将其设置为100000,并且不稳定的结果是相同的。我也尝试将PageSize降低到250并获得相同的不稳定结果。目前我正在尝试更改服务器上的ldap策略以使MaxPageSize为10000,并且我仍然接收1000个用户,搜索PageSize也为10000。不确定我在这里缺少什么,但任何帮助或方向都将不胜感激。
public IEnumerable<StaffInfo> GetStaff(string userId)
{
try
{
var userList = new List<StaffInfo>();
using (var directoryEntry = new DirectoryEntry("LDAP://" + _adPath + _adContainer, _quarcAdminUserName, _quarcAdminPassword))
{
using (var de = new DirectorySearcher(directoryEntry)
{
Filter = GetDirectorySearcherFilter(LdapFilterOptions.AllUsers),
PageSize = 1000,
SizeLimit = 0
})
{
foreach (SearchResult sr in de.FindAll())
{
try
{
var userObj = sr.GetDirectoryEntry();
var staffInfo = new StaffInfo(userObj);
userList.Add(staffInfo);
}
catch (Exception ex)
{
Log.Error("AD Search result loop Error", ex);
}
}
}
}
return userList;
}
catch (Exception ex)
{
Log.Error("AD get staff try Error", ex);
return Enumerable.Empty<StaffInfo>();
}
}
答案 0 :(得分:1)
一位朋友带着帮助我的下面回复回复了我,所以我想我会分享它并希望它可以帮助其他人解决同样的问题。
我首先想到的是“您使用的是域名,例如foo.com作为_adpath吗?”
如果是这样,那我就有了一个很好的主意。对Foo.com的dns查询将返回域中最多25个DC的随机列表。如果该随机列表中的第一个DC没有响应或防火墙,并且您从DNS获得该DC,那么您将体验到您描述的行为。由于DNS是在本地计算机上缓存的,因此您会看到它在某一天发生,然后在下一次运行时不会发生。这是令人愤怒的行为。 :/
您可以使用网络跟踪对此进行验证,以确定是否发生这种情况。
那么你如何解决它呢?几个选项。
更好的方法是向AD管理员询问ldap服务器列表,并将其与上述方法一起使用。
80%的管理员会告诉您使用域名。这很好,因为部署新域将“正常工作”而无需重新配置。
15%的管理员希望指定几个最接近应用程序的DC。这对性能有好处,但如果他们在他们升级域时忘记了这个应用程序,那就太糟糕了。
其他5%并不重要。 :)
我看到的下一点是您使用的是LDAP,而不是LDAP。这没关系,但你有可能会使用“基本”绑定。通过“基本”绑定,joe hacker可以使用网络嗅探器窃取您的帐户凭据。有几种可能的解决方法。 1.还有另一个DirectoryEntry构造函数,可以将“安全”指定为auth方法。 2.询问您的管理员是否可以使用LdapS。 (如果您需要与Active Directory以外的LDAP服务器通信,则更具可移植性)
最后一部分是关于页面大小。 1000普遍应该是好的。不要使用任何值&gt; 5,000或者你可以期待一些烦躁的行为。即,这高于Windows 2003下的默认限制,而在Windows 2008中,页面大小被硬编码限制为5,000,除非使用AD中名为dsHeuristics的相当模糊的位覆盖页面大小。 http://support.microsoft.com/kb/2009267
答案 1 :(得分:0)
默认情况下,LDAP配置为最多只返回1000.您可以在请求的域中更改此设置。