通过 Wireshark 查看 LDAP 流量时,我很好奇想了解 Windows 客户端和 Active Directory 之间的对话。每次对话的大小不超过 80k 字节。但有时对话大小会达到 2.5-3MB。有人能解释一下 Windows 客户端向 AD 提出的查询类型以及交换的数据包大小吗?我有包含有效载荷数据的数据包捕获,但不确定如何读取它。我知道有一种启动对话的方法,那就是使用“gpupdate /force”命令。我还想知道 Windows 中还有哪些其他内部处理启动了查询?
答案1
Active Directory 在 LDAP 目录中并不常见,因为它通常具有非常大的有效负载。事实上,您可以发送的最大有效负载是 12 MB。这似乎大得离谱,但事实就是如此。
在输入端,有人可能会发送类似 (|(samAccountName=jsmith)(samAccountName=jdoe)(...)(samAccountName=zsmith)) 的查询并指定单独的通配符或一起。
在输出方面,导致负载过大的一个常见原因是分页。当您有一个返回多个结果的查询时,响应可能会非常大。AD 内置了对分页的支持,而且很容易实现,因此对所有对象进行一次简单的查询就可以返回数 GB 的响应。
另一种情况是未在查询中指定所需的实际属性。如果未指定,则可能会返回对象的所有属性(构造的属性除外),而 AD 对象可能具有很多属性。
3 MB 的有效负载实际上很有趣,因为如果您有 Exchange,那么当有人登录时,这将是 DC 返回到工作站的数据量。这是 ADSI 架构属性。如果您在本地网络上,这可能不明显,但如果您有远程客户端和有限的网络带宽,每天下载 ADSI 架构属性可能会非常明显。
有关 ADSI 架构缓存下载的更多信息:
当用户登录工作站时,工作站会检查 ADSI 架构属性是否尚未下载,或者保存在注册表中的modifyTimestamp属性是否比存储在AD中的属性更旧。注册表如下所示:
[HKEY_CURRENT_USER\Software\Microsoft\ADs\Providers\LDAP\CN=Aggregate,CN=Schema,CN=Configuration,DC=contoso,DC=com]
"Time"="20141114030449.0Z"
比较的AD属性:
DN:CN=Schema,CN=Configuration,DC=contoso,DC=com
属性:modifyTimestamp
修改时间是“构造”属性。AD 采用其他属性中最新的 whenChanged 日期来确定修改时间。您可以通过运行 repadmin /showObjMeta CN=Schema,CN=Configuration,DC=contoso,DC=com 查看 whenChanged 日期
一个理性的人会认为用户会下载一次 ADSI 架构缓存,并且不需要再次下载,因为 AD 架构不会经常更改。但是,modifyTimestamp 并不只指示 AD 架构何时更新,因为客户可以执行自己的架构更新。
备份就是一个问题。在域控制器上执行系统状态备份时,备份信息会记录在分区的 dsaSignature 属性中。这反过来会导致客户端工作站和成员服务器确定它们需要再次下载 ADSI 架构缓存。在本地网络上,这并不明显,但如果您的 WAN 带宽有限,将客户端和域控制器分隔开来,这可能会非常麻烦。
更复杂的是,当 2008 R2 SP1 发布时,modifyTimestamp 功能实际上无法正常工作。Microsoft 使用修补程序纠正了此问题,这实际上可能会导致 ADSI 架构缓存性能下降。
作为一种解决方法,可以在架构分区的 dsaSignature 属性上设置一个标志,以指示备份在备份完成时不更新 dsaSignature 属性。这将阻止modifyTimestamp不断递增,并将停止下载ADSI架构属性。缺点是您的监控应用程序可能会抱怨架构分区未被备份。另一种选择是您可以创建一个GPO来将“时间”注册表值标记为遥远的未来日期,但那将是一个临时解决方案。
答案2
@greg
我遇到了一个非常类似的情况,远程站点的网络带宽有限。我有大约 3000 个端点,它们与本地域控制器的连接很小。带宽约为 60mbps。我们注意到,当我们运行架构更新或域/林准备时,这会导致这些工作站完全用 ldap 调用饱和此连接。第一次发生在 Exchange CU 更新期间,CU 需要架构更新。第二次发生在我们将第一个服务器 2019 域控制器提升到环境中并且需要域/林准备时。我们无法弄清楚在带宽受限时这些工作站正在下载什么。
工作站是否需要下载架构的本地副本?当发生更改时,它们是否需要下载域\林说明的副本?