求助:同一网络下无法通过ADsOpenObject连接其他域rootDSE
我来帮你梳理下可能导致这个错误的常见原因和对应的排查、解决步骤:
先排查基础网络连通性
先通过命令行执行ping DC1.domain.com测试能否连通目标域控制器。如果ping不通,大概率是网络层面的问题:要么是防火墙拦截了LDAP默认端口(389,加密连接用636),要么是目标服务器的IP/域名解析异常。也可以用tracert DC1.domain.com追踪数据包路径,确认是否能到达目标节点。验证域名解析是否准确
DNS解析错误是这类问题的高发原因。执行nslookup DC1.domain.com查看返回的IP地址是否与目标域控制器的实际IP一致。如果解析错误,你可以调整本地DNS配置,或者直接用目标DC的IP替换代码中的域名进行测试(比如改成LDAP://192.168.x.x/rootDSE)。修正认证账号格式与权限
你代码中使用的admin账号需要明确指定目标域的身份,建议写成域\账号或UPN格式,比如L"domain.com\\admin"或者L"admin@domain.com"——如果只写admin,系统可能会默认用本地域去认证,导致认证失败。另外,如果目标域要求加密连接,需要在参数中添加ADS_USE_SSL标志,同时将LDAP路径改为带636端口的格式:LDAP://DC1.domain.com:636/rootDSE。确认目标域控制器状态
检查目标域控制器是否正常运行:可以在目标域的机器上用ADSI Edit工具连接自身的rootDSE,确认AD服务是否正常。如果目标DC本身宕机或AD服务停止,也会触发这个错误。
这里给你调整了账号格式的代码示例,你可以尝试:
hr = ADsOpenObject(L"LDAP://DC1.domain.com/rootDSE", L"domain.com\\admin", // 或 L"admin@domain.com" L"password", ADS_SECURE_AUTHENTICATION, IID_IADs, (void**)&pObject); if(!SUCCEEDED(hr)){ _com_error err(hr); LPCTSTR errMsg = err.ErrorMessage(); std::wcout<<errMsg<<L"\n"; }
如果以上方法都没解决问题,推荐用Windows自带的LDP.exe工具测试连接,它能输出更详细的诊断信息,帮你精准定位问题。
内容的提问来源于stack exchange,提问作者Lakshmanan Meiyappan

