如果面向主机名,LDAP 服务的新会话设置所需的时间比预期长

本文讨论一个问题:如果 LDAP 服务面向主机名,则 LDAP 服务的新会话设置花费的时间比预期长。

原始 KB 数: 4559609

现象

以主机名为目标的轻型目录访问协议 (LDAP) 查询随机花费的时间比预期的响应时间长。

此外,可以在事件日志中记录 DNS 客户端事件,例如以下内容:

日志名称: 系统
源:Microsoft-Windows-DNS-Client
事件 ID:1014
级别: 警告
用户: 网络服务
说明:
名称_ldap._tcp 的名称解析。<site>._sites.<名称> 在未响应任何配置的 DNS 服务器后超时。

注意

在此日志条目中 <,名称> 参数可以是以下任一项:

  • 域 NETBIOS 名称
  • 域控制器主机名
  • 域控制器 DNS FQDN 主机名

此问题会导致多个影响管理员、用户和应用程序的问题。 这些问题包括但不限于:

  • 与 Windows Server 2008 R2 域控制器(DC)或更高版本的 DC 建立 LDAP 连接大约需要 6 秒。 与 Windows Server 2003 或 Windows Server 2008 DC 建立的相同连接通常不到一秒。 发生这种情况时,后续 LDAP 操作(如绑定和 LDAP 搜索)在初始 LDAP 连接后似乎没有额外的延迟。
  • 无论是否使用/Sparameter,LDIFDE.EXE 命令都是缓慢的。
  • Microsoft System Center Active Directory 管理包(SCOM ADMP)运行状况检查脚本(AD_General_Response.vbs)运行速度缓慢。
  • Microsoft Active Directory 用户和计算机(ADUC)启动速度缓慢或打开 OU 容器的速度较慢。 Active Directory 用户和计算机管理单元 DSA 中的扩展。MSC 使用 DC FQDN 计算机名称作为域名。
  • Microsoft Active Directory 管理中心中的 Active Directory 管理中心 (ADAC) 扩展使用 DC FQDN 计算机名称作为域名。
  • Microsoft组策略管理控制台(GPMC)不一致地使用名称解析标志。
  • 发出引用 DC 完全限定 DNS 名称的 LDAP 调用的 Visual Basic 脚本 (VBS) 脚本运行速度缓慢。
  • 使用 System.DirectoryServicesSystem.DirectoryServices.Protocols 的 .NET Framework 应用程序在创建服务器会话时可能会遇到延迟。

原因

从 Windows 7 和 Windows Server 2008 R2 开始,Windows 引入了名称查找行为的更改,以解决两个早期问题方案:

  • 每当 NetBIOS 域名作为 LDAP 连接中的主机名提供时,LDAP 客户端都会回退到 NTLM。
  • 如果客户端的名称与目标 NetBIOS 域名相同,则 LDAP 客户端不会连接到域中的 DC。

发生延迟的原因是以下两个条件之一为 true:

  • 你遇到广播响应的长时间等待时间。 如果通过广播通过 TCP/IP (NetBT) 名称解析的 NetBIOS 关闭,则看不到此延迟。
  • DNS 名称解析的延迟发生,因为应用程序查询不存在的多个 DNS 名称。

可以在网络跟踪中观察到延迟,该跟踪显示运行 NetBIOS 名称查找的 LDAP 客户端在运行 DNS 查找以查找应用程序主机(请参阅图 A)之前对“[HOSTNAME]<0x1C>”记录运行。

图 A

Microsoft网络监视器窗口的屏幕截图,其中包含网络跟踪,包括0x1C记录。

Windows Server 2003 或 2008 LDAP 客户端的网络跟踪显示,它直接运行主机的 DNS 查找,而无需对“0x1C>”<记录执行 NetBIOS 查找。

图 B

具有 Windows Server 2003 或 2008 LDAP 客户端网络跟踪的Microsoft网络监视器窗口的屏幕截图。

对于 DNS,你将看到名称查询以 DC 计算机名称结尾的名称,如下所示:

_ldap._tcp。Default-First-Site-Name._sites。ADDC01.contoso.com
_ldap._tcp。ADDC01.contoso.com
_ldap._tcp。Default-First-Site-Name._sites。ADDC01
_ldap._tcp。ADDC01

解决方法

按主机名而不是域名定位 LDAP 服务器时,应使用 LDAP_OPT_AREC_EXCLUSIVE会话选项 来指示目标是主机名而不是域名。

根据所使用的编程接口,此选项的设置方式不同。 使用以下信息作为参考。

Wldap32

如果为HostNameparameter 传递 Active Directory DNS 服务器名称, 则应调用 ldap_set_option 以在调用创建实际连接的任何 LDAP 函数之前设置LDAP_OPT_AREC_EXCLUSIVE标志。

执行此操作会强制 A 记录查找,并在计算机解析主机名时绕过任何 SRV 记录查找。 在某些情况下,它会提高网络性能。 例如,在使用拨号连接的分支机构中,使用 A-Record 查找可以避免在解析名称时强制拨号查询远程 DNS 服务器以获取 SRV 记录。

ADSI

如果必须指定服务器,请使用ADS_SERVER_BIND标志来避免对 DNS 服务器进行不必要的或不正确的查询。 有关详细信息,请参阅 ADsOpenObject() 和相关函数的文档。

System.DirectoryServices

如果 ADsPath 包含服务器名称,请在使用 LDAP 提供程序时指定 AuthenticationTypes.ServerBind 标志。 不要将此标志用于包含域名或无服务器路径的路径。 指定服务器名称而不指定此标志会导致不必要的网络流量。

例如:

DirectoryEntry ent = new DirectoryEntry(“LDAP://server01”,null,null,AuthenticationTypes.ServerBind;

System.DirectoryServices.Protocols

准备新的 LDAP 连接时,请包含使用主机名和要联系的可选端口构造的 LdapDirectoryIdentifier 对象,并且还包括<设置为 True 的 fullyQualifiedDnsHostName> 参数。

Windows 7、Windows Server 2008 R2 和更高版本中的新默认行为可以还原为 Windows 7 之前的行为。 这可能会重新引入影响 NetBIOS 名称的问题,如“原因”部分中所述。 但是,在某些情况下,预 Windows 7 行为可提供更好的结果。 因此,哪个设置产生更好的结果取决于主要的 LDAP 客户端使用方案。

长期解决方案应始终是让应用程序在调用 LDAP、ADSI 或 .NET 接口时使用具有适当标志的服务器和域名。 当目录服务客户端代码必须在不明确的情况下决定解析方法时,应使用正确的标志使应用程序独立于方案依赖项。

可以通过设置以下注册表值来还原到 Windows 7 之前的行为:

子项:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LDAP
条目: UseOldHostResolutionOrder
类型: REG_DWORD
值数据:1

作为其他方法,可以使用 NetBt 广播来关闭名称解析。 请参阅 819108设置,以最大程度地减少定期 WAN 流量 以将 NodeType 配置为“p-mode”。

节点的配置

  • 对混合节点或 h 节点使用0x00000008
  • 将0x00000004用于混合节点或 m-node
  • 对点到点 WINS 或 p 节点使用0x00000002
  • 将0x00000001用于广播节点或 b 节点

名称解析节点类型

  • B 节点(广播):使用广播解析名称。 (不建议用于大型网络。
  • P-Node(对等):仅使用 WINS,不进行广播。 无 WINS 服务器,无解决方法。
  • M-Node (混合):首先广播,然后是 WINS。 (不建议这样做,因为你想要最小化广播。
  • H-Node (混合) - 首先使用 WINS,然后广播。 (建议这样做,因为它首先尝试 WINS 并仅作为最后手段进行广播来减少广播的数量。

参考

有关详细信息,请参阅以下文章:

Ldap_init 函数

LDAP 会话选项 (请参阅LDAP_OPT_AREC_EXCLUSIVE,0x98)

ADSI 函数 AdsopenObject

具有ADS_SERVER_BIND值的 ADSI AuthenticationEnum

具有 ServerBind 值的 S.DS AuthenticationTypes 枚举

S.DS.具有 fullyQualifiedDnsHostName 标志的 P LdapDirectoryIdentifier 构造函数