文章编号: 327825 - 查看本文应用于的产品
对 Windows Vista Service Pack 1 (SP1) 的支持于2011 年 7 月 12 日结束。若要继续接收 Windows 安全更新,请确保您运行 Windows Vista with Service Pack 2 (SP2)。有关详细信息,请参阅此 Microsoft 网页: 支持结束某些版本的 Windows.
展开全部 | 关闭全部

本文内容

症状

当用户属于多个组时,该用户可能会有身份验证或使用组策略设置时出现问题。下面的 Microsoft 知识库文章介绍更详细的这些症状:

269643 由于连接到 IIS 的缓冲区不足,Internet Explorer Kerberos 身份验证不起作用
280380 缓冲区溢出攻击可以使用扩展存储过程
2020943 "HTTP 400-错误的请求 (请求标题太长)"错误在 Internet Information Services (IIS)
在这些文章中介绍的解决方法指示您要修改的 MaxTokenSize 注册表值。此解决方法做了改进。如果您使用本文中介绍的修复程序,您可能没有编辑默认的 MaxTokenSize 值。

这篇文章中介绍的修补程序取代了在这一节中列出的 Microsoft 知识库文章中描述的修补程序。

原因

用户不能进行身份验证,因为身份验证尝试过程中生成的 Kerberos 令牌具有固定的最大大小。如远程过程调用 (RPC) 的运输和 HTTP 依赖在 MaxTokenSize 值,当他们分配缓冲区进行身份验证。在 Windows 2000 (原始发行版),MaxTokenSize 值为 8000 个字节。在 Windows 2000 Service Pack 2 (SP2) 和 Windows Server 2003 中,MaxTokenSize 值为 12000 字节为单位)。

Kerberos 使用到传输活动目录的组成员身份的 Kerberos 数据包的特权属性证书 (PAC) 字段。从 Windows Server 2012,这同样适用于活动目录理赔信息 (动态访问控制) 字段。如果有许多用户的组成员身份,如果有用户或设备正在使用的许多索赔,这些字段可以占用大量数据包中的空间。

如果用户是 120 多个组的成员,由 MaxTokenSize 值的缓冲区不足够大。因此,用户不能进行身份验证,并且他们可能会收到"内存不足"错误消息。在应用本文中介绍的修复程序之前,被添加到一个用户帐户的每个组将此缓冲区增加 40 个字节。

注意在许多情况下,Windows NTLM 身份验证就能如期作用。您可能看不到 Kerberos 身份验证问题,如果不进行分析。但是,在其中应用组策略设置的情况下可能不会按预期工作。

解决方案

重要提示若要解决此问题,必须对 Kerberos 身份验证过程中涉及到的所有计算机设置 MaxTokenSize 注册表值。这包括 SQL Server 客户端。(即,注册表项必须在请求/响应流中涉及的每台计算机上设置。因此,如果 SQL Server 客户端的 web 应用程序依赖的或如果该用户的令牌传递给后端 SQL Server 数据库,该注册表项具有在 SQL Server 客户端计算机上,SQL Server 数据库的计算机,要设置并且还客户端计算机正在运行 Internet Explorer,运行的 web 服务器正在运行 IIS等等。)

注意以下的 Windows 版本都包括此问题的修复程序:
  • Windows 8
  • Windows Server 2012
  • Windows 7
  • Windows Server 2008 R2
  • Windows Server 2003
  • Windows Vista
  • Windows 2008 Server
  • Windows XP 专业版

服务包信息

若要解决此问题,请获取最新的 Microsoft Windows 2000 service pack。有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
260910 如何获取最新的 Windows 2000 service pack

热修复补丁程序信息

现在可以从 Microsoft 获得支持的修补程序。但是,它被用于纠正本文中描述的问题。它只应用于正经历此特定问题的系统。此修补程序可能会接受进一步的测试。因此,如果这个问题没有对您造成严重的影响,我们建议您等待包含此修复程序的下一个 Windows 2000 service pack。

要立即解决此问题,请联系 Microsoft 客户支持服务,以获取此修复程序。有关 Microsoft 客户支持服务的电话号码以及有关支持费用的信息的完整列表,请访问下面的 Microsoft 网站:
http://support.microsoft.com/contactus/?ws=support
注意在特殊情况下,如果 Microsoft 支持专业人员确定某个特定的更新能够解决您的问题,可能会免收支持电话的费用。其他支持问题和特定更新无法解决的问题照常收取支持费用。此修补程序的英文版具有的文件属性 (或更新的文件属性) 下表中列出。这些文件的日期和时间以协调世界时 (UTC) 显示。当您查看文件信息时,它已转换为本地时间。要了解 UTC 与本地时间之间的时差,请使用控制面板中的日期和时间项中的时区选项卡。

状态

Microsoft 已经确认这是在"适用于"一节中列出的 Microsoft 产品中的问题。 此问题最早在 Microsoft Windows 2000 Service Pack 4 中。

更多信息

标记大小计算 Windows 2000 到 Windows Server 2008 R2

如果您使用本文中介绍的修复程序,您不必修改 MaxTokenSize 注册表值,在大多数情况下。但是,有某些情况下,您需要在应用此修补程序后,修改 MaxTokenSize 注册表值。向所有域控制器中应用此修补程序后,可以使用以下公式来确定您是否需要修改的 MaxTokenSize 值:
TokenSize = 1200 + 40 d + 8s
该公式使用下列值:
  • d: 用户所在的域本地组的数目加上外部用户的帐户域的成员的用户通用组的数目以及组的数目表示安全标识符 (SID) 历史记录。
  • s: 安全的全局组的成员的用户的数量加上的用户是成员的用户的帐户域中的通用组。
  • 1200: 票证系统开销的估计的值。此值可以不同,这取决于各种因素,如 DNS 域名长度、 客户机名称,以及其他因素。
在此委派使用 (例如,当用户与域控制器进行身份验证) 的情况下,我们建议标记大小两倍。

当设置注册表项

如果您通过使用以下公式计算的标记大小小于 12000 个字节 (默认大小),则您不需要修改域的客户端上的 MaxTokenSize 注册表值。如果超过 12000 个字节的值,请参阅下面的 Microsoft 知识库文章有关如何调整 MaxTokenSize 注册表值的说明:

263693 组策略不应用到属于多个组的用户

注释
  • MaxTokenSize 值更改时,您必须重新启动计算机以使更改生效。
MaxTokenSize注册表项推荐的值为 65535 十进制或十六进制 FFFF。MaxTokenSize 值指定一个固定的 Kerberos 票证接收缓冲区包含表示该帐户所属的组的 Sid。

若要使用安全的大小,您可以选择将MaxTokenSize设置为48000,按照关于引入本文内下文中的 HTTP 标头大小限制的讨论。取决于您正在使用什么值,则首先会遇到 Kerberos 错误事件或 IIS HTTP 400 错误的问题。

您可能会遇到的已知的问题

访问令牌的大小有关的已知的问题:

本地安全机构 (LSA) 服务生成此 SID 缓冲区中的用户的访问令牌。硬编码限制的客户可定义的 Sid,此标记是 1,015,请参阅该知识库文章:
328889 1,015 多组的成员的用户可能会登录身份验证失败
http://support.microsoft.com/kb/328889/EN-US

因此,多 1015年有效的 Sid 的 MaxTokenSize 值不是很有用的。在下面的公式:
MaxTokenSize = 1200 + 40 d + 8s
40 d 意味着为一个域本地组的 SID 有 40 个字节。8s 意味着为域全局/通用组 SID 的 8 个字节。

因此,如果您有 MaxTokenSize 值为 0x0000FFFF (64k),可能能够缓冲大约 1600年域本地组的 Sid 或大约 8000 域全局/通用组的 Sid。如果您使用"受信任以进行委派"的帐户,每个 SID 的缓冲区要求可能会加倍。在这些情况下,您只能存储大约 800 域本地组的 Sid 时使用 64 K MaxTokenSize 值。但是,只有域本地组的 Sid 不典型的情形。64 K 值应足够,即使对于代理方案。

已知问题当使用 MaxTokenSize 大于 65535 的值

这篇文章的早期版本的MaxTokenSize讨论多达 100000 个字节的值。我们发现版本的 SMS 管理员有问题,当MaxTokenSize100000或更大。我们还确定 IPSEC IKE 协议不允许安全斑点变得大于 66536 字节,并且它也将失败,当MaxTokenSize设置为一个较大的值。

已知的问题,对于 Internet 信息服务器 HTTP 接收缓冲区

互联网信息服务器 (IIS) 使用减少了所需的缓冲区大小来减轻拒绝服务攻击向量的 64 KB。但是,在 HTTP 请求中的 Kerberos 票证被编码为 Base64 (六位扩展到八位)。此外,和 Kerberos 票证使用其原始大小的 133%。因此,当最大缓冲区大小为 64 KB 在 IIS 中,则可以使用 48 KB 的 Kerberos 票证。

如果将MaxTokenSize注册表项设置为值大于 48000,并且缓冲区空间用于 Sid,则 IIS 错误可能发生。但是,如果将MaxTokenSize注册表项设置为 48000,Kerberos 错误可能发生。

有关 IIS 缓冲区大小的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
310156 如何限制 IIS 接受来自 Windows 2000 中的客户端的 HTTP 传输的标头大小

920862 Outlook Web Access 用户尝试访问 Exchange Server 2003年中的邮箱时出现错误消息:"HTTP 400 错误的请求 (请求标题太长)"

Windows Server 2012 的更改

Windows Server 2012 到有关此缓冲区的考虑因素引入了以下更改:
  • MaxTokenSize 的默认值更改为 48000 字节为单位)。
  • 没有新的方案,用于压缩的 sid 在 pac。
  • 动态访问控制添加到该票证的活动目录索赔。因此,计算预期的票证大小不再是简单的。预期结果是由 Windows Server 2012 域控制器颁发的票证是小于同一门票发放从较旧的操作系统版本。索赔增加票据的大小。但是,Windows Server 2012 文件服务器都广泛地使用索赔后,您可能会逐步退出大量您控制修剪票证大小的文件访问权限的组。

有关 Windows Server 2012 的更改的详细信息,请访问以下 Microsoft TechNet 网站:
http://technet.microsoft.com/en-us/library/hh831717.aspx

当票证大小超出问题的示例

详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
277741 由于缓冲区不足的 Kerberos 的 Internet Explorer 登录失败
313661 错误消息:"超时已过期"当您通过 TCP/IP 连接到 SQL Server 和 Kerberos MaxTokenSize 大于 0xFFFF

因为在您的目录林中,您可能必须跨域登录的情况下,值应该在所有基于 Windows 的系统上设置目录林范围。因此,我们建议 MaxTokenSize 值的最大值是 64k。

重要提示在 SQL Server 的客户机,可能会收到下面的错误消息时则会出现此问题,:
无法生成 SSPI 上下文
若要解决此问题,必须对 Kerberos 身份验证过程中涉及到的所有计算机设置 MaxTokenSize 注册表值。这包括 SQL Server 客户端。

属性

文章编号: 327825 - 最后修改: 2014年6月12日 - 修订: 4.0
这篇文章中的信息适用于:
  • Microsoft Windows XP Professional Edition
  • Microsoft Windows XP Professional x64 Edition
  • Microsoft Windows Server 2003 Service Pack 2
  • Windows Vista Business
  • Windows Vista Enterprise
  • Windows Vista Ultimate
  • Windows Server 2008 Datacenter
  • Windows Server 2008 Enterprise
  • Windows Server 2008 Standard
  • Windows Web Server 2008
  • Windows Server 2008 R2 Enterprise
  • Windows Server 2008 R2 Foundation
  • Windows Server 2008 R2 Standard
  • Windows 7 Enterprise
  • Windows 7 Professional
  • Windows 7 Ultimate
  • Windows Server 2012 Datacenter
  • Windows Server 2012 Essentials
  • Windows Server 2012 Foundation
  • Windows Server 2012 Standard
  • Windows 8 Enterprise
  • Windows 8 Pro
  • Microsoft Windows Server 2003 R2 Datacenter Edition (32-Bit x86)
  • Microsoft Windows Server 2003 R2 Datacenter Edition (64-Bit x86)
  • Microsoft Windows Server 2003 R2 Enterprise Edition (32-Bit x86)
  • Microsoft Windows Server 2003 R2 Enterprise Edition (64-Bit x86)
  • Microsoft Windows Server 2003 R2 Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003 R2 Standard Edition (64-Bit x86)
  • Windows 8.1 Enterprise
  • Windows 8.1 Pro
  • Windows Server 2012 R2 Datacenter
  • Windows Server 2012 R2 Essentials
  • Windows Server 2012 R2 Foundation
  • Windows Server 2012 R2 Standard
关键字:?
kbqfe kbhotfixserver kbsecurity kbwin2ksp4fix kbbug kbfix kbwin2000presp3fix kbwin2000presp4fix kbmt KB327825 KbMtzh
机器翻译
重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。
点击这里察看该文章的英文版: 327825
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com