【问题标题】:Issue with ADsOpenObject() remote connection and the WinNT providerADsOpenObject() 远程连接和 WinNT 提供程序的问题
【发布时间】:2019-05-21 20:56:24
【问题描述】:

我在使用远程计算机上的服务中的 WinNT 提供程序从 ADsOpenObject() 获取 IADsContainer 对象时遇到问题。

我已经能够让代码在以下情况下工作,除了数字 4

  1. 我的应用程序部署在它所连接的同一台机器上(本地主机)。
  2. 我的应用程序作为本地服务部署在它所连接的同一台计算机上 (localhost)。
  3. 我的应用程序部署在远程计算机上,它通过提供 IP 进行连接。
  4. 我的应用程序作为本地服务部署在远程计算机上,并通过提供 IP 进行连接。
#include <iostream>

#include <Adshlp.h>
#include <comdef.h>

IADsContainer* container = nullptr;
HRESULT hres = ADsOpenObject( L"WinNT://192.168.1.30", L"Administrator", L"someAdminPass", ADS_SECURE_AUTHENTICATION | ADS_READONLY_SERVER, IID_IADsContainer, (void**)&container );

if( SUCCEEDED(hres) )
{
    // do stuff with the container object
}
else
{
    _com_error err( hres );
    LPCTSTR errMsg = err.ErrorMessage();
    std::wcout << errMsg;
}

我希望 hres 是 S_OK 和有效的“容器”指针,但我只得到带有错误字符串“未指定错误”的 E_FAIL

【问题讨论】:

  • S_FALSE 是成功代码。您是如何以及从何处获得“错误字符串'未指定的错误'”?
  • “myUser”是否包含域名,ADsOpenObject 表示:此字符串应始终采用“/”格式以避免歧义。
  • 正如@IInspectable 所说,SUCCEEDED(S_FALSE ) = true。提供真实的错误信息,或者真实的代码。
  • 对于 S_FALSE 的混淆,我深表歉意。值是 E_FAIL,我做了一些错误的复制/粘贴...我还更新了连接字符串,以了解我使用它的方式。我没有指定用户名,也不应该需要它,因为我使用“容器”对象来获取不同用户的信息。 @DrakeWu-MSFT 使用 _com_error 对象获取错误字符串,如 else 情况所示。
  • 我的意思是ADsOpenObject的第二个参数,我不能在我的身上产生这个问题。

标签: c++ windows winapi adsi


【解决方案1】:

感谢@DrakeWu-MSFT 的 cmets 中的指南,问题得以解决!

我只需要指定一个 FQDN 用户名。如果您的机器域是“DOMAIN.COM”,那么用户名字符串应该是“UserName@DOMAIN.com”。这解决了我的问题。也非常“感谢”MS 提供这样一个描述性错误消息...... :)

主代码行现在如下所示:

HRESULT hres = ADsOpenObject( L"WinNT://192.168.1.30", L"Administrator@MYDOMAIN.COM", L"someAdminPass", ADS_SECURE_AUTHENTICATION | ADS_READONLY_SERVER, IID_IADsContainer, (void**)&container );

附:注意还有其他不喜欢 FQDN 用户名的 WinAPI 函数。

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多