C++ 验证本地计算机的Active Directory域信任关系

C++ 验证本地计算机的Active Directory域信任关系,c++,.net,winapi,active-directory,C++,.net,Winapi,Active Directory,我必须查明本地计算机是否仍然加入到域中,或者其他计算机是否使用了该计算机帐户,或者计算机帐户是否已重置 换句话说,我需要验证本地机器和域之间的信任关系 NLTest/SC_VERIFY:{Domain}做得很好 是否有任何API函数可用于检测本地计算机是否已失去与域的信任关系?我不喜欢从程序中调用外部可执行文件 到目前为止,我尝试的是: NetGetJoinInformation():它没有意识到这一点 DsBind*():它没有意识到这一点。还试图在本地系统帐户下调用它 有什么想法吗?您可

我必须查明本地计算机是否仍然加入到域中,或者其他计算机是否使用了该计算机帐户,或者计算机帐户是否已重置

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

NLTest/SC_VERIFY:{Domain}做得很好

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

到目前为止,我尝试的是:

  • NetGetJoinInformation():它没有意识到这一点
  • DsBind*():它没有意识到这一点。还试图在本地系统帐户下调用它
有什么想法吗?

您可以尝试使用函数执行网络登录(LOGON32\u LOGON\u network)

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

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

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

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

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


在进行身份验证之前,您不能在域站点(AD)上检查工作站帐户状态,只能检查本地状态。

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

因此,神奇的事情隐藏在NETLOGON\u INFO\u 2::netlog2\u pdc\u connection\u status中。
如果此值为86(错误\u无效\u密码)或5(错误\u访问被拒绝),则计算机帐户已更改(或重置)。
如果计算机帐户已被删除,则值为1787(错误\u否\u信任\u山姆\u帐户)

希望这能帮助别人


不幸的是,MSDN文档并不精确。指定“NETLOGON\u CONTROL\u TC\u VERIFY”时,数据参数(LPBYTE)必须指向(LPWSTR*)

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

微软网页--

备注


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

谢谢您的回答。这会起作用,但我们没有任何可用于此->策略的知名帐户
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;