HOW TO:使用 DNSLint 解决 Active Directory 复制问题
本文介绍了如何使用 DNSLint 工具来解决 Active Directory 复制问题。

Active Directory
是一个分布式数据库。它用于存储关于网络上的对象的信息,并让用户访问这些信息。Active Directory 复制用于同步一个 Active Directory 目录林中不同域控制器上的分区副本。此复制过程允许用户从网络上的任何地方访问信息。如果此复制过程无法按设计的方式工作,以下依赖于来自 Active Directory 的信息的服务可能会发生中断:域登录和对网络资源(例如文件和打印机)的访问。

Active Directory
复制依赖于域名系统 (DNS) 将名称解析为所需的 IP 地址。一个 Active Directory 域控制器一般会在它的 netlogon 服务启动时将各种 DNS 记录注册到它的已配置的 DNS 服务器。DNSLint 是一个运行于 Windows 2000 和更新的操作系统上的 Microsoft Windows 实用工具。其用途之一是帮助您解决 Active Directory 复制问题。具体来说,它可以帮助您判断两个问题:
是不是所有应当对一个 Active Directory 目录林的根目录具有管理权的 DNS 服务器实际上都有必要的 DNS 记录——这些记录可用于成功地同步一个 Active Directory 目录林中的不同域控制器上的分区副本。DNSLint 会判断每一个管理 DNS 服务器中缺少哪些 DNS 记录。
一个特定的 Active Directory 域控制器是否能够解析所有必要的 DNS 记录来成功地同步一个 Active Directory 目录林中的不同域控制器上的分区副本。DNSLint 会判断哪些 DNS 记录不能被所测试的域控制器解析。
疑难解答
如果一个 Active Directory 域控制器想要用另一个域控制器复制,它会使用 DNS 去寻找其他域控制器。具体过程如下:
1.
启动复制过程的域控制器 (DC1) 查询 Active Directory 来寻找它的已配置的复制伙伴。这些复制伙伴一般是由知识一致性检查器 (KCC) 来定义的,但是也可以手动定义。 有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
244368 如何优化大型网络中的 Active Directory 复制
DC1 只知道它要用其进行复制的域控制器 (DC2) 的名称。它在 Active Directory 中发现了一个与目标域控制器的名称 (DC2) 相匹配的 GUID。注意,目录林中的每一个域控制器都应该拥有自己的唯一的 GUID
2.
既然 DC1 知道 DC2 GUID,它必须找到 DC2 IP 地址,才能通过网络连接到它。为此,DC1 需要使用 DNSDC1 向其本地配置的 DNS 服务器发送一个递归 DNS 查询,查询是否有 CNAME 记录。此记录的格式总是匹配以下格式
guid._msdcs.root of Active Directory forest
其中 guid DC1 Active Directory 中找到的 GUIDroot of Active Directory forest Active Directory 目录林的根。例如
91f9b084-4876-4b59-be17-59e74c340221._msdcs.reskit.com
其中 91f9b084-4876-4b59-be17-59e74c340221 是一个 GUIDreskit.com 是此 Active Directory 目录林的根。

DC1
的本地已配置的 DNS 服务器将使用一个别名来对查询 CNAME 的操作给出响应。此别名是 GUID 的另一个名称。例如,GUID 91f9b084-4876-4b59-be17-59e74c340221 将被解析为 dc-02.reskit.com
3.
既然 DC1 知道此 GUID 的别名,它必须将此别名解析为一个 IP 地址,以便它能够通过网络连接到 DC2DC1 向本地配置的 DNS 服务器发送一个递归 DNS 查询,查询是否有与此别名相匹配的主机 (A) 记录。DNS 服务器应当用已经映射到此别名的 IP 地址作出响应,例如,169.254.66.7
4.
DC1 知道 DC2 IP 地址后,它就能够通过网络连接到 DC2 并复制 Active Directory 数据。
如果此过程不成功,则不同的域控制器之间的 Active Directory 复制也不会成功,因而不同的域控制器上的数据就可能会变得不一致。DNSLint 可以帮助确定此过程中使用的 DNS 记录是否就绪,以及是否能够被解析。
1.
要确定 Active Directory 目录林中的不同域控制器之间的 Active Directory 复制问题是不是 DNS 引起的,请运行以下命令:
dnslint /ad 169.254.32.1 /s 169.254.10.22
其中的 /ad 参数用于指定一个 Active Directory 域控制器,此域控制器可用于查找在 Active Directory 目录林中的所有域控制器的 GUID。默认情况下,一个目录林下的所有域控制器都应拥有此信息。当您使用 /ad 功能时,需要使用 /s 选项。/s 选项用于告诉 DNSLint 一个对 _msdcs.forest root 区域具有管理权的 DNS 服务器的 IP 地址。

当您运行此命令时,DNSLint 首先联系在 /ad 开关 (169.254.32.1) 后指定的 Active Directory 域控制器。此命令导致 DNSLint 向此域控制器上的 Active Directory 查询 Active Directory 目录林中的所有 GUID。具体来说,它查询 Active Directory 中的以下位置
CN=NTDS Settings, CN=Sites,CN=Configuration,DC=reskit,DC=com
此处的 DC=reskit,DC=com Active Directory 目录林的根。

此种轻量目录访问协议 (LDAP) 查询类型要求对 Active Directory 进行身份验证。一般来说,DNSLint 在运行此命令的用户的安全上下文中运行。LDAP 绑定操作期间将使用此用户的凭据来对 Active Directory 进行身份验证。如果凭据有效,并且用户可访问在 Active Directory 下的这些信息,则绑定成功,同时将从 Active Directory 中搜索 GUID。如果绑定不成功,就不执行此搜索,因而整个操作是不成功的。在这种情况下,DNSLint 将向用户返回一个错误。

如果从指定的域控制器返回了一个 GUID 列表,DNSLint 将向由 /s 选项指定的 DNS 服务器发送一个 DNS 查询。在此步操作中早先提供的示例中,DNS 查询被发送到了 169.254.10.22。如果此 DNS 服务器对 _msdcs.root of Active Directory forest 不具有管理权,则此操作最终将找不到早先发现的 GUID 的任何 DNS 记录。/s 选项必须指定一个对 _msdcs.root of Active Directory forest 子域具有管理权的 DNS 服务器的 IP 地址。

在某些环境中(例如,在那些由不接受动态更新的 DNS 服务器承载着根域的环境中),_msdcs 区域已经被委派到一个并未对 Active Directory 目录林的根具有管理权的 DNS 服务器。DNSLint 先检查是否有此委派,然后再进行下一个 DNS 查询。此步骤操作有助于避免向不应测试的 DNS 服务器发送 DNS 查询。

在处理 DNS 查询时,DNSLint 尝试去发现其他对 Active Directory 目录林的根具有管理权的 DNS 服务器。在发现对 Active Directory 目录林的根具有管理权的 DNS 服务器后,DNSLint 将向这个或这些 DNS 服务器查询它在 Active Directory 中发现的 CNAME 记录。当 DNSLint 将每一个 CNAME 记录解析为一个别名时,它也会尝试解析每个别名的 glue (A) 记录。正如本文前面所说的那样,对 Active Directory 复制来说,这些 DNS 记录是必不可少的。

DNSLint
然后创建一个 HTML 格式的报告(也可以选择一个文本格式的报告)。此报告中包括所有在 Active Directory 中发现的 GUID、所发现的对 Active Directory 目录林的根具有管理权的 DNS 服务器以及向那些服务器所发出的所有 CNAME glue (A) 记录查询的结果。它会报告出在每一个 DNS 服务器上缺少哪些 CNAME 记录和 glue (A) 记录。此报告可用于解决任何可能导致 Active Directory 复制问题的 DNS 问题,例如缺少 DNS 记录或 DNS 记录不正确。
2.
要确定一个特定的 Active Directory 域控制器是否能够解析在一个 Active Directory 目录林下的不同域控制器之间成功同步分区副本时所需的所有 DNS 记录,请在所测试的域控制器上运行以下命令:
dnslint /ad /s localhost
因为 /ad 选项之后没有指定任何 IP 地址,所以将使用 127.0.0.1。这意味着域控制器将在自身中查询 GUID 记录的列表。如果您愿意,您也可以指定一个可选的域控制器 LDAP 服务器。如果您在 /s 选项后指定 localhost,这会告诉 DNSLint 使用正在测试的域控制器上配置的一个或多个 DNS 服务器,来解析用于 Active Directory 复制的 CNAME glue (A) 记录。这一指定将向域控制器的本地配置的一个或多个 DNS 服务器发送递归 DNS 查询,以确定此域控制器是否能够解析所需的记录。这并不意味着需要检查本地域控制器的所有 DNS 服务器上是否有这些记录。此域控制器的 DNS 服务器列表是依据它的默认行为来管理的。这意味着只有在列表中的第一个 DNS 服务器没有响应时,才会使用第二个 DNS 服务器。此测试只确定一个域控制器是否能够解析用于 Active Directory 复制的 DNS 记录。不测试任何特定的 DNS 服务器。

DNSLint
所生成的报告可用于解决任何可能导致 Active Directory 复制问题的 DNS 问题,例如缺少 DNS 记录或 DNS 记录不正确。