注册
 找回密码
 注册
江西广告网
查看: 232|回复: 0
打印 上一主题 下一主题

征服AD的内在限制:AD的尺寸限制(图)

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2009-1-2 11:35:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
  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      搜索缓冲大小      在克服了默认的2000个对象的显示限制之后,当你在设置组织单元显示超过10000个对象时又遇到另一个难题。这个问题来源于AD搜索默认的缓存大小,它还会影响用户图形界面工具(包括“AD用户和计算机”插件)。该缓存负责存储查询结果,默认情况下,考虑到AD的性能,它被设置为不超过10000个对象。      微软文章“Controlling the Active Directory Search Buffer Size”和http://support.microsoft.com/?kbid=243281提供了两种修改上述限制的办法。第一种办法需要修改注册表。在“HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Directory UI”中创建一个名为QueryLimit的DWORD子键。根据需要设置QueryLimit的值。如果在注册表中没有找到上述子键,请根据需要创建\Windows和\Directory UI项。      第二种办法同样需要修改注册表,但是,是通过组策略来实施的。使用“组策略编辑器”(GPO)打开你希望编辑的组策略对象(例如,默认组策略)。在树状面板中,依次打开“用户配置”*“管理模板”*“桌面”*“Active Directory”,启用Active Directory搜索的最大大小策略,并且设置为你需要的值。      我倾向于使用第二种办法,因为它避免了第一种办法手工修改注册表时潜在的巨大风险。而且在通过“运行为”修改注册表时还存在问题。注册表不接受由“运行为”指派的用户账号,原因可能是指定的账号无法修改“HKEY_CURRENT_USER”的设置。如果是通过“运行为”修改的组策略,那么为了使组策略设置生效,你需要至少进行一次正常的Windows登录。      上述两种办法对“AD用户和计算机”都非常有效,但是对ADSI却是无能为力。到目前为止,我还没有找到一个使ADSI能显示超过10000个对象的办法。      Kerberos票证大小      Windows 2000和后续版本都默认支持Kerberos身份验证。如果某个用户账号属于过多的组(尤其是组嵌套),在进行身份验证时可能产生问题。身份验证问题在日常使用中比较寻常,例如:远程系统变得很慢或者无法登录、无法应用组策略、在将计算机加入域时出错等。但本例中讨论的身份验证问题,源自于所采用的Kerberos验证方式自身的限制。      当为用户颁发访问票证时,系统将在票证中包括用户的SID和所有用户所属的安全组的SID。如果AD中组嵌套严重,那么SID的大小将急剧膨胀,也就意味着票证可能太小。票证有固定大小,它的值由注册表中的“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters\MaxTokenSize”设置。而且,如果用户账号是从其他域迁移过来的,那么额外的SID将更加影响票证中要包括的SID数量。      那么触发这种问题的阈值是多少呢?答案将根据注册表中设置的MaxToken Size值和安装的服务包版本的不同而不同。在Windows 2000 SP1中,不能超过70-80个组;在Windows 2000 SP2中,不能超过120个组。对于Windows 2000 SP4和Windows 2003,尤其是对于DC级别,微软为此限制提供了一个解决办法。针对这种可能出现的极端环境,微软公司为MaxTokenSize提供了一个计算公式。要了解关于计算公式、组嵌套限制和MaxTokenSize值的信息,请参考微软文章“New Resolution for Problems That Occur When Users Belong to Many Groups”(http://support.microsoft.com/?kbid=327825)。如你所见,针对这个问题目前还没有一个一劳永逸的解决办法,但如果你能够及时安装最新补丁也许会使这个问题不那么迫切。最坏的情况就是你需要根据微软文章计算能够使用多少组。 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表