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

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

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

現象

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

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

原因

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

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

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

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

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

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

解決策 1: Active Directory にオブジェクトが残っているかどうかを判断し、将来のオブジェクトの残りを回避する

KB 910205、ActiveDirectory システムが残っているオブジェクトを蓄積したかどうかを判断する方法について説明します。 KB 910205、オブジェクトが蓄積されるのを防ぐための手順も説明します。

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

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

読み取り/書き込みの名前付けコンテキストの残っているオブジェクトを簡単に削除できます。 サーバー 2003 Windows以降のバージョンでは、コマンドを使用して残っているオブジェクトを削除できます repadmin /removelingeringobjects 。 RepAdmin の使い方の詳細については 、「Active Directory Replication Event 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実行] を 選択 し、[ > スタート] と 入力 ldp.exe。 以前のバージョンの Windows (Windows Server 2003 SP1 など) では、このツールはサポート ツールの 1 つとして使用できます。

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

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

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

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

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

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

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

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

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

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

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

  8. [属性 ] ボックスを 選択し、属性文字列の末尾を選択します。 文字列 の末尾に;objectGUID と入力します。

    [LDP 検索] ダイアログ ボックス

    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: DSA の呼び出し <GUID> ID: <invocationID>

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

残っているオブジェクトを削除する

残っているオブジェクトを削除するには、次のメソッドを使用します。

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

少数のオブジェクトとグローバル カタログがある場合は、次の手順に従って、次の手順に従ってオブジェクトを削除Ldp.exe。

  1. 管理者Enterpriseを使用して、残っているオブジェクトのコピーを含む各グローバル カタログ サーバーにサインインします。

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

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

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

    LDP を使用してオブジェクトを変更する

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

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

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

    <GUID=dcGUID>: GUID=objectGUID <GUID=objectGUID>

    注意

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

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

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

    重要

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

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

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

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

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

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

Walkservers.cmd を実行して環境内の多くの残っているオブジェクトを変更する場合のエラー

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

このエラーの原因

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

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

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

ldap_search_s(ld, "DC=company,DC=local", 2, "(cn=User*)", attrList, 0, &msg) 結果 <>: (null)
一致する NS:
4 つのエントリを取得する:
>> Dn: CN=User , Joe,OU=Exec,OU=Corporate Users,DC=corp,DC=company,DC=local
1>標準名: corp.company.local/Corporate Users/Exec/User, Joe;
1> cn: User, Joe;1>説明: CEO;
1> displayName: User, Joe;1>識別名: CN=User , Joe,OU=Exec,OU=Corporate Users,DC=corp,DC=company,DC=local; 4> objectClass: top;人。organizationalPerson;ユーザー。
1> オブジェクトGUID: <GUID> ; 1>名: User, Joe;
>> Dn: CN=User , Joe,OU=Migration,DC=corp,DC=company,DC=local 1> 標準名: corp.company.local/Migration/User, Joe;
1> cn: User, Joe;
1>説明: 無効なアカウント。1> displayName: User, Joe; 1>識別名: CN=User , Joe,OU=Migration,DC=corp,DC=company,DC=local;
4> objectClass: top;人。organizationalPerson;ユーザー。
1> GUID: <GUID>
1>名: User、 Joe;

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

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

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

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

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

このエラーは、次の 2 つの場合にのみ返されます。

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

2 番目のケースの例では、次のメタデータを持つグローバル カタログ サーバーを検討してください。

Loc.USN 発信元 DC Org.USN Org.Time/Date Ver 属性
======= =============== ========= ============= === =========
143543261 d20f71f3-6147-4f80-a0c2-470541ef09e6 <DateTime> 104742409 objectClass
RW レプリカの Up-To-Dateness Vector: 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 を超えて古い) になり、この記事のスクリプトを使用して削除します。 データが引き続きレプリケートされるのを確認するには、フォレスト内のすべての PC で [Divergent によるレプリケーションを許可する] と [破損パートナー] を設定します。

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