验证本地计算机的活动目录域信任关系

Verify Active Directory domain trust relationship of the local machine

本文关键字:信任 关系 活动 计算机 验证      更新时间:2023-10-16

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

换句话说,我需要验证本地机器和域之间的信任关系

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

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

到目前为止我尝试过:

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

有什么想法吗?

好的。经过一番挖掘,我终于找到了解决方案: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 %in", ret);
if (ret==0)
{
    wprintf( L"PdcConenctionStatus: %in", 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: %in", buffer->netlog2_tc_connection_status);
    wprintf( L"Flags: %in", 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*)!

您可以尝试登录用户功能来执行网络登录(LOGON32_LOGON_NETWORK)。

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

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

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

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

但是我们没有任何可用于此目的的知名帐户

您无法

在域站点(在 AD 中)上检查工作站帐户状态,直到您以某种方式进行身份验证,只需本地状态。

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

Microsoft页 --

言论

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