example1.com域下查询example2.com域AD用户的LDAP连接路径相关疑问
跨域LDAP查询连接流程说明
核心疑问解答
你描述的场景中,使用LDAP://DC=example2,DC=com发起查询时,客户端会直接与example2.com域的DC建立LDAP连接,本地example1.com的DC仅负责提供目标域DC的定位信息,不会代理转发实际的查询请求,具体流程如下:
- 客户端首先向本地example1.com域的DC发起example2.com的域定位请求,查询目标域的LDAP服务SRV记录
- 本地DC返回example2.com域可用的DC地址列表
- 客户端根据返回的地址,直接与目标域DC建立LDAP连接,提交身份凭证并发起查询
- 目标域DC直接向客户端返回查询结果
触发本地DC代理查询的前提
只有同时满足以下两个条件时,才会由本地DC处理查询,不需要直接连接目标域DC:
- example1.com与example2.com属于同一个AD林
- 查询时使用全局编录协议路径
GC://DC=example2,DC=com,访问本地DC的3268(非SSL)/3269(SSL)端口,全局编录存储了林中所有域的对象只读副本,可直接返回跨域查询结果
DirectorySearcher常见连接问题修复方案
你遇到的连接错误大概率是跨域直连的配置问题,可按以下顺序排查:
- 验证网络连通性:确认客户端机器可以访问example2.com DC的389(普通LDAP)/636(LDAPS)端口,无防火墙、安全组拦截
- 验证DNS解析:执行命令
nslookup -type=srv _ldap._tcp.example2.com,确认可以正常返回目标域DC的地址列表 - 显式指定查询凭证:不要使用当前进程的默认凭据(属于example1.com),显式传入example2.com域有权限的查询账号,示例代码如下:
// 显式指定目标域的根节点和访问凭证 using (DirectoryEntry searchRoot = new DirectoryEntry("LDAP://DC=example2,DC=com", "example2\\your_query_account", "your_account_password")) using (DirectorySearcher searcher = new DirectorySearcher(searchRoot)) { // 查询所有启用的用户示例 searcher.Filter = "(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; searcher.PropertiesToLoad.AddRange(new string[] { "sAMAccountName", "displayName", "mail" }); SearchResultCollection results = searcher.FindAll(); // 处理查询结果 }
内容的提问来源于stack exchange,提问作者Clive Smith
相关产品推荐
相关产品推荐

