本文介绍 Active Directory 环境中可能影响可伸缩性的某些方面的最大限制。 建议在规划 Active Directory 部署时牢记这些限制。
最大对象数
Active Directory 林中的每个域控制器在其生命周期内可以创建近 21.5 亿个对象。
每个 Active Directory 域控制器都有一个特定于单个域控制器的唯一标识符。 这些标识符称为可分辨名称 (DN),是唯一的值,不会被其他域控制器复制或以其他方式可见。 DNT 的值范围为 0 到 2,147,483,393(231 减 255)。 删除对象时,之后创建的任何新对象都不能使用相同的 DNT。 因此,域控制器只能创建不到 20 亿个对象,其中还包括域控制器复制的对象。 此限制适用于域控制器上托管的所有分区中的所有对象的聚合,包括域网络计算机 (NC)、配置、架构和任何应用程序目录分区。
有几种可能的方法可以绕过域控制器生命周期创建限制。 例如,可以通过永久删除对象从域中删除对象。 还可以安装一个新的域控制器,复制潜在域控制器中的剩余对象。 但是,必须确保新域控制器通过复制接收对象,并且不使用“从媒体安装 (IFM)”选项对其进行升级。 使用 IFM 安装的域控制器继承了 IFM 备份所基于的域控制器的 DNT 值。
当达到数据库的 DNT 限制时,你会看到以下错误消息:
Error: Add: Operations Error. <1> Server error: 000020EF: SvcErr: DSID-0208044C, problem 5012 (DIR_ERROR), data -1076.
可以运行以下命令来检查 approximateHighestInternalObjectID 属性,以查看域控制器当前使用的最高 DNT:
$ossupported = $false
# max possible DNTs
$maxdnts = [System.Math]::Pow(2, 31) - 255
# connect rootDSE
$root = [ADSI]"LDAP://rootDSE"
# get operational attribute dsaVersionString
$root.RefreshCache("dsaVersionString")
# get version string usable in System.Version
$osverstring = $root.dsaVersionString[0].Substring(0, $root.dsaVersionString[0].IndexOf(" "))
try
{
$osver = New-Object System.Version $osverstring
# we need at least W2K12 DC to see the approximateHighestInternalObjectID exposed
if ($osver.Major -gt 6)
{ $ossupported = $true }
elseif ($osver.Major -eq 6)
{ $ossupported = ($osver.Minor -ge 2) }
}
catch
{ Write-Host "ERROR: Could not evaluate DC OsVer!" }
if ($ossupported)
{
# get operational attribute approximateHighestInternalObjectID
$root.RefreshCache("approximateHighestInternalObjectID")
Write-Host "Approx highest committed DNT: $($root.approximateHighestInternalObjectID[0])"
Write-Host "DNTs left for new assignments: $($maxdnts - $root.approximateHighestInternalObjectID[0]) from $maxdnts"
}
else
{ Write-Host "approximateHighestInternalObjectID not exposed (DC OsVer: $osverstring)" }
安全标识符的最大数目
在域控制器的生命周期内,可以创建的最大安全标识符数量为 2,147,483,647 个相对标识符 (RID)。 有关颁发和监视 RID 的详细信息,请参阅管理 RID 颁发。
此限制是由于全局相对标识符 (RID) 池的大小造成的,该池使分配给域中的用户、组和计算机帐户的每个 SID 都是唯一的。 即使删除其安全主体,RID 也不会被重用,因此无论域中有多少安全主体,最大限制始终适用。
注意
默认情况下,RID 由在每个域中担任 RID 操作主机角色的域控制器以 500 个块的形式分配。 如果降级域控制器,则最初分配给域控制器的未使用的 RID 不会返回到全局 RID 池,也无法在域中使用。
当可用 RID 的数量达到可用全局 RID 空间的 90% 时,Windows Server 开始为 RID 颁发准备人为限制。 当可用 RID 的数量达到该限制的 1% 以内时,请求 RID 池的域控制器会在其系统事件日志中收到 Directory-Services-SAM 警告事件 16656。
RID 限制的部分解决方法是创建一个额外的域来保存帐户,然后将帐户迁移到该新域。 但是,在达到限制之前,必须为新域创建任何所需的信任关系。 创建信任关系需要安全原则,也称为信任用户帐户。
注意
Active Directory 数据库不会对容器中的对象数量设置限制,但在处理数千个对象时会设置限制。 Microsoft 配置这些限制是为了提供一定级别的应用程序或服务可用性。 可以通过重新配置视图菜单上的“筛选器选项”设置或更改轻型目录访问协议 (LDAP) 策略来调整这些限制。 有关详细信息,请参阅 KB 315071。
自由访问控制列表和安全访问控制列表中的最大条目数
此限制适用于使用 ntSecurityDescriptor 属性在 Active Directory 对象的自由访问控制列表 (DACL) 和安全访问控制列表 (SACL) 中可以有多少条目。 限制本身基于访问控制列表 (ACL) 的大小限制,即 64K。由于访问控制项 (ACE) 的大小可能因包含一个或多个全局唯一标识符 (GUID) 而有所不同,因此实际的最大条目数 (SID) 可能在 1,100 到 1,820 之间。 有关详细信息,请参阅安全描述符和访问控制列表的工作原理。
安全主体的组成员身份
安全主体(如用户、组和计算机帐户)最多可以是 1,015 个组的成员。 此限制是因为你为每个安全主体创建的访问令牌具有大小限制,该限制不受组嵌套方式的影响。 有关详细信息,请参阅 KB 328889。
有关域控制器如何创建用于授权决策的数据结构的详细信息,请参阅以下文章:
FQDN 长度限制
Active Directory 中的完全限定的域名 (FQDN) 的总长度不能超过 64 个字符,包括连字符和句点。 存在此限制是因为,存储在 SYSVOL 共享中的 Win32 应用程序编程接口 (API) 和组策略对象 (GPO) 将 MAX_PATH 值定义为 260 个字符。 有关详细信息,请参阅 KB 909264。
文件名和路径限制
Active Directory 组件使用的物理文件(例如,SYSVOL、数据库 (NTDS.DIT) 和日志文件路径)受 Win32 API 定义的 260 个字符的 MAX_PATH 长度的限制。 在 Active Directory 安装期间决定将 SYSVOL 和数据库文件放置在何处时,请避免嵌套文件夹结构,因为这些结构会使 Active Directory 中任何物理文件的完整文件路径超过 260 个字符。
其他名称长度限制
KB 909264 中介绍的以下名称长度限制也适用于 Active Directory 中的资源和文件名:
NetBIOS 计算机和域名的长度只能为 15 个字符。
域名系统 (DNS) 主机名的长度只能为 24 个字符。
OU 名称的长度只能为 64 个字符。
架构中的名称长度限制
该架构对 Active Directory 对象的属性名称施加以下默认限制:
显示名称长度只能为 256 个字符,如 Display-Name 属性中所述。
公用名长度只能为 64 个字符,如 Common-Name 属性中所述。
SAM-Account-Name 属性在架构中的长度只能为 256 个字符。 但是,出于向后兼容性的原因,用户的 Active Directory 限制为 20 个字符。 有关详细信息,请参阅 SAM-Account-Name 属性。
LDAP 简单绑定操作的名称长度限制
在绑定到目录期间,简单 LDAP 绑定操作将用户的可分辨名称 (DN) 限制为 255 个字符。 如果尝试使用超过 255 个字符的简单 LDAP 绑定,则可能会遇到以下身份验证错误:
Error <49>: ldap_simple_bind_s() failed: Invalid Credentials
Server error: 80090308: LdapErr: DSID-0C0903AA, comment: AcceptSecurityContext error, data 57, v1771
Error 0x80090308 The token supplied to the function is invalid
通过确保尝试绑定到目录的应用程序、脚本和实用工具使用安全 LDAP 绑定,可以避免此问题。 还可以尝试减少 OU 结构的深度或 OU 名称的长度。 例如,以下可分辨名称为 261 个字符:
CN=BobKelly,OU=CorporateVicePresidents,OU=CorporateOfficers,OU=ViewOfPugetSoundOffices,OU=TopFloor,OU=Building1557,OU=CorporateCampus,OU=Redmond,OU=Washington,OU=NorthWestern,OU=UnitedStatesOfAmerica,OU=NorthAmerica,DC=BusinessGroup,DC=humongousinsurance,DC=com
如果将名为 CorporateVicePresidents
的 OU 缩短为 CVP
,则 BobKelly
用户帐户的可分辨名称现在只有 242 个字符,因此在限制范围内。
应用的 GPO 的最大数量
Active Directory 将可应用于用户或计算机帐户的 GPO 数量限制为 999。 此限制并不意味着系统上的策略设置总数限制为 999。 相反,单个用户或计算机无法处理超过 999 个 GPO。 存在此限制是为了防止同时处理太多 GPO 造成的性能问题。
信任限制
信任限制适用于受信任的域对象 (TDO)、信任路径长度以及客户端发现可用信任的能力。 Active Directory 的信任限制包括以下限制:
Kerberos 客户端最多可以遍历 10 个信任链接,以在另一个域中查找请求的资源。 如果域之间的信任路径超过此限制,则尝试访问域会失败。
当客户端搜索信任路径时,搜索仅限于直接与域建立的信任和林中可传递的信任。
之前的测试表明,如果组织中的 Active Directory 实现包含超过 2,400 个 TDO,则完成 TDO 相关操作(如跨域身份验证)的时间增加会显著降低性能。
有关信任限制的详细信息,请参阅信任的实际限制。
每个 LDAP 事务的最大帐户数
当编写执行 LDAP 事务的脚本或设计应用程序时,建议你每个 LDAP 事务执行的操作不超过 5,000 个。 LDAP 事务是一组被视为一个单元的目录操作,如添加、删除和修改。 如果在一个 LDAP 事务中执行 5,000 多个操作,则可能会遇到资源限制和操作超时的风险。如果遇到该问题,事务中的所有操作都将回滚,导致你丢失在事务期间所做的任何更改。 若要详细了解提交更改的 LDAP 数据结构,请参阅 LDAPModA 结构。
建议组中的最大用户数
对于 Windows 2000 Active Directory 环境,建议组中的最大成员数为 5,000。 此建议基于单个数据库事务中可以提交的并发原子更改的数量。
从 Windows Server 2003 开始,将离散更改复制到链接的多值属性的能力作为一种称为“链接值复制 (LVR)”的技术引入。 若要启用 LVR,必须将林功能级别至少提高到 Windows Server 2003 临时级别。 提高林功能级别会改变组成员资格(和其他链接的多值属性)在数据库中的存储方式,以及在域控制器之间的复制方式。 这允许在 Windows 2000 的林功能级别上,组成员资格的数量超过以前为 Windows 2000 或 Windows Server 2003 推荐的 5,000 个限制。
到目前为止,该领域的测试尚未揭示对组中成员数量或任何其他链接的多值属性的任何新的建议限制。 据报道,生产环境的成员已超过 400 万,Microsoft 可伸缩性测试达到 5 亿个成员。
重要
将林功能级别提高到 Windows Server 2003 临时版或更高版本不会修改现有组成员的存储或复制方式。 为此,必须删除在林功能级别增加到 Windows Server 2003 之前添加到组中的成员,然后将其重新添加到相应的组中。 在林功能级别增加后添加或删除的任何组成员都将启用 LVR,即使该组包含未启用 LVR 的其他成员。 有关链接属性的更多信息,请参阅链接属性。 有关复制过程的详细信息,请参阅 Active Directory 复制模型的工作原理。
林中建议的最大域数
下表列出了每个域功能级别的建议最大域数。
域功能级别 | 建议的最大域数 |
---|---|
Windows 2000 服务器 | 800 |
Windows Server 2003 | 1,200 |
Windows Server 2025 | 3,000 |
Windows Server 2003 的 1,200 限制是 Windows Server 2003 中多值的无链接属性的限制。 有关详细信息,请参阅“数据存储的工作原理”(/previous-versions/windows/it-pro/windows-server-2003/cc772829(v=ws.10)) 中的“最大数据库记录大小”。
建议域中域控制器的最大数量
建议将每个域使用的域控制器数量限制在 1,200 个。 此限制可确保在发生灾难时能够可靠地恢复 SYSVOL。
如果希望网络中有 1,200 多个域控制器,并且这些域控制器托管 Active Directory 集成的域名系统 (DNS) 区域,建议查看 KB 267855,以便进行规划。
建议的最大 Kerberos 票证大小
Kerberos 票证的最大建议大小为 48,000 字节。 你可以通过在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lsa\Kerberos\Parameters 注册表中配置 MaxTokenSize REG_DWORD 值或通过组策略来设置票证大小,如 KB 938118 所述。
注意
MaxTokenSize 的最大允许值为 65,535 字节。 如果使用 Kerberos 进行 IP 安全 (IPsec) 密钥管理,则限制为 65,536 字节。 但是,由于身份验证上下文令牌的 HTTP base64 编码,建议不要将 maxTokenSize 注册表项设置为大于 48,000 字节的值。 从 Windows Server 2012 开始,MaxTokenSize 注册表项的默认值为 48,000 字节。
有关 Kerberos 票证的详细信息,请参阅用于对 Kerberos 进行故障排除的其他资源。
非链接属性值的最大数目
Active Directory 数据库将非链接属性值存储在必须适合数据库页的链接目录中。 由于这种大小要求,仅承载一个属性的对象的非链接属性的最大限制为 1,200。 在 Windows Server 2025 林中,可以将限制增加到最多 3,000。
在实际部署中,当对象接近非链接属性限制时,就会开始出现错误。 这些类型的错误的状态代码为 0x00000b,并映射到字符串“已超过服务器上的 LDAP_ADMIN_LIMIT_EXCEEDED 管理限制”。
有关限制的详细信息,请参阅 AD 数据库详细信息文章、单个 DNS 名称上的许多 DNS 记录,以及 Active Directory 复制错误 8304:已超过对象的最大大小。
Active Directory 对象的最大大小
若要更改具有大量数据的属性,必须将新值和旧值存储在数据库事务中。 如果数据库在事务进行到一半时关闭,则可以通过存储值来回滚事务。 事务的最大大小将属性值数据的总 blob 大小限制为 5 MB。
可以执行的 Active Directory 事务的最大大小还会影响在链接值复制之前可以拥有的组成员数,以及组成员资格更改中存在的事务数量。