我在 Unix 主机上,正在寻找一种编程方法来确定最近的 DC。Microsoft 有一个出色的文章解释如何执行 DNS 查找,我能够轻松找到可用 DC 的列表,如下所示:
dig -t SRV _ldap._tcp.dc._msdcs.example.com
但关于找到最接近的,它解释道:
客户端找到域控制器后,将使用 LDAP 建立通信,以获得对 Active Directory 的访问权限。作为协商的一部分,域控制器将根据客户端的 IP 子网确定客户端所在的站点。如果客户端正在与不在最近(最优)站点的域控制器进行通信,则域控制器将返回客户端站点的名称。
到目前为止,我还没有找到在 LDAP 查询期间“返回客户端站点的名称”发生在哪里。我是否应该执行特定查询来获取此信息,或者可以在未加入域的 Unix 主机上执行其他一些技术?
编辑:感谢 Sim 的指引,我学会了如何在了解我的站点后找到正确的 DC(在此示例中,“mysite”是 example.com 的一部分):
dig -t SRV _ldap._tcp.mysite._sites.dc._msdcs.example.com
但这留下了一个问题:如何确定我的站点。文档反复指出,我连接的任何 DC 都可以帮我解决这个问题,但我找不到说明它如何返回信息的文档。我甚至尝试将 DNS 查询直接发送到 DC,看看它们是否会将我的站点排在 SRV 结果的顶部,但它们没有这样做。
答案1
这篇 TechNet 文章将带你了解在最近的站点中查找域控制器如果有帮助的话。
既然您使用的是 Unix,您是否了解过 Samba 是如何做到这一点的?看起来这是通过 CLDAP 实现的。这博客条目 - 加入 Samba 域可能会提供更多答案。
答案2
整个算法如下
- 解析 _ldap._tcp.dc._msdcs.example.com
- 根据rfc-2782选择一个
- 向其发送 LDAP Ping 并读取客户端站点(如果返回)
- 解析 _ldap._tcp.Client-Site._sites.dc._msdcs.example.com
- 根据rfc-2782选择一个
完毕!
LDAP Ping 是
ldapsearch -H CLDAP://server -b '' -s base '(&(NtVer=\06\00\00\00)(AAC=\00\00\00\00))' netlogon
然后将其读取为 NETLOGON_SAM_LOGON_RESPONSE_EX。请参见此处https://msdn.microsoft.com/en-us/library/cc223807.aspx
答案3
您可以在 Samba 源代码中的此文件 *./examples/misc/cldap.pl 中找到 cldap 的实现。只需使用以下命令调用它 ./cldap.pl -d 域 -s 域控制器您将获得可以在进一步的 DNS 查询中使用的 SITENAME。MSDN 文档: 域控制器对 LDAP Ping 的响应
答案4
这python-active-directory似乎一些代码能够执行“LDAP ping”并解析结果。