在属于 1,010 多个组的成员的用户帐户上登录可能会在基于 Windows Server 的计算机上失败

本文解决了以下问题:登录到属于 1,010 多个组的成员的用户帐户失败。

适用于: Windows Server 2016、Windows Server 2019、Windows Server 2022、Windows Server 2025
原始 KB 数: 328889

现象

当用户尝试使用本地计算机帐户或域用户帐户登录到计算机时,登录请求可能会失败。 收到以下错误消息:

登录消息:系统由于以下错误而无法登录:在登录尝试期间,用户的安全上下文累积了过多的安全 ID。 请重试或咨询系统管理员。

登录用户是大约 1,010 个或更多安全组的显式成员或可传递成员时,会出现此问题。

应用程序和安全事件日志 ID 4625 可能会显示以下错误代码:

0xc000015a

错误STATUS_TOO_MANY_CONTEXT_IDS

原因

当用户登录到计算机时,本地安全机构(LSA,本地安全机构子系统的一部分)将生成访问令牌。 令牌表示用户的安全上下文。 访问令牌由用户所属的每个组的唯一安全标识符(SID)组成。 这些 SID 包括来自用户和组帐户的 SIDHistory 中的可传递组和 SID 值。

包含访问令牌中用户组成员身份的 SID 的数组不能包含不超过 1,024 个 SID。 LSA 无法从令牌中删除任何 SID。 因此,如果有更多 SID,LSA 无法创建访问令牌,用户将无法登录。

生成 SID 列表时,LSA 还会插入多个通用的已知 SID,除了用户的组成员身份的 SID(可传递评估)。 因此,如果用户是大约 1,010 个自定义安全组的成员,则 SID 总数可能超过 1,024 个 SID 限制。

重要

  • 管理员和非管理员帐户的令牌受限制的约束。
  • 自定义 SID 的确切数量因登录类型(例如,交互式、服务、网络)和创建令牌的计算机的操作系统版本而异。
  • 使用 Kerberos 或 NTLM 作为身份验证协议不会影响访问令牌限制。
  • 当用户属于多个组时,Kerberos 客户端设置 MaxTokenSize 将讨论在 Kerberos 身份验证问题中。 Kerberos 上下文中的令牌 是指 Windows Kerberos 主机收到的票证的缓冲区。 根据票证的大小、SID 的类型以及是否启用了 SID 压缩,缓冲区可以容纳比适合访问令牌的更多或更多的 SID。

自定义 SID 列表将包括:

  • 用户/计算机的主要 SID 和帐户所属的安全组。
  • 登录范围内组的 SIDHistory 属性中的 SID

由于 SIDHistory 属性可以包含多个值,因此如果多次迁移帐户,可以快速达到 1,024 个 SID 的限制。 访问令牌中的 SID 数将小于用户在以下情况下所属的组总数:

  • 用户来自受信任的域,其中 SIDHistory 和 SID 被筛选掉。
  • 用户来自隔离 SID 的受信任域。 然后,仅包含用户所在的同一域中的 SID。
  • 仅包含来自资源的域的域本地组 SID。
  • 仅包含来自资源服务器的服务器本地组 SID。

由于这些差异,用户可以登录到一个域中的计算机,但不能登录到另一个域中的计算机。 用户还可以登录到域中的一台服务器,但不能登录到同一域中的另一台服务器。

可以使用 NTDSUTIL 了解受影响用户的域组成员身份。 它有一个组成员资格评估工具,还可以跨林边界工作。 该工具也适用于以下用户:

  • 远远高于 1,024 个 SID 的限制的用户
  • 处于如此多组中的用户,即使缓冲区的 65,535 字节,Kerberos 也会失败票证检索

执行以下步骤:

  1. 在具有 AD 管理工具(域控制器或具有 RSAT 的计算机)的计算机上打开命令提示符。

  2. 切换到 gro mem eva 该工具,然后获取可用命令,如以下屏幕截图所示:

    运行 gro mem eva 命令后输出的屏幕截图。

  3. 连接到评估所需的 DC:

    • 设置用户的域的帐户 DC %s - DC
    • 设置全局目录 %s - 用户的林的 GC
    • 设置资源 DC %s - 资源域的 DC
    • 根据需要设置凭据,或者在结果看起来不正确或集合失败时详细记录。
  4. 按如下方式运行评估(例如,对于管理员):contoso.com

    Run contoso.com Admin

  5. 执行将收集步骤 1-2 中的用户详细信息,步骤 3 中的资源组详细信息,然后在步骤 4 和 5 中编译报表。

  6. 结果将存储在当前目录中的 TSV 文件中,如以下屏幕截图所示:

    屏幕截图显示结果将存储在当前目录中的 TSV 文件中。

请参阅以下指南来读取 TSV 文件:

  • SID 类型: 指示它是组/用户或 SIDHistory 的主要 SID。
  • SID 历史记录计数:此帐户引入的 SIDHistory 中有多少个 SID?
  • 一级 MemberOf Count:此条目在单个级别(条目的成员)添加到集合中有多少个 SID?
  • Total MemberOf Count:此条目总共向集合中添加多少个 SID?
  • 组所有者:对于具有委派组管理的环境,你可能会获得有关如何使用过多组攻击用户登录的提示。
  • 组类型:Sid 类型。 WellKnown、用户 SID、全局和通用安全组将位于为此用户创建的所有令牌中。 域本地安全组将仅位于此资源域中。 当用户仅在特定资源域中出现登录问题时,这一点非常重要。
  • 成员 WhenChanged (UTC):组成员身份的最新更改。 它可以帮助与用户(s)首次报告登录问题的时间相关联。

查找要针对更改的组的提示:

  • 具有 SIDHistory 的组具有很好的利用来帮助减少 SID 计数。

  • 通过嵌套引入许多其他组的组具有很好的利用来减少 SID 计数。

  • 查找组名称中的线索,以确定该组是否不再使用。 例如,我们有一个客户在其软件部署解决方案中具有每个应用程序的组。 我们发现包含 office2000access2000 的组。

  • 将组列表的报告传递给服务和应用程序管理员。 标识不再需要的组,可能仅适用于此业务部门或部门的此用户。

限制:

  • 该工具不包括本文下面列出的一些特殊/WellKnown SID。 因此,请记住,用户必须先从报表中的 1,024 个 SID 中清除多个 SID,然后才能成功登录。

  • 该工具也不涵盖服务器本地组。 如果仅在资源域的某些服务器上出现问题,则用户或其某些组可能是服务器本地组的成员。

若要获取服务器本地组及其成员的列表,请执行以下操作:

注意

在提升的命令提示符下以管理员身份运行。

Net localgroup | findstr * > %computername%-grouplist.txt

从域获取成员列表:

Md server-groups

For /f "delims=*" %d in (%computername%-grouplist.txt) do Net localgroup %d | findstr \ > server-groups\%d-___domain-memberlist.txt**

将报告组与 NTDSUTIL 中的用户报告混合并匹配。

解决方法

若要解决此问题,请根据需要使用以下方法之一。

方法 1

此解决方法适用于以下情况:

  • 遇到登录错误的用户不是管理员。
  • 管理员可以成功登录到计算机或域。

此解决方案必须由有权更改用户的组成员身份的管理员执行。 管理员必须更改用户的组成员身份,以确保该用户不再是超过 1,010 个安全组的成员。 请考虑可传递组成员身份和本地组成员身份。

减少用户令牌中 SID 数量的选项包括以下内容。 来自 NTDSUTIL 的数据收集应有助于查看更改或删除范围内哪些组:

  • 从足够数量的安全组中删除用户。

  • 将未使用的安全组转换为通讯组。 通讯组不计入访问令牌限制。 需要转换后的组时,可以将通讯组转换回安全组。

  • 确定安全主体是否依赖于 SID 历史记录进行资源访问。 否则,请从这些帐户中删除 SIDHistory 属性。 可以通过权威还原来检索属性值。

注意

尽管用户可以是成员的最大安全组数是 1,024,最佳做法是将该数目限制为小于 1,010。 此数字可确保令牌生成始终成功,因为它为 LSA 插入的泛型 SID 提供空间。

方法 2

解决方法适用于管理员帐户无法登录到计算机的情况。

当由于组成员身份过多而登录失败的用户是管理员组的成员时,具有管理员帐户凭据的管理员(即具有 500 个已知相对标识符 [RID] 的帐户)必须通过选择 “安全模式 启动”选项(或选择“网络启动”选项选择 “安全模式 ”)重新启动域控制器。 在安全模式下,管理员必须使用管理员帐户凭据登录到域控制器。

请参阅 本地重启目录服务还原模式下的域控制器

Microsoft更改了令牌生成算法。 LSA 可以为管理员帐户创建访问令牌,以便管理员可以登录,而不管管理员帐户所属的可传递组或传输组数。 使用这些安全模式启动选项之一时,为管理员帐户创建的访问令牌包括管理员帐户所属的所有内置组和所有域全局组的 SID。

这些组通常包括:

  • 每个人 (S-1-1-0)
  • BUILTIN\Users (S-1-5-32-545)
  • BUILTIN\Administrators (S-1-5-32-544)
  • NT AUTHORITY\INTERACTIVE (S-1-5-4)
  • NT AUTHORITY\Authenticated Users (S-1-5-11)
  • LOCAL (S-1-2-0)
  • 域\域用户(S-1-5-21-xxxxxxxx-yyyy-zzzzzz-513)
  • 域\域管理员(S-1-5-21-xxxxxxxx-yyy-zzzzzz-512)
  • 如果每个人都是此组的成员,则 BUILTIN\Pre-Windows 2000 兼容访问(S-1-5-32-554)
  • 如果域控制器正在运行 Windows Server 2003,则 NT AUTHORITY\This Organization (S-1-5-15)

注意

如果使用安全模式启动选项,则Active Directory 用户和计算机管理单元用户界面(UI)不可用。 在 Windows Server 中,管理员可以选择“网络启动”选项来登录安全模式;在此模式下,Active Directory 用户和计算机管理单元 UI 可用。

管理员通过选择某个安全模式启动选项并使用管理员帐户的凭据登录后,管理员必须标识和修改导致拒绝登录服务的安全组的成员身份。

完成此更改后,用户应在一段时间后成功登录,该时间段等于域的复制延迟已过。

方法 3

如果创建了许多组来授予对特定服务器上使用的资源的访问权限,并且它们与许多其他服务器无关,则此选项具有最大的吸引力。 用户的访问令牌始终包含用户、全局组和通用组的 SID。 但是,它仅包含资源服务器所在的域的域本地组的 SID。 因此,从用户所属的 600 个组中,400 个正在帮助访问两组服务器上的文件服务器资源,然后以下想法可能可行:

  • 根据域本地组数将服务器拆分为多个组。
  • 没有包含所有组和服务器的一个资源域,而是具有多个域,其中仅定义包含所需服务器的组。
  • 为需要域本地组的服务器创建单独的域。 例如,Exchange 服务器可能是 Exchange 服务器,因为 Exchange 对通用组具有很强的偏好。

详细信息

帐户的泛型 SID 通常包括:

  • 每个人 (S-1-1-0)
  • BUILTIN\Users (S-1-5-32-545)
  • BUILTIN\Administrators (S-1-5-32-544)
  • NT AUTHORITY\Authenticated Users (S-1-5-11)
  • 登录会话 Sid (S-1-5-5-X-Y)
  • 如果用户是此组的成员,则 BUILTIN\Pre-Windows 2000 兼容访问(S-1-5-32-554)

重要

工具 Whoami 通常用于检查访问令牌。 此工具不显示登录会话 SID。

SID 的示例,具体取决于登录会话类型:

  • LOCAL (S-1-2-0)
  • 控制台登录 (S-1-2-1)
  • NT AUTHORITY\NETWORK (S-1-5-2)
  • NT AUTHORITY\SERVICE (S-1-5-6)
  • NT AUTHORITY\INTERACTIVE (S-1-5-4)
  • NT AUTHORITY\TERMINAL SERVER USER (S-1-5-13)
  • NT AUTHORITY\BATCH (S-1-5-3)

常用主组的 SID:

  • 域\域计算机(S-1-5-21-xxxxxxxx-yyy-zzzzzz-515)
  • 域\域用户(S-1-5-21-xxxxxxxx-yyyy-zzzzzz-513)
  • 域\域管理员(S-1-5-21-xxxxxxxx-yyy-zzzzzz-512)

记录登录会话如何验证的 SID,以下值之一:

  • 身份验证机构断言标识 (S-1-18-1)
  • 服务断言标识 (S-1-18-2)

提供有关令牌上下文和声明详细信息的详细信息的 SID,可能有多个:

  • 正在使用的设备声明 (S-1-5-21-0-0-0-496)
  • 正在使用的用户声明 (S-1-5-21-0-0-0-497)
  • 此组织证书 (S-1-5-65-1)
  • 令牌是在 PKI 验证标识的帮助下生成的(S-1-18-4)
  • 令牌是使用 MFA 方法构建的(S-1-18-5)
  • 使用了 Credential Guard (S-1-18-6)

描述令牌一致性级别的 SID,最常见的示例如下:

  • 中等强制级别 (S-1-16-8192)
  • 高级强制级别 (S-1-16-12288)

访问令牌包括相对于用户/计算机源的 SID,以下值之一:

  • NT AUTHORITY\OTHER_ORGANIZATION (S-1-5-1000)
  • 如果帐户与计算机位于同一林中,则 NT AUTHORITY\此组织(S-1-5-15)。

注意

  • 正如你在 SID 条目 登录会话 SID 中看到的那样,请不要在工具输出列表中计算 SID,并假定它们对所有目标计算机和登录类型都已完成。 如果帐户的 SID 超过 1,000 个 SID,则应考虑帐户遇到遇到此限制的危险。 不要忘记,根据创建令牌的计算机,还可以添加服务器或工作站本地组。
  • xxxxxxxx-yyy-zzzz 指示 SID 的域或工作站组件。

以下示例演示当用户登录到域中的计算机时,哪些域本地安全组将显示在用户的令牌中。

在此示例中,假定 Joe 属于 域 A ,并且是域本地组 域 A\Chicago Users 的成员。 Joe 也是域本地组 域 B\Chicago Users 的成员。 当 Joe 登录到属于域 A 的计算机(例如域 A\Workstation1)时,将为计算机上的 Joe 生成令牌,并且令牌包含除所有通用和全局组成员身份外,还包含域 A\Chicago 用户的 SID。 它不包含域 B\Chicago 用户的 SID,因为 Joe 登录的计算机(域 A\Workstation1)属于域 A。

同样,当 Joe 登录到属于 域 B 的计算机(例如域 B \Workstation1)时,将为计算机上的 Joe 生成令牌,并且令牌包含除所有通用和全局组成员身份外,域 B\Chicago 用户的 SID;它不包含域 A\Chicago 用户的 SID,因为 Joe 登录的计算机(域 B\Workstation1)属于域 B。

但是,当 Joe 登录到属于 域 C 的计算机(例如,域 C \Workstation1)时,会在登录计算机上为 Joe 生成一个令牌,其中包含 Joe 用户帐户的所有通用全局组成员身份。 域 A\芝加哥用户的 SID 和域 B\Chicago 用户的 SID 都不会出现在令牌中,因为 Joe 所属的域本地组与 Joe 登录的计算机(域 C\Workstation1)不同。 相反,如果 Joe 是属于域 C(例如域 C\Chicago Users)的某些域本地组的成员,则计算机上为 Joe 生成的令牌将包含除所有通用和全局组成员身份外,还会包含域 C\Chicago 用户的 SID。

参考