使用 Event1644Reader.ps1 分析 Windows Server 中的 LDAP 查询性能

本文介绍一个脚本,可帮助分析 Windows Server 中的 Active Directory 事件 ID 1644。 查看使用脚本的步骤,然后分析问题

原始 KB 数: 3060643

关于 Event1644Reader.ps1 脚本

Active Directory 事件 ID 1644 记录在目录服务事件日志中。 此事件标识 Active Directory 域控制器提供服务的昂贵、效率低下或较慢的轻型目录访问协议 (LDAP) 搜索。 NTDS 常规事件 ID 1644 可以筛选为记录目录服务事件日志中的 LDAP 搜索,具体取决于访问的 Active Directory 数据库中的对象数、返回的对象数或域控制器上的 LDAP 搜索执行时间。 有关事件 ID 1644 的详细信息,请参阅 修补程序2800945将性能数据添加到 Active Directory 事件日志

Event1644Reader.ps1 是一个 Windows PowerShell 脚本,用于从保存的目录服务事件日志中托管的 1644 个事件中提取数据。 然后,它将该数据导入到Microsoft Excel 电子表格中的一系列数据透视表中,以帮助管理员深入了解域控制器和正在生成这些查询的客户端正在服务的 LDAP 工作负荷。

如何获取脚本

可以从核心基础结构和安全博客文章 中获取脚本:如何在 Active Directory 中查找成本高昂、效率低下且长时间运行的 LDAP 查询。

注意

该脚本附加在名为Event1644Reader.zip的博客文章中

脚本中心免责声明
任何Microsoft标准支持程序或服务都不支持示例脚本。 示例脚本按原样提供,没有任何保证。 Microsoft进一步否认所有默示担保,包括不限于适销性或针对特定用途的适用性的任何默示担保。 示例脚本和文档的使用或性能导致的整个风险依然存在。 在任何情况下,不得Microsoft、其作者或参与创建、制作或交付脚本的任何其他人对任何损害负责(包括但不限于业务利润损失、业务中断、业务中断、业务信息损失或其他经济损失)因使用或无法使用示例脚本或文档而导致的损害。 即使Microsoft被告知这种损害的可能性。

联机对等支持
对于在线对等支持,请加入 官方脚本家伙论坛! 若要在示例脚本中提供反馈或报告 bug,请在此脚本的“ 讨论 ”选项卡上开始新的讨论。

如何使用脚本

若要更好地分析事件 ID 1644 中捕获的 LDAP 查询,请执行以下步骤:

  1. 请确保要对已增强的 ** 1644 事件元数据进行故障排除的域控制器。

    注意

    Windows Server 2012 R2 通过记录 LDAP 查询和其他元数据的持续时间添加了增强型 1644 事件日志记录。 增强的 1644 事件日志记录通过修补程序 2800945向 Windows Server 2012、Windows Server 2008 R2 和 Windows Server 2008 回移植。

  2. 将以下 Field Engineering 注册表项的值设置为 5: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics\Field Engineering

    注意

    将字段工程日志详细程度设置为 5 将导致目录服务事件日志中记录其他事件。 当你未主动收集 1644 事件时,将现场工程重置回其默认值 0。 (此操作不需要重启。

  3. 如果存在以下注册表项,请将值更改为所需的阈值(以毫秒为单位)。 如果特定注册表项不存在,请创建一个具有该名称的新条目,然后将其值设置为所需的阈值(以毫秒为单位)。

    注册表路径 Data type 默认值
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters\Search Time Threshold (msecs) DWORD 30,000
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters\Expensive Search Results Threshold DWORD 10,000
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters\低效搜索结果阈值 DWORD 1,000

    注意

    • 启用字段工程日志记录级别且未使用搜索时间阈值(毫秒)注册表项或设置为 0 时,时间阈值的默认值为 30,000 毫秒。 (此操作不需要重启。
    • 一种策略是设置低效搜索结果阈值和昂贵的搜索结果阈值注册表设置的注册表值,然后专注于搜索时间保留(毫秒)标识的事件。 从较大的值(如 100 毫秒)开始,然后在优化环境中发生的查询时增量减小该值。
    • Event1644Reader.ps1 可以分析来自多个域控制器的事件。 在要查看 LDAP 搜索的所有域控制器上配置字段工程、搜索时间、成本高昂和效率低下的注册表项设置。
  4. 从下载 Event1644Reader.ps1 文件,可以从核心基础结构和安全博客文章 中获取脚本:如何在 Active Directory 中找到昂贵、低效且长时间运行的 LDAP 查询,并将其分析保存的 Active Directory 服务 EVTX 文件(其中包含 1644 个事件)。

    此计算机应已安装 Microsoft Excel 2010 或更高版本,并且应该有足够的磁盘空间来托管脚本将分析的目录服务事件日志。

  5. 将包含 1644 事件的已保存目录服务事件日志从启用了 1644 事件日志记录的域控制器复制到 1644 分析计算机。

  6. 在 Windows 资源管理器中,右键单击 Event1644Reader.ps1 文件,然后选择“ 使用 PowerShell 运行”。

    下面是此步骤的屏幕截图:

    右键单击 Event1644Reader.ps1 文件,然后选择“使用 PowerShell 运行”。

  7. 按 Y 根据需要绕过 PowerShell 执行策略。

  8. 指定要分析的 EVTX 文件的路径。

  9. 出现提示时,如以下屏幕截图所示,请执行以下操作:

    有关运行 Event1644Reader.ps1 文件的 PowerShell 命令。

    • 按 Enter 分析与 Enent1644Reader.ps1 文件位于同一目录中的所有 EVTX 文件。
    • 键入 drive:\path 包含要分析的 EVTX 文件的路径。

    注意

    Event1644Reader.ps1 在脚本每次运行时都位于目标路径中的所有高级目录服务事件日志中分析 1644 事件。

  10. 打开工作表以查看数据并演练一系列选项卡,然后根据需要保存 Excel 电子表格。 有关工作表中的选项卡的详细信息,请参阅 由 1644Reder.ps1 部分创建的 Excel 电子表格的演练。

    注意

    *不会自动删除该工具生成的.csv文件。 考虑在调查完成后清除 *.csv文件。

详细信息

Event1644Reader.ps1 创建的 Excel 电子表格演练

Event1644Reader.ps1 从保存的目录服务事件日志中的 1644 个事件中提取元数据,并将该数据导入 Microsoft到 Excel 电子表格中的一系列选项卡式工作表中。

下表汇总了每个选项卡中包含的数据:

Tab 说明
RawData 事件 ID 1644 捕获的每个数据字段将导入离散列。 自动启用数据筛选,以便可以对任何列标题进行排序或筛选。 如果来自多个域控制器的 1644 事件日志驻留在与 PowerShell 脚本或管理员指定的目录相同的目录中,请使用筛选器查看面向特定域控制器的 LDAP 查询。
Top_StartingNode 提供给定示例中 LDAP 查询所针对的目录分区的排序列表。 如果大多数查询发生在单个分区(架构、配置或域),请考虑将该分区添加为剩余数据透视表中的筛选器。 钻取详细信息公开顶部筛选器(例如 LDAP 查询)、颁发这些查询的客户端 IP,以及这些查询的日期和时间戳。
Top_Callers 列出在降序搜索计数顺序中发出 LDAP 查询的客户端 IP 地址,其百分比为总计。 运行总数的百分比有助于识别排名靠前的呼叫者。 (也就是说,前 10 个或 20 个调用方可能会生成 80% 的查询量,假设调用过多是你的问题)。 钻取详细信息公开给定示例中每个客户端颁发的 LDAP 查询的筛选器和日期和时间步骤。
Top_Filters 按降序列出最常颁发的 LDAP 查询。 这包括平均搜索时间。 钻取详细信息公开 LDAP 客户端的 IP 地址以及提交每个查询的日期和时间。
TotalSearchTime by Callers 列出示例中所有 LDAP 查询的客户端 IP 地址,按总搜索时间的降序顺序列出。 钻取详细信息标识 LDAP 查询以及发出每个查询的日期和时间。
TotalSearchTime by Filters 按总搜索时间的降序列出 LDAP 查询。 钻取详细信息公开 LDAP 客户端的 IP 地址以及提交每个匹配查询的日期和时间。
搜索时间排名 显示在基于时间的四分位数中发生的 LDAP 查询数。 查询速度较慢。 如果查询不是太频繁地发出,则查询速度更快。 Microsoft Exchange 希望 Exchange 服务器颁发的 LDAP 查询在 50 毫秒或更少时间内解析。 因此,第一个四分位数组侧重于该时间“存储桶”。
空白透视 这是一个空白数据透视表,可以根据需要更改以显示方案的特定数据。

方案分析

如果 LDAP 查询速度缓慢,或者域控制器上的 CPU 使用率较高,则可能是由于查询过多、查询效率低下、这些查询的某种组合、异步线程队列(ATQ)池耗尽或大量更改通知造成的。

如果客户端发出昂贵、低效或大量 LDAP 查询,请使用 Event1644Reader.ps1 在域控制器上收集数据,以识别客户端的 IP 地址。 然后,将此类查询映射到客户端计算机上的进程 ID、进程名称或调用应用程序。

下表列出了此问题的可能优化。

优化/缓解 摘要
停止过多的工作负荷。 如果大量或 LDAP 查询导致服务停止,请专注于顶级调用客户端,并努力识别和消除过多工作负荷的来源。

用于标识应用程序的可能选项包括使用 PROCMON、ETL/ETW 跟踪和调试分析来确定在客户端上生成 LDAP 查询的应用程序。 另一种策略是使用对服务进行顶端或删除生成 LDAP 查询的应用程序的除以两种方法。 颁发的查询可能会涉及调用应用程序或进程。
安装更新的 LDAP 查询优化器。 Windows Server 2012 R2 包含更新的 LDAP 查询优化器,可提高大多数查询的性能。 Windows Server 2012 R2 的子集在修补程序2862304中向后移植到 Windows Server 2008 R2 和 Windows Server 2012
确保客户端将查询提交到站点最佳域控制器。 通过 WAN 发送 LDAP 查询会导致将 LDAP 查询传送到域控制器及其回复客户端的网络延迟。 确保 Active Directory 中的客户端和服务器计算机存在 Active Directory 站点和子网定义。

确保应用程序没有对远程站点域控制器的硬编码引用,也不要在站点最佳域控制器存在时读取可写域控制器。
与软件开发人员合作,降低发出查询的频率。 这包括使用缓存。 如果查询颁发得太频繁,甚至有效发出的查询也会降低适当大小和配置的域控制器。
应用程序可能需要限制其查询量或缓存查询结果,以减少网络、LDAP 和 CPU 负载。
优化 LDAP 查询以更快地执行。 查询语法可能需要重构才能更快地执行。
将查询元素移到筛选器的左侧或右侧可以提高性能。
添加双重“not”可能会提高查询性能。
请考虑减少通过树中较低的查询来访问的对象数。
减少查询返回的属性数。
根据需要向 Active Directory 属性添加索引。 添加索引可以提高查询性能。 这有增加数据库大小的副作用,在索引生成期间可能会暂时延迟 Active Directory 复制。
确定查询优化器和其他组件中是否存在代码缺陷。 LDAP 查询优化器和其他组件中的缺陷可以减少吞吐量。

已知问题

Excel 电子表格中的值不会在使用非英语语言的计算机上正确显示或呈现。

例如,当 Get-Culture Windows PowerShell cmdlet 指示区域设置时,会出现这种情况:

PS C:\Windows\System32\WindowsPowerShell\v1.0> Get-Culture  
LCID Name DisplayName  
---- ---- -----------
1031 de-DE German (Germany)

PS C:\Windows\System32\WindowsPowerShell\v1.0> Get-UICulture

LCID Name DisplayName  
---- ---- -----------
1033 en-US English (United States)

在这种情况下,Excel 电子表格中的数字将按以下屏幕截图所示呈现:

Excel 电子表格问题中的数字。

若要解决此问题,请将十进制符号更改为 控制面板“区域设置”项中的句点(.)。

有关 LDAP 查询的详细信息,请参阅以下博客: 如何在 Active Directory 中查找昂贵、低效和长时间运行的 LDAP 查询