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

标签 c++ windows put

我正在尝试使用 C++ 中的 setInfo() 函数对 Windows AD 中用户的 e-mail 字段进行一些更改。我正在制作一个导出到 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 绑定(bind),绑定(bind)也适用于此:

ADsOpenObject()

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

此外,IADsUser Get 功能无需提供域管理员的凭据即可工作。这是一个读/写问题吗?感谢您的帮助!

最佳答案

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

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

关于c++ - 在 C++ 中使用 setInfo() 会导致 E_ADS_INVALID_USER_OBJECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27586244/

相关文章:

Node.js:methodOverride 不起作用

javascript - 放置请求获取ID | Axios、React、Redux

c++ - 如何在Qt中的QTableview中定位我的按钮的行号

c++ - QTcpSocket 不加载 ssl

c++ - 如何使用按钮单击进行绘制 - C++ Windows 窗体

java - Windows 64 中的 javaw.exe 进程是否消耗更多内存?

azure - Jersey 客户端 1.17 PUT 请求返回错误 411。请求必须分块或具有内容长度

c++ - 无法使用 libHaru 在 PDF 文件中写入文本

c++ - FixedSize 的小部件可以随意改变它们的大小

c# - Matlab Coder - 从 .m 文件生成 EXE