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) を実行できます。

ワークステーションがドメインとの信頼を失った場合、資格情報を確認できません。

もちろん、ローカルではなく、ネットワーク ログオンを実行できるドメイン資格情報が必要になります。

もう 1 つのオプションは、ネットワーク サービス ログオンを許可したローカル アカウントを使用して、他のドメイン ワークステーション リソースにアクセスしようとすることです。どのサーバーのどのリソースに依存するかによって、アクセス拒否エラーまたは信頼関係の失敗を受け取る可能性があります。

最後に、信頼の失敗を通知するイベント ID のシステム イベント ログを検索することもできます。

しかし、これに使用できる有名なアカウントはありません

何らかの方法で認証するまで、ドメイン サイト (AD 内) でワークステーション アカウントのステータスを確認することはできません。ローカル ステータスのみです。

于 2012-10-01T14:11:09.343 に答える