当我准备一个关于开始 Windows 管理的演示文稿时,我突然想到了一个问题,我很惊讶我没有早点问出来。
我知道:
- AD 在站点中逻辑设置以帮助复制并减少客户端计算机和域服务之间域必要通信的延迟。
- 站点由应用于它们的子网定义
- _msdcs 子域包含用于常规查找 (_tcp) 和站点特定查找 (_sites) 的 SRV 记录层次结构
- 计算机以某种方式知道它们位于哪个站点,或者域控制器通过 DNS 的某些魔力透明地做出决定……或者确实如此?
这篇博文暗示 AD 网络中的客户端计算机可以“知道”自己是哪个站点的成员。我的问题是,如果是这样的话,他们如何找到答案?
如果客户端本身不知道,那么 DC 如何帮助机器选择距离该客户端计算机最近的 AD 服务?
答案1
答案是,客户端第一次向 Active Directory 进行身份验证时,它不知道自己位于哪个站点。
首次加入域时,客户端会进行常规 DNS 和 LDAP 查询并获取域中所有域控制器的列表,然后按照列表尝试 LDAP 绑定,并尝试绑定到的第一个成功 DC - 即它进行身份验证的第一个 DC。
客户端加入域后,Active Directory 将告诉客户端它属于哪个站点。Active Directory 知道这一点,因为管理员已将客户端的 IP 子网放入 AD 站点和服务中并将其与站点关联。
Active Directory 会告诉客户端其 AD 站点是什么,客户端会将其存储在自己的注册表中的HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DynamicSiteName
注册表值中。这样,下次客户端启动时,它就知道要进行什么站点特定的 DNS 查询,以便只获取该站点中的 DC。
当然完整行为记录在 KB247811 中,但如果您想亲自查看,您可以运行 Wireshark 或 NetMon 并进行数据包跟踪,然后在跟踪运行时加入域。您将看到 DNS 查询和 LDAP 绑定的确切顺序。后续 DNS 查询和 LDAP 绑定针对特定于站点的子区域进行,因为 AD 已告知客户端它属于哪个站点。
Netlogon 服务将定期刷新其 AD 站点信息,因此如果您移动到其他网络,您的客户端将自动获取其新站点。这可以在HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\SiteNameTimeout
注册表值中调整。(关联)
答案2
实际上有几个相互关联的函数/API。尽管它们很长,但实际上是一些更有趣的 Active Directory 阅读材料。
无论下面的解释如何,您都需要注意两件事:
如果本地站点中的 DC 由于任何原因没有响应,则预计客户端将联系域中的任何域控制器。这是正常的,并且一直是默认行为。有时发生这种情况的原因并不明显。
这可能不是最理想的。请考虑以下场景:三个站点:纽约市(枢纽/数据中心 - 快速)、洛杉矶(与纽约市通信 - 快速)和哈萨克斯坦(与纽约市通信 - 绝对不快)。如果您在洛杉矶站点的客户端由于某种原因无法联系其本地 DC,那么它与哈萨克斯坦进行身份验证并非不可想象。
有几种解决方案。你可以选择其中一种,也可以两种都选。
微软创建了名为 TryNextClosestSite 的组策略/注册表设置。这意味着洛杉矶客户在环游世界寻找 DC 之前应该先尝试纽约。太棒了!花了八年时间,但我们终于在 Vista/2008 中实现了这一点。请记住,默认情况下未启用,您需要创建一个 GPO 来启用此功能。
对于您确实不希望 DC 为其他站点的客户端提供服务的分支站点,您可以创建组策略/注册表设置,指定不应注册哪些 DNS 记录。这称为 DNS 助记符。
查找最近站点中的域控制器 (DsGetSiteName API)
http://technet.microsoft.com/en-us/library/cc978016.aspx
将 IP 地址映射到站点名称
“在 Net Logon 启动期间,每个域控制器上的 Net Logon 服务都会枚举配置容器中的站点对象。每个域控制器上的 Net Logon 还会收到有关站点对象所做的任何更改的通知。Net Logon 使用站点信息构建内存结构,用于将 IP 地址映射到站点名称。
“当搜索域控制器的客户端从 DNS 收到域控制器 IP 地址列表时,客户端开始依次查询域控制器,以找出哪个域控制器可用且合适。 Active Directory 截取包含客户端 IP 地址的查询,并将其传递给域控制器上的 Net Logon。 Net Logon 通过查找与客户端 IP 地址最匹配的子网对象,在其子网到站点映射表中查找客户端 IP 地址,然后返回以下信息:
客户端所在站点的名称,或者与客户端 IP 地址最接近的站点。
当前域控制器所在站点的名称。
一个位,指示找到的域控制器是位于(设置位)还是不位于(未设置位)最靠近客户端的站点。
“域控制器将信息返回给客户端。响应还包含描述域控制器的各种其他信息。客户端检查信息以确定是否尝试寻找更好的域控制器。决策如下:
“如果返回的域控制器位于最近的站点(返回的位被设置),则客户端使用此域控制器。
“如果客户端已经尝试在域控制器声称客户端所在的站点中查找域控制器,则客户端使用该域控制器。
“如果域控制器不在最近的站点中,则客户端将更新其站点信息并发送新的 DNS 查询以查找站点中的新域控制器。如果第二次查询成功,则使用新的域控制器。如果第二次查询失败,则使用原始域控制器。
“如果计算机查询的域与计算机加入的域相同,则计算机所在的站点(由域控制器报告)将存储在计算机注册表中。客户端将此站点名称存储在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ Netlogon\Parameters 中的 DynamicSiteName 注册表项中。因此,DsGetSiteName API 返回计算机所在的站点。”
DsGetDcName 函数
http://msdn.microsoft.com/en-us/library/ms675983%28VS.85%29.aspx
定位器的类型
http://technet.microsoft.com/en-us/library/cc978019.aspx
目录服务功能
http://technet.microsoft.com/en-us/subscriptions/ms675900%28v=vs.85%29.aspx
Active Directory 的 DNS 支持如何工作
http://technet.microsoft.com/en-us/library/cc759550%28v=ws.10%29.aspx
如何优化位于客户端站点之外的域控制器的位置
http://support.microsoft.com/kb/306602