ADsOpenObject - 连接到同一网络中另一个域的rootDSE

时间:2018-05-16 13:56:47

标签: visual-c++ active-directory ldap

我需要连接到同一网络中另一个域的rootDSE。我引用了此Microsoft Forum Thread中的解决方案。我使用以下代码建立连接。

hr = ADsOpenObject(L"LDAP://DC1.domain.com/rootDSE",
    L"admin",
    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";
}

我无法连接到rootDSE,错误消息(errMsg):

  

服务器无法运行。

2 个答案:

答案 0 :(得分:0)

无法访问域控制器。测试与服务器的网络连接。

AD可以使用4个端口中的任何一个:

  • 389:LDAP(未加密)如果您未指定任何内容,则这是默认值
  • 636:LDAP over SSL(加密)
  • 3268:全球目录(您的整个森林)
  • 3269:SSL上的全局目录

您可以从PowerShell测试网络连接:

(new-object Net.Sockets.TcpClient).Connect("DC1.domain.com", 389)

没有输出意味着成功。如果它失败了,它会告诉你。如果端口389不起作用,请尝试其他端口。如果其中一个有效,您可以在LDAP路径中指定:"LDAP://DC1.domain.com:3268/rootDSE"

答案 1 :(得分:0)

我使用以下LDAP模式完成了连接到同一网络中另一个域的rootDSE:

"LDAP://win2k3/rootDSE"

注意:我的DC的NETBIOS名称是win2k3。 win2k3属于另一个域,但与我的计算机位于同一网络中。

IADs *pObject;
HRESULT hr;
CoInitialize(NULL);
hr = ADsOpenObject(L"LDAP://<DC-NETBIOS>/rootDSE",
    username,
    password,
    ADS_SECURE_AUTHENTICATION,
    IID_IADs,
    (void**)&pObject);

if (hr == S_OK) printf("\nBind to rootDSE success\n");
else {
    _com_error err(hr);
    LPCTSTR errMsg = err.ErrorMessage();
    std::wcout << L"Hresult: " << errMsg << L"\n";
}