我在一个Unix主机上,正在寻找一个编程方式来确定最接近的DC。 微软有一篇很好的文章解释了如何执行DNS查询,我可以很容易地find可用的DC列表:
dig -t SRV _ldap._tcp.dc._msdcs.example.com
但是关于find最接近的,它解释说:
客户端find域控制器后,使用LDAPbuild立通信以获得对Active Directory的访问权限。 作为协商的一部分,域控制器根据客户端的IP子网标识客户端在哪个站点。 如果客户端与不在最近(最佳)站点的域控制器进行通信,则域控制器将返回客户站点的名称。
到目前为止,我一直无法findLDAP查询过程中“返回客户站点名称”的位置。 有没有一个特定的查询,我应该得到这个,或者一些其他的技术,可以在一个Unix主机上没有join到域中执行?
编辑:感谢Sim的指针,我已经学会如何find正确的DC,一旦我知道我的网站(在这个例子中,“mysite”作为example.com的一部分):
dig -t SRV _ldap._tcp.mysite._sites.dc._msdcs.example.com
但是这留下了如何确定我的网站的问题。 反复的文件表明,我连接任何DC将为我工作,但我找不到文件,说如何返回给我的信息。 我甚至试着直接向DNS发送DNS查询,看看他们是否会用我的站点排在最前面的SRV结果,但是他们没有。
如果有帮助,本TechNet文章将向您介绍在最近的站点中查找域控制器的逻辑。
既然你在Unix上,你看过Samba如何做这个? 看起来这是用CLDAP完成的。 此博客条目 – joinSamba域可能会提供更多的答案。
你可以在Samba的源代码*。/ examples / misc / cldap.pl中findcldap的实现。 只需使用./cldap.pl -d domain -s domaincontroller调用它,就会得到SITENAME,您可以在其他DNS查询中使用它。 MSDN Document: 域控制器对LDAP Ping的响应
首先获取networking上的域控制器列表(可能最近也可能不是最近的)。
nslookup -query=srv _ldap._tcp.example.net.local
然后,您可以查询其中的一个,根据您的子网find您的网站的名称。
ldapsearch -H ldap://dc123.example.net.local -b 'CN=Subnets,CN=Sites,CN=Configuration,dc=net,dc=local' '(cn=10.10.10.0/24)' siteObject
确保使用要识别最近DC的机器replaceIP和子网掩码。
然后,您可以find属于该站点的域控制器。
nslookup -query=srv _ldap._tcp.sitename._sites.example.net.local
整个algorithm看起来像
完成!
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