在 C++ 中使用 setInfo() 会导致E_ADS_INVALID_USER_OBJECT

Using setInfo() in C++ results in E_ADS_INVALID_USER_OBJECT

本文关键字:ADS INVALID OBJECT USER C++ setInfo      更新时间:2023-10-16

我正在尝试使用C++中的setInfo((函数对Windows AD中的用户电子邮件字段进行一些更改。我正在制作一个导出到Windows服务的DLL。但是 setInfo(( 不断返回:

E_ADS_INVALID_USER_OBJECT

如果我将完全相同的代码编译为 EXE 并在命令行中运行它,一切正常。但是当导出 DLL 并调用 setInfo(( 时,它会返回上述错误。这是我代码的一部分:

IADsUser *pUser = NULL;
RESULT hr = CoInitialize(0);
VARIANT var;
hr = ADsGetObject(L"LDAP://CN=Foo Bar,CN=Users,DC=mydomain,DC=com", IID_IADsUser, (void**) &pUser);
//hr = ADsOpenObject(L"LDAP://CN=Foo Bar,CN=Users,DC=mydomain,DC=com", NULL, NULL, ADS_SECURE_AUTHENTICATION, IID_IADsUser, (void**) &pUser);
VariantInit(&var);
V_BSTR(&var) = SysAllocString(L"foobar@email.com");
V_VT(&var) = VT_BSTR;
hr = pUser->Put(CComBSTR("mail"), var);
hr = pUser->SetInfo();

我能够成功与LDAP绑定,绑定也适用于:

ADsOpenObject((

当我在ADsOpenObject中添加域管理员凭据时,setInfo((可以工作..但我不想为此使用用户名/密码。有没有办法在 DLL 中使用 setInfo(( 而不在代码中提供凭据?

此外,IADsUser Get 函数无需提供域管理员的凭据即可工作。是读/写问题吗?任何帮助不胜感激!

如果在绑定到 AD 时未显式提供用户名和密码,Windows 将使用进程的安全上下文进行登录。 对于作为本地系统或网络服务运行的服务,这意味着它使用计算机的 AD 帐户登录。

如果更改 AD 中的权限以授予对计算机帐户的必要访问权限,它将起作用。 (计算机帐户的用户名是附加美元符号的计算机名称。