Gli oggetti persistenti possono rimanere dopo aver riportato online un server di catalogo globale non aggiornato

Questo articolo descrive le procedure per la pulizia degli oggetti reintrodotti in ACTIVE Directory dopo il ripristino online di un controller di dominio offline.

Si applica a: Windows Server 2019, Windows Server 2016, Windows Server 2012 R2
Numero KB originale: 314282

Sintomi

Un controller di dominio (DC) o un server di catalogo globale viene portato online dopo che è stato offline da molto tempo. Dopo che è disponibile online, si osserva uno o più dei problemi seguenti:

  • I messaggi di posta elettronica non vengono recapitati a un utente il cui oggetto utente è stato spostato tra domini. Dopo aver riportato online il controller di dominio obsoleto o il server di catalogo globale, entrambe le istanze dell'oggetto utente vengono visualizzate nel catalogo globale. Entrambi gli oggetti hanno lo stesso indirizzo di posta elettronica, pertanto i messaggi di posta elettronica non possono essere recapitati.
  • Un account utente che non esiste più viene ancora visualizzato nell'elenco indirizzi globale.
  • Un gruppo universale che non esiste più viene ancora visualizzato nel token di accesso di un utente.
  • Altri controller di dominio o server di catalogo globale registrano eventi come EventID 1084. Tale oggetto non è presente nel server. Un'ulteriore replica è bloccata nei controller di dominio o nei server di catalogo globale interessati.

Causa

Questi problemi possono verificarsi se il controller di dominio o il server di catalogo globale è offline da più tempo rispetto al valore dell'attributo Tombstone-Lifetime degli oggetti utente.

Per altre informazioni sull'attributo Tombstone-Lifetime , vedere Attributo Tombstone-Lifetime.

L'attributo Tombstone-Lifetime definisce il numero di giorni prima che un oggetto eliminato venga rimosso dai servizi directory. Ciò facilita la rimozione di oggetti dai server replicati e impedisce ai ripristini di reintrodurre un oggetto eliminato. Il valore predefinito è 180 giorni. Dopo tale periodo di tempo, Active Directory non deve più ricordare la modifica.

Se un controller di dominio o un server di catalogo globale è offline per più tempo del valore dell'attributo Tombstone-Lifetime , la relativa copia di Active Directory (o del catalogo globale) può contenere oggetti eliminati negli altri controller di dominio. Tuttavia, gli altri controller di dominio non ricordano più che gli oggetti sono stati eliminati. Quando si porta online il controller di dominio offline, la copia di Active Directory viene sincronizzata con il resto del dominio. Poiché le informazioni sulle eliminazioni sono state eliminate, il controller di dominio replica gli oggetti interessati (definiti oggetti persistenti) nel resto del dominio.

In generale, Servizi di dominio Active Directory usa un modello di replica a coerenza libera, in cui alcuni contesti di denominazione (noti anche come partizioni di directory) sono di lettura/scrittura e altri sono di sola lettura. Quando un controller di dominio che riceve un oggetto replicato che appartiene a un contesto di denominazione di lettura/scrittura e tale oggetto non esiste già nella copia locale dell'albero delle informazioni sulla directory (DIT), il controller di dominio crea l'oggetto. Man mano che il processo di replica continua, l'oggetto viene nuovamente visualizzato in tutti i controller di dominio del dominio.

I controller di dominio e i server di catalogo globale possono anche usare un modello di coerenza di replica rigoroso. In questo modello, quando il controller di dominio riceve un oggetto replicato che non esiste già nel DIT locale, il controller di dominio interrompe la ricezione o l'invio di dati replicati e registra eventi come l'ID evento 1084, "Non esiste alcun oggetto di questo tipo nel server". Per altre informazioni sulla coerenza della replica rigorosa, incluse le circostanze in cui i controller di dominio possono usare questo modello per impostazione predefinita, vedere KB 910205, Informazioni sugli oggetti persistenti in una foresta Windows Server Active Directory. Per altre informazioni sui problemi di rimozione definitiva, vedere KB216993 Durata utile di un backup dello stato del sistema di Active Directory.

Risoluzione 1: determinare se Active Directory ha oggetti persistenti ed evitare oggetti persistenti futuri

KB 910205, illustra diversi modi per determinare se il sistema Active Directory ha accumulato oggetti persistenti. KB 910205 descrive anche i passaggi che è possibile eseguire per impedire l'accumulo di oggetti persistenti.

Risoluzione 2: Eliminare oggetti persistenti

Se l'oggetto non deve esistere in Active Directory, ad esempio se l'oggetto è stato reintrodotto da un controller di dominio obsoleto, è possibile eliminare gli oggetti con gli strumenti standard, ad esempio ADSIEdit o lo snap-in Utenti e computer di Active Directory.

È facile rimuovere oggetti persistenti per i contesti di denominazione di lettura/scrittura. In Windows Server 2003 e versioni successive è possibile rimuovere oggetti persistenti usando il comando repadmin /removelingeringobjects. Per informazioni su come usare RepAdmin, vedere ID evento di replica di Active Directory 1388 o 1988: viene rilevato un oggetto persistente.

Questo articolo descrive come rimuovere oggetti persistenti già visualizzati in contesti di denominazione di sola lettura, ad esempio partizioni di directory in server di catalogo globale o controller di dominio Read-Only. La funzionalità illustrata nella sezione Altre informazioni esiste ancora nei sistemi operativi più recenti e potrebbe essere comunque utile per risolvere i problemi relativi a comportamenti RepAdmin imprevisti.

Ulteriori informazioni

Questa procedura richiede l'objectGUID di un controller di dominio con una copia di lettura/scrittura dell'oggetto e l'objectGUID dell'oggetto stesso. Se è necessario rimuovere più di un oggetto, determinare se uno degli oggetti si trovano in una relazione padre/figlio (è possibile determinarlo dai nomi distinti degli oggetti). In questo caso, ordinare le eliminazioni in modo che tutti gli oggetti figlio vengano eliminati prima degli oggetti padre.

Questa procedura prevede tre passaggi principali, che è necessario eseguire in un computer che ha accesso alla foresta (ed è necessario usare un account utente con autorizzazioni amministrative per la foresta):

  1. Ottenere il nome distinto e ObjectGUID dell'oggetto persistente.
  2. Identificare un controller di dominio nel dominio dell'oggetto.
  3. Eliminare gli oggetti persistenti. Selezionare uno dei metodi seguenti:
    • Eliminare alcuni oggetti persistenti.
    • Eliminare un numero elevato di oggetti persistenti.

Importante

Ogni server di catalogo globale in cui si intende eseguire le operazioni di eliminazione (passaggio 3) deve disporre della connettività di rete al controller di dominio identificato (passaggio 2).

Per informazioni sulla risoluzione dei problemi, vedere le sezioni seguenti:

  • Messaggio di errore durante l'esecuzione Walkservers.cmd per modificare molti oggetti persistenti nell'ambiente.
  • Messaggio di errore 87 durante la rimozione di oggetti persistenti nell'ambiente.

Ottenere il nome distinto e ObjectGUID dell'oggetto persistente

Il modo migliore per identificare il dominio in cui si trova un oggetto (e da questo per determinare il nome di un controller di dominio con una copia di lettura/scrittura dell'oggetto) consiste nel recuperare il nome distinto dell'oggetto. È possibile cercare il nome (o parti del nome) dell'oggetto usando lo strumento Ldp.exe. A tal fine, attenersi alla seguente procedura:

  1. Avviare Ldp.exe.

    Nella maggior parte delle versioni di Windows selezionare Avvia>esecuzione e immettere ldp.exe. Nelle versioni precedenti di Windows ,ad esempio Windows Server 2003 SP1, questo strumento è disponibile come uno degli strumenti di supporto.

  2. Selezionare Connessione>Connetti. Nella casella Server digitare il nome di un server di catalogo globale. Nella casella Porta digitare 3268 e quindi selezionare OK.

  3. Selezionare Associazione connessione>. Digitare credenziali valide se le credenziali correnti non sono sufficienti per eseguire query su tutti i contenuti del catalogo globale. Selezionare OK.

  4. Selezionare Visualizza>albero. Immettere il nome distinto della radice della foresta e quindi selezionare OK.

  5. Nell'elenco ad albero fare clic con il pulsante destro del mouse sulla radice della foresta e quindi scegliere Cerca.

  6. Nella casella Filtro digitare un filtro che usa il <formato attributo> = <valore> .

    Nel testo del filtro l'attributo<> rappresenta l'attributo oggetto da cercare e <il valore> rappresenta i criteri per i quali si sta eseguendo la ricerca. È possibile usare ***** come carattere jolly nel valore ed è possibile usare un'espressione.

    Per informazioni sulla sintassi del filtro LDAP (Lightweight Directory Access Protocol), vedere Search Filter Syntax.

    Ad esempio, per trovare gli oggetti per i quali l'attributo sAMAccountName ha un valore di testuser, digitare (sAMAccountName = testuser) nella casella Filtro . Per cercare un oggetto utente, sono più utili gli attributi seguenti:

    • Cn
    • Userprincipalname
    • Samaccountname
    • Nome
    • posta elettronica
    • Sn

    Per cercare un oggetto gruppo, sono più utili gli attributi seguenti:

    • Cn
    • Samaccountname
    • Nome
  7. In Ambito selezionare Sottoalbero.

  8. Selezionare la casella Attributi e quindi selezionare la fine della stringa di attributo. Tipo ; objectGUID alla fine della stringa.

    Screenshot della finestra Cerca con ;objectGUID tipizzato alla fine della stringa nella casella Attributo.

    In alcune versioni di Ldp è necessario selezionare Opzioni per visualizzare la casella Attributi .

  9. Per eseguire la query, selezionare Esegui.

    I risultati vengono visualizzati nella finestra Ldp principale.

  10. Determinare quali, se presenti, degli oggetti elencati nei risultati devono essere rimossi dal catalogo globale. Un'indicazione che è stato rilevato un oggetto non valido è che l'oggetto non esiste in una copia di lettura/scrittura del contesto di denominazione.

  11. Se gli oggetti cercati non sono inclusi nei risultati della query, riformulare il filtro ed eseguire di nuovo la ricerca.

  12. Se è stato identificato un oggetto persistente, prendere nota dei valori dei relativi attributi DN e objectGUID . Questi valori saranno necessari in un secondo momento.

Identificare un controller di dominio nel dominio dell'oggetto

Il valore dell'attributo DN dell'oggetto include il dominio dell'oggetto. Quando si conosce il dominio, è possibile identificare un controller di dominio o un server di catalogo globale all'interno del dominio. A tale scopo, attenersi alla seguente procedura.

  1. Controllare le parti dc= del valore DN . Combinare le parti dc= per ottenere il nome di dominio.

    Ad esempio, se un oggetto ha il valore DNcn=FirstName LastName,cn=Users,dc=name1,dc=name2,dc=com, l'oggetto si trova nel name1.name2.com dominio.

  2. Per individuare un controller di dominio (o un server di catalogo globale) in questo dominio, aprire Utenti e computer di Active Directory, aprire il contenitore di dominio e quindi aprire il contenitore Controller di dominio.

  3. Aprire una finestra del prompt dei comandi con privilegi elevati e immettere repadmin /showreps dc-name.

    Nota

    In questo comando dc-name rappresenta il nome del computer del controller di dominio identificato nel passaggio 2.

    Nelle versioni precedenti di Windows,ad esempio Windows Server 2003 SP1, RepAdmin è disponibile come uno degli strumenti di supporto.

    Repadmin produce risultati simili ai seguenti:

    Default-First-Site-Name\WS2016-DC-01 DSA Options: IS_GC Site Options: (none) DSA object GUID: <GUID> DSA invocationID: <invocationID>

  4. Si noti il valore del GUID dell'oggetto DSA. Si tratta del valore objectGUID del controller di dominio.

Eliminare oggetti persistenti

Utilizzare i metodi seguenti per eliminare oggetti persistenti.

Eliminare alcuni oggetti persistenti da alcuni server di catalogo globale

Se sono presenti solo alcuni oggetti e cataloghi globali, seguire questa procedura per eliminare gli oggetti usando Ldp.exe:

  1. Usare le credenziali di amministratore dell'organizzazione per accedere a ogni server di catalogo globale che contiene una copia dell'oggetto persistente.

  2. Avviare Ldp.exe e connettersi alla porta 389 nel controller di dominio locale (lasciare vuota la casella Server ).

  3. Selezionare Associazione connessione>. Lasciare vuote tutte le caselle (si è già connessi come amministratore dell'organizzazione).

  4. Selezionare Sfoglia>modifica.

    Screenshot della finestra Modifica con alcune voci che è possibile configurare.

  5. Configurare le voci seguenti nella finestra di dialogo Modifica :

    1. Lasciare vuota la casella Dn .

    2. Nella casella Attributo digitare RemoveLingeringObject.

    3. Nella casella Valori digitare un valore che usa il formato seguente:

      <GUID=dcGUID>: <GUID=objectGUID>

      In questo valore dcGUID rappresenta il GUID del controller di dominio identificato nel passaggio 2 di questa sezione e objectGUID rappresenta il GUID dell'oggetto persistente identificato nel passaggio 1 di questa sezione.

      Il valore dovrebbe essere simile al seguente:

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

      Importante

      Nel valore non omettere gli spazi prima e dopo i due punti.

    4. Selezionare OperationReplace (Sostituiscioperazione>) e quindi INVIO.

      La casella Elenco voci mostra il comando completo.

    5. Selezionare Esegui.

      I risultati vengono visualizzati nella finestra Ldp principale e dovrebbero essere simili ai seguenti.

      Modifica chiamata... ldap_modify_s(ld, '(null)',[1] attrs); Modificato "".

Eliminare un numero elevato di oggetti persistenti da diversi server di catalogo globale

Se è necessario eliminare un numero elevato di oggetti persistenti, è possibile eliminarli in modo più efficiente usando gli script che eliminandoli manualmente. Per compilare tali script, seguire questa procedura:

  1. Creare una nuova cartella e in tale cartella creare nuovi file con i nomi seguenti:

    • Walkservers.cmd
    • Walkobjects.cmd
    • Modifyrootdse.vbs
    • Server-list.txt
    • Object-list.txt file
  2. Incollare il testo seguente in Walkservers.cmd:

    for /f %%j in (server-list.txt) do walkobjects %%j
    
  3. Incollare il testo seguente in Walkobjects.cmd:

    for /f "delims=@" %%i in (object-list.txt) do cscript //NoLogo MODIFYROOTDSE.VBS %1 "%%i" >>update-%1.log
    
  4. Incollare il testo seguente in 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
    

    Nota

    Se si inizia Modifyrootdse.vbs manualmente, assicurarsi di racchiudere tra virgolette tutti i parametri che contengono spazi.

  5. Creare un elenco di tutti i nomi di dominio completi dei server di catalogo globale e dei controller di dominio che contengono gli oggetti persistenti e quindi incollare l'elenco in Server-list.txt. Usare i nomi di dominio completi per evitare ricerche di suffissi DNS.

  6. Per ogni oggetto persistente, identificare un controller di dominio nel dominio dell'oggetto che non dispone di una copia dell'oggetto persistente. In genere si tratta di un controller di dominio con un contesto di denominazione di lettura/scrittura in cui è stato eliminato manualmente l'oggetto persistente. Come descritto altrove in questo articolo, usare RepAdmin per ottenere il valore objectGUID di ogni controller di dominio.

  7. In Object-list.txt creare un elenco di coppie GUID usando il formato seguente:

    <GUID=dcGUID>: <GUID=objectGUID>

    Nota

    In questo valore dcGUID rappresenta il GUID del controller di dominio che non dispone di una copia dell'oggetto persistente e objectGUID rappresenta il GUID dell'oggetto persistente.

    Ogni coppia dovrebbe essere simile alla seguente:

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

    Importante

    Nel valore non omettere gli spazi prima e dopo i due punti.

  8. Eseguire il file Walk-servers.cmd.

Per ogni controller di dominio o server di catalogo globale elencato in Server-list.txt, gli script generano un file di log denominato Update-server-name.log. Ogni file di log contiene una riga per ogni oggetto da eliminare.

Poiché gli oggetti persistenti potrebbero non esistere in tutti i server elencati, gli errori nei file di log non indicano necessariamente un problema. Tuttavia, i messaggi di errore dell'operazione di modulo rifiutati o l'errore dell'operazione indicano che si è verificato un problema con i GUID o con la sintassi del valore. Se si verificano questi errori, verificare quanto segue:

  • Assicurarsi che i GUID dc siano i GUID corretti per i controller di dominio che contengono un contesto di denominazione di lettura/scrittura del dominio che contiene l'oggetto.

  • Assicurarsi che i GUID degli oggetti identifichino gli oggetti persistenti in contesti di denominazione di sola lettura (server di catalogo globale o controller di dominio di sola lettura).

Errore durante l'esecuzione di Walkservers.cmd per modificare molti oggetti persistenti nell'ambiente

Impossibile rimuovere l'oggetto <GUID=<GUID>> : <GUID=<GUID>> . Il numero di errore è: -2147016672. La descrizione dell'errore è: .

Causa dell'errore

Questo errore si verifica quando lo script viene eseguito sul GUID di un controller di dominio che non contiene un contesto di denominazione di lettura/scrittura corrispondente al contesto di denominazione che contiene l'oggetto persistente. Verificare la posizione dell'oggetto persistente tramite lo strumento Ldp.exe.

Esempio

Nell'esempio seguente l'oggetto persistente da rimuovere si trova nel dominio corp.company.local. Tuttavia, la <voce GUID=<GUID>> nel file Objects-list.txt è associata a un controller di dominio che risiede nel dominio company.local. Questo controller di dominio non dispone di un contesto di denominazione di lettura/scrittura per il dominio corp.company.local.

La ricerca seguente produce più oggetti che rappresentano lo stesso utente (Joe) ed elenca i relativi valori objectGUID .

ldap_search_s(ld, "DC=company,DC=local", 2, "(cn=User*)", attrList, 0, &msg) Risultato <0>: (null)
DN corrispondenti:
Recupero di 4 voci:
>> 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: Utente, Joe; 1> descrizione: 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> objectGUID: <GUID>; 1> nome: Utente, Joe;
>> Dn: CN=User, Joe,OU=Migration,DC=corp,DC=company,DC=local 1> canonicalName: corp.company.local/Migration/User, Joe;
1> cn: Utente, Joe;
1> descrizione: Account disabilitato; 1> displayName: Utente, Joe; 1> distinguishedName: CN=User, Joe,OU=Migration,DC=corp,DC=company,DC=local;
4> objectClass: top; person; organizationalPerson; user;
1> objectGUID: <GUID>;
1> nome: Utente, Joe;

In questo esempio si supponga che nel dominio corp.company.local sia presente un controller di dominio denominato CORP-DC-01. L'esecuzione del comando repadmin /showreps CORP-DC-01 produce il GUID> del valore<objectGUID. Questo GUID sostituisce il GUID precedente nel file Objects-list.txt. La voce per questo oggetto persistente viene ora visualizzata come segue:

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

Il primo GUID è il GUID del controller di dominio nel dominio corp.company.local. Il secondo GUID è il GUID dell'oggetto persistente. Dopo questa modifica, lo script Walk-servers.cmd viene eseguito correttamente.

Messaggio di errore 87 durante la rimozione di oggetti persistenti nell'ambiente

Questo errore può verificarsi quando gli oggetti non vengono visualizzati in tutti i controller di dominio che ospitano il contesto di denominazione, ma repadmin /removelingeringobjects non li rimuove. Può trattarsi di una situazione in cui un controller di dominio hub replica nuovi oggetti creati con server di catalogo globale, ma non con controller di dominio di replica di lettura/scrittura nel proprio dominio.

Questo errore viene restituito solo in due casi:

  • L'oggetto esiste nel controller di dominio di riferimento.
  • L'oggetto è troppo giovane (rispetto al valore TSL corrente) per essere persistente.

Per un esempio del secondo caso, si consideri un server di catalogo globale con i metadati seguenti:

Attributo Loc.USN di origine DC Org.USN Org.Time/Date Ver
======= =============== ========= ============= === =========
143543261 d20f71f3-6147-4f80-a0c2-470541ef09e6 104742409 <oggetto DateTimeClass>
Vettore up-to-dateness di una replica RW: d20f71f3-6147-4f80-a0c2-470541ef09e6 @ USN 104583382 @ Time <DateTime>
Up-To-Dateness Vector of a GC: d20f71f3-6147-4f80-a0c2-470541ef09e6 @ USN 104762881 @ Time <DateTime>

In questo caso il controller di dominio ha creato l'oggetto dopo la replica con i controller di dominio nel proprio dominio ha iniziato a non riuscire, ma è ancora replicato con server di catalogo globale in altri domini.

Per risolvere questo problema, lasciare che questi oggetti diventino oggetti persistenti reali (obsoleti oltre TSL) e quindi rimuoverli usando lo script in questo articolo. Per assicurarsi che i dati continuino a essere replicati, impostare Consenti replica con partner divergente e danneggiato in tutti i controller di dominio nella foresta.

Se non è possibile risolvere gli errori nei file di log usando questi metodi, è possibile che si verifichi un problema diverso. Per ulteriore assistenza, contattare il Servizio Supporto Tecnico Clienti Microsoft.

Raccolta dei dati

Se è necessaria l'assistenza del supporto tecnico Microsoft, è consigliabile raccogliere le informazioni seguendo i passaggi indicati in Raccogliere informazioni usando TSS per i problemi di replica di Active Directory.