本文讨论一个问题:如果 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.DirectoryServices 和 System.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
Windows Server 2003 或 2008 LDAP 客户端的网络跟踪显示,它直接运行主机的 DNS 查找,而无需对“0x1C>”<记录执行 NetBIOS 查找。
图 B
对于 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 会话选项 (请参阅LDAP_OPT_AREC_EXCLUSIVE,0x98)
ADSI 函数 AdsopenObject
具有ADS_SERVER_BIND值的 ADSI AuthenticationEnum
具有 ServerBind 值的 S.DS AuthenticationTypes 枚举
S.DS.具有 fullyQualifiedDnsHostName 标志的 P LdapDirectoryIdentifier 构造函数