2

我必须查明本地计算机是否仍加入域,或者另一台计算机是否已使用该计算机帐户,或者该计算机帐户是否已被重置。

也就是说,我需要验证本地机器和域之间的信任关系

NLTest /SC_VERIFY:{Domain} 做得很好。

是否有任何 API 函数可用于检测本地计算机是否已失去与域的信任关系?我不喜欢从我的程序中调用外部可执行文件。

到目前为止我尝试了什么:

  • NetGetJoinInformation():它没有意识到。
  • DsBind*():它没有意识到。还尝试在本地系统帐户下调用它。

有任何想法吗?

4

3 回答 3

3

好的。经过大量挖掘,我终于找到了解决方案:I_NetLogonControl2

NETLOGON_INFO_2* buffer=NULL;
LPBYTE domainName = (LPBYTE) L"eng";

int ret = I_NetLogonControl2(NULL, NETLOGON_CONTROL_TC_VERIFY, 2, (LPBYTE) &domainName, (LPBYTE*)&buffer);
wprintf( L"I_NetLogonControl2() returned %i\n", ret);
if (ret==0)
{
    wprintf( L"PdcConenctionStatus: %i\n", buffer->netlog2_pdc_connection_status);
    if (buffer->netlog2_pdc_connection_status==0)
        wprintf(L"Trust relationship verified.\n");
    else
        wprintf(L"Trust relationship FAILED.\n");

    wprintf( L"TcConenctionStatus: %i\n", buffer->netlog2_tc_connection_status);
    wprintf( L"Flags: %i\n", buffer->netlog2_flags);
}

return 0;

所以神奇的东西隐藏在 NETLOGON_INFO_2::netlog2_pdc_connection_status 中。
如果此值为 86 (ERROR_INVALID_PASSWORD) 或 5 (ERROR_ACCESS_DENIED),则计算机帐户已更改(或重置)。
如果计算机帐户已被删除,则值为 1787 (ERROR_NO_TRUST_SAM_ACCOUNT)

希望这对其他人有帮助!

不幸的是,MSDN 文档并不精确。当您指定“NETLOGON_CONTROL_TC_VERIFY”时,数据参数 (LPBYTE) 必须指向 (LPWSTR*)!

于 2012-10-01T17:18:06.757 回答
0

您可以尝试使用LogonUser函数进行网络登录(LOGON32_LOGON_NETWORK)。

如果工作站破坏了与域的信任,它将无法验证您的凭据。

当然,您将需要一些可以执行网络登录的域凭据,而不是本地凭据。

您的另一个选择是使用已授予网络服务登录权限的本地帐户并尝试访问其他域工作站资源。您可能会收到拒绝访问错误或信任关系失败取决于哪个服务器上的哪个资源。

最后,您仍然可以在系统事件日志中搜索事件 ID 信号信任失败。

但我们没有任何众所周知的帐户可用于此目的

在您以某种方式进行身份验证之前,您无法检查域站点(在 AD 中)上的工作站帐户状态,只是本地状态。

于 2012-10-01T14:11:09.343 回答
0

NetLogon_Control2 用于 BDC 到 PDC 通信;不适用于我在 Win 7 中的测试

微软页面——

评论

此功能可用于请求 BDC 确保其 SAM 数据库副本是最新的。它还可以用于确定BDC当前是否具有对PDC开放的安全通道。

于 2014-08-19T13:03:46.623 回答