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

时间:2012-10-01 12:43:18

标签: c++ .net winapi active-directory

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

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

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

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

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

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

有什么想法吗?

3 个答案:

答案 0 :(得分: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 *)!

答案 1 :(得分:0)

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

如果工作站已破坏对域的信任,则无法验证您的凭据。

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

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

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

  

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

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

答案 2 :(得分:0)

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

Microsoft页面 -

<强>说明

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