【问题标题】:Verify Active Directory domain trust relationship of the local machine验证本地计算机的 Active Directory 域信任关系
【发布时间】:2012-10-01 12:43:17
【问题描述】:

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

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

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

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

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

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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    好的。经过一番挖掘,终于找到了解决办法: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*)!

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

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

      【讨论】:

      • 感谢您的回答。这可行,但我们没有任何知名帐户可用于此 -> 政策
      【解决方案3】:

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

      微软页面--

      备注

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-13
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        相关资源
        最近更新 更多