【发布时间】:2020-02-20 21:46:24
【问题描述】:
我有一个可以作为 EXE 或 Windows 服务运行的应用程序。此应用程序在启动时会尝试连接到 Active Directory 服务器并下载作为指定组成员的用户列表。当我作为 EXE 运行时,它工作正常,没有问题。当我作为 Windows 服务运行时,我在 Network Service 帐户下运行,但它不起作用。具体来说,以下对 ADsOpenObject 的调用失败:
HRESULT hr = ADsOpenObject(ldapPath.c_str(),
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IDirectorySearch,
(void**)&domainToSearch);
- 返回的失败码为0x8007952E,表示“提供的凭据无效”。
- ldapPath 的值是这样的:L"LDAP://(server-ip)/DC=(server-name),DC=local"
如您所见,我为用户名和密码传入了 NULL 和 NULL。作为 EXE 运行时,此调用将显示登录用户的凭据。只要该用户在 Active Directory 服务器上拥有帐户,此调用就会成功。据我了解,在网络服务帐户下作为服务运行时,此调用将显示我计算机的凭据。我在 AD 服务器上为我的机器添加了一个计算机帐户,但每次调用仍然失败。我查看了服务器上的安全事件日志,我可以看到来自我的服务的登录尝试失败并出现错误“未知用户或密码错误”,并且“帐户名称”是(我的计算机)$。所以看来我没有在 AD 服务器上正确设置计算机帐户。
- 所以我的问题是:在 Active Directory 中设置计算机帐户以便在该计算机上运行的服务能够在不提供用户名和密码的情况下进行 ADsOpenObject 调用的正确方法是什么?
我还应该指出,我的计算机登录到的域与我尝试查询的 AD 服务器不同,这就是我在 LDAP 字符串中包含 IP 地址的原因。那是问题吗?同样,这种方法适用于 EXE,所以我认为它适用于服务。
【问题讨论】:
-
你的电脑和AD服务器在同一个域吗?
-
“我在 AD 服务器上为我的机器添加了一个计算机帐户” - 然后您是否将计算机加入域?如果您不知道如何检查,请在 PowerShell 中运行它,它应该会显示域的 DNS 名称:
(Get-WmiObject win32_computersystem).Domain -
不,我的电脑和 AD 服务器不在同一个域中。
标签: c++ active-directory