古いグローバル カタログ サーバーをオンラインに戻した後、残留オブジェクトが残る可能性があります

この記事では、オフライン DC をオンラインに戻した後に AD に再導入されるオブジェクトをクリーンアップする手順について説明します。

適用対象: Windows Server 2019、Windows Server 2016、Windows Server 2012 R2
元の KB 番号: 314282

現象

ドメイン コントローラー (DC) またはグローバル カタログ サーバーは、長時間オフラインになった後にオンラインになります。 オンラインになると、次の 1 つ以上の問題が発生します。

  • 電子メール メッセージは、ユーザー オブジェクトがドメイン間で移動されたユーザーには配信されません。 古い DC またはグローバル カタログ サーバーをオンラインに戻すと、ユーザー オブジェクトの両方のインスタンスがグローバル カタログに表示されます。 どちらのオブジェクトも同じ電子メール アドレスを持っているので、電子メール メッセージを配信できません。
  • 存在しなくなったユーザー アカウントは、引き続きグローバル アドレス一覧に表示されます。
  • 存在しなくなったユニバーサル グループは、ユーザーのアクセス トークンに引き続き表示されます。
  • EventID 1084 などの他の DC またはグローバル カタログ サーバーのログ イベントは、 サーバー上にこのようなオブジェクトはありません。 影響を受ける DC またはグローバル カタログ サーバーでは、さらにレプリケーションがブロックされます。

原因

これらの問題は、DC またはグローバル カタログ サーバーがユーザー オブジェクトの Tombstone-Lifetime 属性の値よりも長くオフラインになっている場合に発生する可能性があります。

Tombstone-Lifetime 属性の詳細については、「Tombstone-Lifetime 属性」を参照してください。

Tombstone-Lifetime 属性は、削除されたオブジェクトがディレクトリ サービスから削除されるまでの日数を定義します。 これにより、レプリケートされたサーバーからオブジェクトを削除し、復元によって削除されたオブジェクトが再導入されるのを防ぐことができます。 既定値は 180 日です。 その後、Active Directory は変更を記憶する必要がなくなりました。

DC またはグローバル カタログ サーバーが Tombstone-Lifetime 属性の値よりも長くオフラインになっている場合、Active Directory (またはグローバル カタログ) のコピーには、他の DC で削除されたオブジェクトが含まれている可能性があります。 ただし、他の DC では、オブジェクトが削除されたことを覚えなくなりました。 オフライン DC をオンラインにすると、Active Directory のコピーがドメインの残りの部分と同期されます。 削除に関する情報は破棄されているため、DC は影響を受けるオブジェクト (残留オブジェクトと呼ばれます) をドメインの残りの部分にレプリケートします。

一般に、AD DS では、一部の名前付けコンテキスト (ディレクトリ パーティションとも呼ばれます) が読み取り/書き込みであり、他の名前付けコンテキストが読み取り専用である 、緩やかな整合性レプリケーション モデルが使用されます。 読み取り/書き込み名前付けコンテキストに属し、そのオブジェクトがディレクトリ情報ツリー (DIT) のローカル コピーにまだ存在しないレプリケートされたオブジェクトを受け取る DC では、DC によってオブジェクトが作成されます。 レプリケーション プロセスが続行すると、ドメイン内のすべての DC にオブジェクトが再び表示されます。

DC とグローバル カタログ サーバーでは、厳密なレプリケーション整合性モデルを使用することもできます。 このモデルでは、DC がローカル DIT にまだ存在しないレプリケートされたオブジェクトを受信すると、DC はレプリケートされたデータの受信または送信を停止し、イベント ID 1084 などのイベントをログに記録します。"サーバーにこのようなオブジェクトはありません"。DC が既定でこのモデルを使用する状況など、厳密なレプリケーションの整合性の詳細については、「KB 910205、Windows Server Active Directory フォレスト内の残留オブジェクトに関する情報」を参照してください。 廃棄ストーンの問題の詳細については、「 KB216993 Active Directory のシステム状態バックアップの耐用年数」を参照してください。

解決策 1: Active Directory に残留オブジェクトがあるかどうかを判断し、今後の残留オブジェクトを回避する

KB 910205では、Active Directory システムに残留オブジェクトが蓄積されているかどうかを判断するいくつかの方法について説明します。 KB 910205では、残留オブジェクトが蓄積されないようにするために実行できる手順についても説明します。

解決策 2: 残留オブジェクトを削除する

オブジェクトが Active Directory にまったく存在しない場合 (たとえば、オブジェクトが古いドメイン コントローラーによって再導入された場合)、標準ツール (ADSIEdit や Active Directory ユーザーとコンピューター スナップインなど) を使用してオブジェクトを削除できます。

読み取り/書き込み名前付けコンテキストの残留オブジェクトを簡単に削除できます。 Windows Server 2003 以降のバージョンでは、 コマンド repadmin /removelingeringobjectsを使用して残留オブジェクトを削除できます。 RepAdmin の使用方法については、「 Active Directory レプリケーション イベント ID 1388 または 1988: 残留オブジェクトが検出される」を参照してください。

この記事では、グローバル カタログ サーバー上のディレクトリ パーティションや Read-Only ドメイン コントローラー (RODC) などの読み取り専用の名前付けコンテキストに既に表示されている残留オブジェクトを削除する方法について説明します。 「 詳細情報 」セクションで説明されている機能は、新しいオペレーティング システムにまだ存在し、予期しない RepAdmin 動作のトラブルシューティングに役立つ場合があります。

詳細

この手順では、オブジェクトの読み取り/書き込みコピーを持つ DC の objectGUID と、オブジェクト自体の objectGUID が必要です。 複数のオブジェクトを削除する必要がある場合は、いずれかのオブジェクトが親子関係にあるかどうかを判断します (オブジェクトの識別名からこれを判断できます)。 この場合は、すべての子オブジェクトが親オブジェクトの前に削除されるように削除を注文します。

この手順には 3 つの主要な手順があります。これは、フォレストへのアクセス権を持つコンピューターで実行する必要があります (また、フォレストに対する管理アクセス許可を持つユーザー アカウントを使用する必要があります)。

  1. 残留オブジェクトの識別名と ObjectGUID を取得します。
  2. オブジェクト ドメイン内の DC を識別します。
  3. 残留オブジェクトを削除します。 次のいずれかの方法を選択します。
    • いくつかの残留オブジェクトを削除します。
    • 多数の残留オブジェクトを削除します。

重要

削除操作を実行する予定の各グローバル カタログ サーバー (手順 3) には、特定したドメイン コントローラーへのネットワーク接続が必要です (手順 2)。

トラブルシューティング情報については、次のセクションを参照してください。

  • 環境内の多くの残留オブジェクトを変更するためにWalkservers.cmdを実行するとエラー メッセージが表示されます。
  • 環境内の残留オブジェクトを削除するときのエラー メッセージ 87。

残留オブジェクトの識別名と ObjectGUID を取得する

オブジェクトが配置されているドメインを識別する最善の方法 (およびそこから、オブジェクトの読み取り/書き込みコピーを持つ DC の名前を決定する) は、オブジェクトの識別名を取得することです。 Ldp.exe ツールを使用して、オブジェクトの名前 (または名前の一部) を検索できます。 これを行うには、次の手順を実行します。

  1. Ldp.exe を開始します。

    ほとんどのバージョンの Windows では、[Start Run]\(実行の開始\)を選択し、「ldp.exe」と入力します>。 以前のバージョンの Windows (Windows Server 2003 SP1 など) では、このツールはサポート ツールの 1 つとして使用できます。

  2. [接続]>[接続] を選択します。 [ サーバー ] ボックスに、グローバル カタログ サーバーの名前を入力します。 [ ポート ] ボックスに「 3268」と入力し、[ OK] を選択します

  3. [接続バインド] を>選択します。 現在の資格情報でグローバル カタログのすべての内容を照会するのに十分でない場合は、有効な資格情報を入力します。 [OK] を選択します。

  4. [ビュー ツリー] を>選択します。 フォレスト ルートの識別名を入力し、[ OK] を選択します

  5. ツリーの一覧でフォレスト ルートを右クリックし、[ 検索] を選択します。

  6. [フィルター] ボックスに、属性> = <値>形式を使用するフィルターを<入力します。

    フィルター テキストでは、 <attribute> は検索対象のオブジェクト属性を表し <、値> は検索対象の条件を表します。 *****を値のワイルドカード文字として使用でき、式を使用できます。

    ライトウェイト ディレクトリ アクセス プロトコル (LDAP) フィルター構文の詳細については、「 検索フィルター構文」を参照してください。

    たとえば、sAMAccountName 属性の値が testuser であるオブジェクトを検索するには、[フィルター] ボックスに「(sAMAccountName = testuser)」と入力します。 ユーザー オブジェクトを検索するには、次の属性が最も便利です。

    • cn
    • userPrincipalName
    • sAMAccountName
    • name
    • mail
    • sn

    グループ オブジェクトを検索するには、次の属性が最も便利です。

    • cn
    • sAMAccountName
    • name
  7. [ スコープ] で、[ サブツリー] を選択します。

  8. [属性] ボックス 選択し、属性文字列の末尾を選択します。 型 。文字列の末尾にある objectGUID

    [属性] ボックスの文字列の末尾に ;objectGUID が入力された [検索] ウィンドウのスクリーンショット。

    一部のバージョンの Ldp では、[ オプション] を選択して [属性] ボックス を表示する 必要があります。

  9. クエリを実行するには、[実行] を選択 します

    結果が [メイン Ldp] ウィンドウに表示されます。

  10. 結果にリストされているオブジェクトのうち、グローバル カタログから削除するオブジェクトが存在する場合は、どれを決定します。 不適切なオブジェクトが見つかったことを示す 1 つは、名前付けコンテキストの読み取り/書き込みコピーにオブジェクトが存在しないことです。

  11. 探しているオブジェクトがクエリ結果に含まれていない場合は、フィルターを言い換えて、検索をもう一度実行します。

  12. 残留オブジェクトを識別した場合は、その DN 属性と objectGUID 属性の値を書き留めます。 これらの値は後で必要になります。

オブジェクト ドメイン内の DC を識別する

オブジェクトの DN 属性の値には、オブジェクトのドメインが含まれます。 ドメインがわかっている場合は、ドメイン内の DC またはグローバル カタログ サーバーを識別できます。 それには、以下の手順を実行します。

  1. DN 値の dc= 部分を確認します。 dc= 部分を組み合わせてドメイン名を取得します。

    たとえば、オブジェクトの DN 値が cn=FirstName LastName、cn=Users、dc=name1、dc=name2、dc=com の場合、オブジェクトはドメイン内にあります name1.name2.com

  2. このドメイン内の DC (またはグローバル カタログ サーバー) を見つけるには、Active Directory ユーザーとコンピューターを開き、ドメイン コンテナーを開き、ドメイン コントローラー コンテナーを開きます。

  3. 管理者特権のコマンド プロンプト ウィンドウを開き、「 」と入力 repadmin /showreps dc-nameします。

    注:

    このコマンドでは、 dc-name は、手順 2 で識別した DC のコンピューター名を表します。

    以前のバージョンの Windows (Windows Server 2003 SP1 など) では、RepAdmin はサポート ツールの 1 つとして使用できます。

    Repadmin は、次のような結果を生成します。

    Default-First-Site-Name\WS2016-DC-01 DSA オプション: IS_GC サイト オプション: (なし) DSA オブジェクト GUID: <GUID> DSA invocationID: <invocationID>

  4. DSA オブジェクト GUID の値に注意してください。 これは DC の objectGUID 値です。

残留オブジェクトを削除する

残留オブジェクトを削除するには、次の方法を使用します。

いくつかのグローバル カタログ サーバーからいくつかの残留オブジェクトを削除する

オブジェクトとグローバル カタログが少ない場合は、次の手順に従って、Ldp.exe を使用してオブジェクトを削除します。

  1. エンタープライズ管理者の資格情報を使用して、残留オブジェクトのコピーを含む各グローバル カタログ サーバーにサインインします。

  2. Ldp.exe を開始し、ローカル ドメイン コントローラーのポート 389 に接続します ( [サーバー ] ボックスは空のままにします)。

  3. [接続バインド] を>選択します。 すべてのボックスを空のままにします (エンタープライズ管理者として既にサインインしています)。

  4. [変更の参照] を選択します>。

    一部のエントリを構成できる [変更] ウィンドウのスクリーンショット。

  5. [ 変更 ] ダイアログ ボックスで次のエントリを構成します。

    1. [Dn] ボックスは空のままにします。

    2. [ 属性 ] ボックスに「 RemoveLingeringObject」と入力します

    3. [ ] ボックスに、次の形式を使用する値を入力します。

      <GUID=dcGUID>: <GUID=objectGUID>

      この値では、 dcGUID は、このセクションの手順 2 で識別した DC の GUID を表し、 objectGUID は、このセクションの手順 1 で識別した残留オブジェクトの GUID を表します。

      値は次のようになります。

      <GUID=<GUID>>: <GUID=<GUID>>

      重要

      値では、コロンの前後にスペースを省略しないでください。

    4. [操作>の置換] を選択し、[Enter] を選択します。

      [ エントリ リスト ] ボックスに、コマンド全体が表示されます。

    5. [実行] を選択します。

      結果は [メイン Ldp] ウィンドウに表示され、次のようになります。

      Modify... を呼び出します。ldap_modify_s(ld, '(null)',[1] attrs);"" を変更しました。

複数のグローバル カタログ サーバーから多数の残留オブジェクトを削除する

多数の残留オブジェクトを削除する必要がある場合は、スクリプトを使用して手動で削除するよりも効率的に削除できます。 このようなスクリプトをビルドするには、次の手順を使用します。

  1. 新しいフォルダーを作成し、そのフォルダーに次の名前の新しいファイルを作成します。

    • Walkservers.cmd
    • Walkobjects.cmd
    • Modifyrootdse.vbs
    • Server-list.txt
    • Object-list.txt ファイル
  2. 次のテキストをWalkservers.cmdに貼り付けます。

    for /f %%j in (server-list.txt) do walkobjects %%j
    
  3. 次のテキストをWalkobjects.cmdに貼り付けます。

    for /f "delims=@" %%i in (object-list.txt) do cscript //NoLogo MODIFYROOTDSE.VBS %1 "%%i" >>update-%1.log
    
  4. 次のテキストを Modifyrootdse.vbs に貼り付けます。

    '********************************************************************
    '*
    '* File: MODIFYROOTDSE.VBS
    '* Created: January 2002
    '* Version: 1.0
    '*
    '* Main Function: Writes Active Directory information to clean up
    '* objects as per: Q314282.
    '* Usage: Modifyrootdse.vbs <TargetServer> <GUID PAIR>
    '* Parameter are fed into the script using a pair of batch files.
    '*
    '* Copyright (C) 2002 Microsoft Corporation '*
    '********************************************************************
    OPTION EXPLICIT
    ON ERROR RESUME NEXT
    
    Dim objDomain
    Dim ObjValue, strServerName, adsLdapPath
    Dim i
    
    'Get the command-line arguments
    
    if Wscript.arguments.count <> 2 Then
        Print "Invalid Number of Parameters. Use with WalkServers.CMD and WalkObjects.CMD"
        WScript.quit
    End If
    
    strServerName = Wscript.arguments.item(0)
    ObjValue = Wscript.arguments.item(1)
    
    adsLdapPath = "LDAP://" & strServerName & "/RootDSE"
    
    Set objDomain = GetObject(adsLdapPath)
        If Err.Number <> 0 Then
        WScript.Echo "Error opening ROOTDSE. Error number is: " & Err.Number & ". Error description is: " & Err.Description & "."
        Set objDomain = Nothing
        WScript.quit
    End If
    
    objDomain.Put "RemoveLingeringObject", ObjValue
    objDomain.Setinfo
    
    If Err.Number = 0 Then
        WScript.Echo "Object " & ObjValue & " was removed."
    Else
        WScript.Echo "Object " & ObjValue & " could not be removed. Error number is: " & Err.Number & ". Error description is: " & Err.Description & "."
    End If
    
    WScript.Quit
    

    注:

    手動で Modifyrootdse.vbs を開始する場合は、スペースを含むパラメーターを引用符で囲んでください。

  5. 残留オブジェクトを含むグローバル カタログ サーバーと DC のすべての完全修飾ドメイン名の一覧を作成し、リストを Server-list.txt に貼り付けます。 DNS サフィックスの検索を回避するには、完全修飾ドメイン名を使用します。

  6. 残留オブジェクトごとに、残留オブジェクトのコピーがないオブジェクト ドメイン内の DC を識別します。 通常、これは、残留オブジェクトを手動で削除する読み取り/書き込み名前付けコンテキストを持つ DC です。 この記事の他の場所で説明されているように、RepAdmin を使用して各 DC の objectGUID 値を取得します。

  7. Object-list.txt で、次の形式を使用して GUID ペアの一覧を作成します。

    <GUID=dcGUID>: <GUID=objectGUID>

    注:

    この値では、 dcGUID は残留オブジェクトのコピーを持たない DC の GUID を表し、 objectGUID は残留オブジェクトの GUID を表します。

    各ペアは次のようになります。

    <GUID=<GUID>>: <GUID=<GUID>>

    重要

    値では、コロンの前後にスペースを省略しないでください。

  8. Walk-servers.cmd ファイルを実行します。

Server-list.txt にリストされている DC またはグローバル カタログ サーバーごとに、スクリプトによって Update-server-name.log という名前のログ ファイルが生成されます。 各ログ ファイルには、削除するオブジェクトごとに 1 行が含まれます。

残留オブジェクトは一覧表示されているサーバーに存在しない可能性があるため、ログ ファイル内のエラーは必ずしも問題を示しているわけではありません。 ただし、フォーム操作のエラー メッセージが拒否されたか、操作エラーが発生すると、GUID または値の構文に問題があることを示します。 これらのエラーが発生した場合は、次のことを確認します。

  • DC GUID が、オブジェクトを含むドメインの読み取り/書き込み名前付けコンテキストを含むドメイン コントローラーの正しい GUID であることを確認します。

  • オブジェクト GUID が、読み取り専用の名前付けコンテキスト (グローバル カタログ サーバーまたは RODC) で残留オブジェクトを識別していることを確認します。

環境内の多くの残留オブジェクトを変更するためにWalkservers.cmdを実行するときのエラー

オブジェクト <GUID=<GUID>> : <GUID=<GUID>> を削除できませんでした。 エラー番号は-2147016672です。 エラーの説明は です。

このエラーの原因

このエラーは、残留オブジェクトを含む名前付けコンテキストに対応する読み取り/書き込み名前付けコンテキストを含まない DC の GUID に対してスクリプトが実行されるときに発生します。 Ldp.exe ツールで残留オブジェクトの場所を確認します。

次の例では、削除する残留オブジェクトは corp.company.local ドメインにあります。 ただし、 <Objects-list.txt ファイルの GUID=<GUID>> エントリは、company.local ドメインに存在する DC に関連付けられています。 この DC には、corp.company.local ドメインの読み取り/書き込み名前付けコンテキストがありません。

次の検索では、同じユーザー (Joe) を表す複数のオブジェクトが生成され、 その objectGUID 値が一覧表示されます。

ldap_search_s(ld, "DC=company,DC=local", 2, "(cn=User*)", attrList, 0, &msg) Result <0>: (null)
一致した DN:
4 つのエントリを取得する:
>> Dn: CN=User,Joe,OU=Exec,OU=Corporate Users,DC=corp,DC=company,DC=local
1> canonicalName: corp.company.local/Corporate Users/Exec/User, Joe;
1> cn: User, Joe; 1> description: CEO;
1> displayName: User, Joe; 1> distinguishedName: CN=User, Joe,OU=Exec,OU=Corporate Users,DC=corp,DC=company,DC=local; 4> objectClass: top; person; organizationalPerson; user;
1> オブジェクトGUID: <GUID>、1> つの名前: User、Joe。
>> Dn: CN=User,Joe,OU=Migration,DC=corp,DC=company,DC=local 1> canonicalName: corp.company.local/Migration/User, Joe;
1> cn: User, Joe;
1> 説明: 無効なアカウント; 1> displayName: User, Joe; 1> distinguishedName: CN=User, Joe,OU=Migration,DC=corp,DC=company,DC=local;
4> objectClass: top;person;組織の個人;ユーザー;
1> オブジェクトGUID: <GUID>
1> 名: ユーザー、Joe。

この例では、corp.company.local ドメインに CORP-DC-01 という名前の DC があると仮定します。 コマンド repadmin /showreps CORP-DC-01 を実行すると、 objectGUID<GUID> が生成されます。 この GUID は、Objects-list.txt ファイル内の前の GUID を置き換えます。 この残留オブジェクトのエントリが次のように表示されるようになりました。

<GUID=<GUID>> : <GUID=<GUID>>

最初の GUID は、corp.company.local ドメイン内のドメイン コントローラーの GUID です。 2 番目の GUID は、残留オブジェクトの GUID です。 この変更後、Walk-servers.cmd スクリプトは正常に実行されます。

環境内の残留オブジェクトを削除するときのエラー メッセージ 87

このエラーは、オブジェクトが実際には、名前付けコンテキスト repadmin /removelingeringobjects をホストしているが削除されないすべての DC に表示されていない場合に発生する可能性があります。 これは、ハブ DC がグローバル カタログ サーバーで作成した新しいオブジェクトをレプリケートするが、独自のドメイン内の読み取り/書き込みレプリカ DC ではレプリケートしない場合に発生する可能性があります。

このエラーは、次の 2 つのケースでのみ返されます。

  • オブジェクトは参照 DC に存在します。
  • オブジェクトが (現在の TSL 値と比較して) 若すぎて残留しません。

2 番目のケースの例として、次のメタデータを持つグローバル カタログ サーバーを考えてみましょう。

Loc.USN 発信元 DC Org.USN Org.Time/Date Ver 属性
======= =============== ========= ============= === =========
143543261 d20f71f3-6147-4f80-a0c2-470541ef09e6 104742409 <DateTime> objectClass
RW レプリカの最新ベクトル: d20f71f3-6147-4f80-a0c2-470541ef09e6 @ USN 104583382 @ Time <DateTime>
GC の Up-To-Dateness Vector: d20f71f3-6147-4f80-a0c2-470541ef09e6 @ USN 104762881 @ Time <DateTime>

この場合、DC は、独自のドメイン内の DC とのレプリケーションが失敗し始めた後にオブジェクトを作成しましたが、他のドメインのグローバル カタログ サーバーとレプリケートされます。

この問題を解決するには、これらのオブジェクトを実際の残留オブジェクト (TSL を超えて期限切れ) にしてから、この記事のスクリプトを使用して削除します。 データのレプリケートを継続するには、フォレスト内のすべての DC で [ 分岐パートナーと破損したパートナーによるレプリケーションを許可する ] を設定します。

これらの方法を使用してログ ファイル内のエラーを解決できない場合は、別の問題が発生している可能性があります。 その他のサポートについては、Microsoft 製品サポート サービスにお問い合わせください。

データ収集

Microsoft サポートからの支援が必要な場合は、「 Active Directory レプリケーションの問題に TSS を使用して情報を収集する」で説明されている手順に従って情報を収集することをお勧めします。