为了保护AD免受拒绝服务攻击(Denial of Service,DoS)和过渡搜索的负面性能影响,在返回LDAP搜索结果时,AD设置了一个最大不超过1000的限制。
LDAP最大页面大小
也许你知道AD支持轻量目录访问协议(LDAP) 3.0。AD支持LDAP所以你可以使用LDAP客户端对AD进行搜索。为了保护AD免受拒绝服务攻击(Denial of Service,DoS)和过渡搜索的负面性能影响,在返回LDAP搜索结果时,AD设置了一个最大不超过1000的限制。换而言之,在AD返回一个 LDAP搜索时不会超过1000条记录。例如,如果你向一个有着上千个用户的AD域,发送一个列出所有域用户的LDAP搜索,结果将返回1000条记录和一个报告超过限制大小的错误消息。
有两个办法可以解决这个问题。第一是修改客户端的最大页面大小;第二是在域控制器(DC)上修改LDAP策略MaxPageSize。根据最佳操作原则,建议采用第一种,而不去修改LDAP策略。但是如果任凭用户和客户端自行修改设置并访问AD,就很有可能影响AD的正常运行,尤其是在处理那些低效率的LDAP查询时。最大页面大小设置实际上是为了保护AD免受那些低效率LDAP查询的骚扰。最危险的情况就是由于LDAP查询严重影响DC的性能。要了解更多关于LDAP策略的信息,请参阅微软文章“HOW TO: View and Set Lightweight Directory Access Protocol Policies by Using Ntdsutil.exe in Windows 2000”(http://support.microsoft.com/?kbid=315071)。
在LDAP客户端上修改最大页面大小的办法之一,就是使用来自Windows 2003或Windows 2000支持工具中的LDAP客户端ldp.exe。要使用该方法,请参考下列命令:
1.首先运行ldp.exe。
2.然后,与目录服务进行连接并绑定。选择菜单栏中的“连接”,再点击“连接”。在窗口中输入要连接的域控制器的完整域名(FQDN,例如: dc1.mydomain.com)。如果要与默认本地域的目录服务连接,无需输入域名直接点击“确定”即可。要与DC建立LDAP绑定,在“连接”菜单栏中选择“绑定”,输入拥有相应权限的域用户名、密码和域信息,然后点击“确定”。选择“浏览”,单击“搜索”。
3.点击“选项”如图一所示,根据需要修改所需的最大页面大小。
图1:LDAP的搜索选项
如图一中显示了我将Search Call Type设置从默认的Sync.更改为Paged.。这个修改将指示DC在处理任何包含了Page size设置的查询时,返回所有结果,这样1000条记录的限制便得到解决。还记得DC上的LDAP策略被称为MaxPageSize吗?该策略与 LDAP客户端的Page size设置完全没有任何关联。MaxPageSize策略只对服务器返回的最大记录数作限制。而在本例中ldp.exe要求服务器返回结果记录16(默认设置)。你无需修改此默认设置。我将Timeout (s)设置为60。根据我的经验,这将有效防止超时。我还将Attributes设置为1.1。该设置指示DC不返回属性。(默认情况下,DC将在结果中返回对象的DN名称。)
如果你是一个LDAP领域的专家,或者希望了解更底层的内容,那么我可以告诉你ldp.exe实际是通过pagedResultsControl实现对 LDAP查询页面大小的控制。更多关于控制LDAP的信息请参考Internet Engineering Task Force(IETF)Request for Comments(RFC)2696(http://www.ietf.org/rfc/rfc2696.txt)。
还有另一种通过在VBScript脚本中使用ActiveX Data Objects(ADO)设置页面大小的方法。Listing 1中的脚本用于列举一个域中所有用户的账号。如果在一个超过1000个用户的域中,运行没有带Page size的脚本,那么脚本运行将会出错。就像上面设置ldp.exe同样的方式,在脚本中设置特定的页面大小将指示服务器按需要返回查询结果,这样就能够克服1000条记录的限制。要运行脚本,首先新建文件(例如:PageSize.vbs)修改Listing 1中Callout A部分的代码,然后保存即可。在命令行窗口中,将当前目录指向脚本存放位置,然后输入下列命令:
Listing 1
cscript PageSize.vbs