Objetos persistentes podem permanecer depois que você colocar um servidor de catálogo global desatualizado novamente online

Este artigo descreve procedimentos para limpar objetos que são reintroduzidos no AD depois que você colocar um DC offline novamente online.

Aplica-se a: Windows Server 2019, Windows Server 2016, Windows Server 2012 R2
Número de KB original: 314282

Sintomas

Você coloca um dc (controlador de domínio) ou um servidor de catálogo global online depois que ele estiver offline por um longo tempo. Depois que ele estiver online, você observará um ou mais dos seguintes problemas:

  • As mensagens de email não são entregues a um usuário cujo objeto de usuário foi movido entre domínios. Depois de colocar o servidor dc ou catálogo global desatualizado novamente online, ambas as instâncias do objeto de usuário aparecem no catálogo global. Ambos os objetos têm o mesmo endereço de email, portanto, as mensagens de email não podem ser entregues.
  • Uma conta de usuário que não existe mais ainda aparece na lista de endereços global.
  • Um grupo universal que não existe mais ainda aparece no token de acesso de um usuário.
  • Outros DCs ou servidores de catálogo globais registram eventos como EventID 1084, Não há nenhum objeto desse tipo no servidor. Outra replicação é bloqueada nos DCs afetados ou nos servidores de catálogo globais.

Motivo

Esses problemas poderão ocorrer se o servidor de catálogo dc ou global estiver offline por mais tempo do que o valor do atributo Tombstone-Lifetime dos objetos de usuário.

Para obter mais informações sobre o atributo Tombstone-Lifetime , consulte Atributo Tombstone-Lifetime.

O atributo Tombstone-Lifetime define o número de dias antes de um objeto excluído ser removido dos serviços de diretório. Isso ajuda na remoção de objetos de servidores replicados e na prevenção de restaurações de reintroduzir um objeto excluído. O valor padrão é 180 dias. Depois desse tempo, o Active Directory não precisa mais lembrar da alteração.

Se um dc ou um servidor de catálogo global estiver offline por mais tempo do que o valor do atributo Tombstone-Lifetime , sua cópia do Active Directory (ou o catálogo global) poderá conter objetos que foram excluídos nos outros DCs. No entanto, os outros DCs não se lembram mais de que os objetos foram excluídos. Quando você coloca o DC offline online, ele sincroniza sua cópia do Active Directory com o restante do domínio. Como as informações sobre as exclusões foram descartadas, o DC replica os objetos afetados (conhecidos como objetos persistentes) de volta para o restante do domínio.

Em geral, o AD DS usa um modelo de replicação de consistência frouxa, no qual alguns contextos de nomenclatura (também conhecidos como partições de diretório) são leitura/gravação e outros são somente leitura. Quando um DC que recebe um objeto replicado que pertence a um contexto de nomenclatura de leitura/gravação e esse objeto ainda não existe na cópia local da DIT (Árvore de Informações do Diretório), o DC cria o objeto. À medida que o processo de replicação continua, o objeto reaparece em todos os DCs no domínio.

DCs e servidores de catálogo globais também podem usar um modelo de consistência de replicação rigoroso. Nesse modelo, quando o DC recebe um objeto replicado que ainda não existe no DIT local, o DC para de receber ou enviar eventos de dados e logs replicados, como a ID de Evento 1084, "Não há nenhum objeto desse tipo no servidor". Para obter mais informações sobre consistência de replicação estrita, incluindo as circunstâncias em que os DCs podem usar esse modelo por padrão, consulte KB 910205, Informações sobre objetos persistentes em uma floresta Windows Server Active Directory. Para obter mais informações sobre problemas de lápide, consulte KB216993 Vida útil útil de um backup de estado do sistema do Active Directory.

Resolução 1: determinar se o Active Directory tem objetos persistentes e evitar objetos persistentes futuros

KB 910205, explica várias maneiras pelas quais determinar se seu sistema Active Directory acumulou objetos persistentes. KB 910205 também descreve as etapas que você pode tomar para evitar que objetos persistentes se acumulem.

Resolução 2: excluir objetos persistentes

Se o objeto não deve existir no Active Directory em tudo (por exemplo, se o objeto foi reintroduzido por um controlador de domínio desatualizado), você poderá excluir os objetos com as ferramentas padrão (como ADSIEdit ou o snap-in Usuários e Computadores do Active Directory).

É fácil remover objetos persistentes para contextos de nomenclatura de leitura/gravação. No Windows Server 2003 e versões posteriores, você pode remover objetos persistentes usando o comando repadmin /removelingeringobjects. Para obter informações sobre como usar o RepAdmin, consulte ID de evento de replicação do Active Directory 1388 ou 1988: um objeto persistente é detectado.

Este artigo descreve como remover objetos persistentes que já apareceram em contextos de nomenclatura somente leitura, como partições de diretório em servidores de catálogo globais ou Read-Only CONTROLADORes de Domínio (RODCs). A funcionalidade discutida na seção Mais informações ainda existe em sistemas operacionais mais recentes e ainda pode ser útil para solucionar problemas de comportamento inesperado do RepAdmin.

Mais informações

Esse procedimento requer o objectGUID de um DC que tem uma cópia de leitura/gravação do objeto e o objectGUID do objeto em si. Se você precisar remover mais de um objeto, determine se algum dos objetos está em uma relação pai/filho (você pode determinar isso dos nomes distintos dos objetos). Se esse for o caso, peça as exclusões para que todos os objetos filho sejam excluídos antes dos objetos pai.

Esse procedimento tem três etapas principais, que você precisa executar em um computador que tenha acesso à floresta (e você precisa usar uma conta de usuário que tenha permissões administrativas na floresta):

  1. Obtenha o nome diferenciado e ObjectGUID do objeto persistente.
  2. Identifique um DC no domínio do objeto.
  3. Exclua os objetos persistentes. Selecione um dos seguintes métodos:
    • Exclua alguns objetos persistentes.
    • Exclua um grande número de objetos persistentes.

Importante

Cada servidor de catálogo global no qual você pretende executar as operações de exclusão (etapa 3) deve ter conectividade de rede com o controlador de domínio que você identificou (etapa 2).

Para obter informações sobre solução de problemas, confira as seguintes seções:

  • Mensagem de erro ao executar Walkservers.cmd para modificar muitos objetos persistentes no ambiente.
  • Mensagem de erro 87 ao remover objetos persistentes no ambiente.

Obter o nome diferenciado e ObjectGUID do objeto persistente

A melhor maneira de identificar o domínio no qual um objeto está localizado (e a partir disso para determinar o nome de um DC que tem uma cópia de leitura/gravação do objeto) é recuperar o nome distinto do objeto. Você pode pesquisar o nome (ou partes do nome) do objeto usando a ferramenta Ldp.exe. Para fazer isso, siga estas etapas:

  1. Inicie Ldp.exe.

    Na maioria das versões do Windows, selecione Iniciar>Executar e insiraldp.exe. Em versões mais antigas do Windows (como o Windows Server 2003 SP1) essa ferramenta está disponível como uma das Ferramentas de Suporte.

  2. Selecione Conexão>Conectar. Na caixa Servidor , digite o nome de um servidor de catálogo global. Na caixa Porta , digite 3268 e selecione OK.

  3. Selecione Associação de Conexão>. Digite credenciais válidas se suas credenciais atuais não forem suficientes para consultar todo o conteúdo do catálogo global. Selecione OK.

  4. Selecione Exibir>Árvore. Insira o nome diferenciado da raiz da floresta e selecione OK.

  5. Na lista de árvores, clique com o botão direito do mouse na raiz da floresta e selecione Pesquisar.

  6. Na caixa Filtrar , digite um filtro que usa o <atributo> = <formato de valor> .

    No texto do filtro, <o atributo> representa o atributo de objeto a ser pesquisado e <o valor> representa os critérios para os quais você está pesquisando. Você pode usar ***** como um caractere curinga no valor e pode usar uma expressão.

    Para obter informações sobre a sintaxe de filtro LDAP (Protocolo de Acesso ao Diretório Leve), consulte Sintaxe de Filtro de Pesquisa.

    Por exemplo, para localizar objetos para os quais o atributo sAMAccountName tem um valor de testuser, type (sAMAccountName = testuser) na caixa Filtrar . Para pesquisar um objeto de usuário, os seguintes atributos são mais úteis:

    • Cn
    • userPrincipalName
    • Samaccountname
    • name
    • Correio
    • sn

    Para pesquisar um objeto de grupo, os seguintes atributos são mais úteis:

    • Cn
    • Samaccountname
    • name
  7. Em Escopo, selecione Subtree.

  8. Selecione a caixa Atributos e selecione o final da cadeia de caracteres de atributo. Digite ; objectGUID no final da cadeia de caracteres.

    Captura de tela da janela Pesquisar com ;objectGUID digitado no final da cadeia de caracteres na caixa Atributo.

    Em algumas versões do Ldp, você precisa selecionar Opções para ver a caixa Atributos .

  9. Para executar a consulta, selecione Executar.

    Os resultados aparecem na janela main Ldp.

  10. Determine qual, se houver, dos objetos listados nos resultados devem ser removidos do catálogo global. Uma indicação de que você encontrou um objeto ruim é que o objeto não existe em uma cópia de leitura/gravação do contexto de nomenclatura.

  11. Se os objetos que você está procurando não estiverem incluídos nos resultados da consulta, retraia o filtro e execute a pesquisa novamente.

  12. Se você identificou um objeto persistente, observe os valores de seus atributos DN e objectGUID . Você precisará desses valores mais tarde.

Identificar um DC no domínio do objeto

O valor do atributo DN do objeto inclui o domínio do objeto. Quando você conhece o domínio, você pode identificar um servidor de catálogo dc ou global dentro do domínio. Para fazer isso, execute as etapas a seguir.

  1. Verifique as partes dc= do valor DN . Combine as partes dc= para obter o nome de domínio.

    Por exemplo, se um objeto tiver o valor DN de cn=FirstName LastName,cn=Users,dc=name1,dc=name2,dc=com, o objeto estará no name1.name2.com domínio.

  2. Para localizar um DC (ou um servidor de catálogo global) neste domínio, abra Usuários e Computadores do Active Directory, abra o contêiner de domínio e abra o contêiner controladores de domínio.

  3. Abra uma janela do Prompt de Comando elevado e insira repadmin /showreps dc-name.

    Observação

    Neste comando, o nome dc representa o nome do computador do DC que você identificou na etapa 2.

    Em versões mais antigas do Windows (como o Windows Server 2003 SP1), o RepAdmin está disponível como uma das Ferramentas de Suporte.

    O repadmin produz resultados que se assemelham aos seguintes:

    Opções DSA default-First-Site-Name\WS2016-DC-01 DSA: IS_GC Opções do site: (nenhum) objeto DSA GUID: <GUID> DSA invocationID: <invocationID>

  4. Observe o valor do GUID do objeto DSA. Este é o valor objectGUID do DC.

Excluir objetos persistentes

Use os métodos a seguir para excluir objetos persistentes.

Excluir alguns objetos persistentes de alguns servidores de catálogo globais

Se você tiver apenas alguns objetos e catálogos globais, siga estas etapas para excluir os objetos usando Ldp.exe:

  1. Use credenciais do Administrador Empresarial para entrar em cada servidor de catálogo global que contém uma cópia do objeto persistente.

  2. Inicie Ldp.exe e conecte-se à porta 389 no controlador de domínio local (deixe a caixa Servidor vazia).

  3. Selecione Associação de Conexão>. Deixe todas as caixas vazias (você já está conectado como administrador da empresa).

  4. Selecione Procurar>Modificar.

    A captura de tela da janela Modificar com algumas entradas pode ser configurada.

  5. Configure as seguintes entradas na caixa de diálogo Modificar :

    1. Deixe a caixa Dn vazia.

    2. Na caixa Atributo, digiteRemoveLingeringObject.

    3. Na caixa Valores , digite um valor que usa o seguinte formato:

      <GUID=dcGUID>: <GUID=objectGUID>

      Nesse valor, o dcGUID representa o GUID do DC que você identificou na etapa 2 desta seção, e objectGUID representa o GUID do objeto persistente que você identificou na etapa 1 desta seção.

      O valor deve se assemelhar ao seguinte:

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

      Importante

      No valor, não omita os espaços antes e depois do cólon.

    4. Selecione Operação>Substituir e, em seguida, selecione Inserir.

      A caixa Lista de Entrada mostra o comando completo.

    5. Selecione Executar.

      Os resultados aparecem na janela Ldp main e devem se assemelhar ao seguinte.

      Modificar chamada... ldap_modify_s(ld, '(null)',[1] attrs); Modificado "".

Excluir um grande número de objetos persistentes de vários servidores de catálogo globais

Se você precisar excluir um grande número de objetos persistentes, poderá excluir de forma mais eficiente usando scripts do que excluindo-os manualmente. Para criar esses scripts, use as seguintes etapas:

  1. Crie uma nova pasta e, nessa pasta, crie novos arquivos que tenham os seguintes nomes:

    • Walkservers.cmd
    • Walkobjects.cmd
    • Modifyrootdse.vbs
    • Server-list.txt
    • arquivo Object-list.txt
  2. Cole o seguinte texto em Walkservers.cmd:

    for /f %%j in (server-list.txt) do walkobjects %%j
    
  3. Cole o seguinte texto em Walkobjects.cmd:

    for /f "delims=@" %%i in (object-list.txt) do cscript //NoLogo MODIFYROOTDSE.VBS %1 "%%i" >>update-%1.log
    
  4. Cole o seguinte texto em 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
    

    Observação

    Se você começar a Modifyrootdse.vbs manualmente, certifique-se de incluir entre aspas todos os parâmetros que contenham espaços.

  5. Crie uma lista de todos os nomes de domínio totalmente qualificados dos servidores de catálogo globais e DCs que contêm os objetos persistentes e cole a lista em Server-list.txt. Use os nomes de domínio totalmente qualificados para evitar pesquisas de sufixo DNS.

  6. Para cada objeto persistente, identifique um DC no domínio do objeto que não tenha uma cópia do objeto persistente. Normalmente, este é um DC que tem um contexto de nomenclatura de leitura/gravação no qual você excluiu manualmente o objeto persistente. Conforme descrito em outro lugar neste artigo, use RepAdmin para obter o valor objectGUID de cada DC.

  7. Em Object-list.txt, crie uma lista de pares GUID usando o seguinte formato:

    <GUID=dcGUID>: <GUID=objectGUID>

    Observação

    Nesse valor, dcGUID representa o GUID do DC que não tem uma cópia do objeto persistente, e objectGUID representa o GUID do objeto persistente.

    Cada par deve se assemelhar ao seguinte:

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

    Importante

    No valor, não omita os espaços antes e depois do cólon.

  8. Execute o arquivo Walk-servers.cmd.

Para cada servidor de catálogo DC ou global listado em Server-list.txt, os scripts geram um arquivo de log chamado Update-server-name.log. Cada arquivo de log contém uma linha para cada objeto que deve ser excluído.

Como os objetos persistentes podem não existir em todos os servidores listados, os erros nos arquivos de log não indicam necessariamente um problema. No entanto, mensagens de erro da operação de formulário recusada ou erro de operação indicam que há um problema com os GUIDs ou com a sintaxe do valor. Se esses erros ocorrerem, verifique o seguinte:

  • Verifique se os GUIDs dc são os GUIDs corretos para controladores de domínio que contêm um contexto de nomenclatura de leitura/gravação do domínio que contém o objeto.

  • Verifique se os GUIDs do objeto identificam objetos persistentes em contextos de nomenclatura somente leitura (servidores de catálogo globais ou RODCs).

Erro ao executar Walkservers.cmd para modificar muitos objetos persistentes no ambiente

Objeto <GUID=<GUID>> : <GUID=<GUID>> não pôde ser removido. O número de erro é: -2147016672. A descrição do erro é: .

Causa desse erro

Esse erro ocorre quando o script é executado no GUID de um DC que não contém um contexto de nomenclatura de leitura/gravação que corresponde ao contexto de nomenclatura que contém o objeto persistente. Verifique o local do objeto persistente pela ferramenta Ldp.exe.

Exemplo

No exemplo a seguir, o objeto persistente a ser removido está localizado no domínio corp.company.local. No entanto, a <entrada GUID=<GUID>> no arquivo Objects-list.txt está associada a um DC que reside no domínio company.local. Este DC não tem um contexto de nomenclatura de leitura/gravação para o domínio corp.company.local.

A pesquisa a seguir produz vários objetos que representam o mesmo usuário (Joe) e lista seus valores objectGUID .

ldap_search_s(ld, "DC=company,DC=local", 2, "(cn=User*)", attrList, 0, &msg) Resultado <0>: (nulo)
DNs correspondentes:
Obtendo 4 entradas:
>> 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: Usuário, Joe; 1 descrição> : 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: Usuário, Joe;
>> Dn: CN=User, Joe,OU=Migration,DC=corp,DC=company,DC=local 1> canonicalName: corp.company.local/Migration/User, Joe;
1> cn: Usuário, Joe;
1> descrição: Conta desabilitada; 1> displayName: Usuário, 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: Usuário, Joe;

Neste exemplo, presuma que haja um DC no domínio corp.company.local chamado CORP-DC-01. Executar o comando repadmin /showreps CORP-DC-01 produz o guid> de valor<objectGUID. Este GUID substitui o GUID anterior no arquivo Objects-list.txt. A entrada para este objeto persistente agora aparece da seguinte maneira:

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

O primeiro GUID é o GUID do controlador de domínio no domínio corp.company.local. O segundo GUID é o GUID do objeto persistente. Após essa alteração, o script Walk-servers.cmd é executado com êxito.

Mensagem de erro 87 ao remover objetos persistentes no ambiente

Esse erro pode ocorrer quando você descobre que os objetos não aparecem em todos os DCs que hospedam o contexto de nomenclatura, mas repadmin /removelingeringobjects não os remove. Isso pode ser uma situação quando um DC do hub replica novos objetos criados com servidores de catálogo globais, mas não com DCs de leitura/gravação réplica em seu próprio domínio.

Esse erro é retornado apenas em dois casos:

  • O objeto existe no DC de referência.
  • O objeto é muito jovem (comparado ao valor TSL atual) para ser persistente.

Para um exemplo do segundo caso, considere um servidor de catálogo global que tenha os seguintes metadados:

Atributo Loc.USN Originário DC Org.USN Org.Time/Date Ver
======= =============== ========= ============= === =========
143543261 d20f71f3-6147-4f80-a0c2-470541ef09e6 104742409 <objeto DateTimeClass>
Vetor atualizado de um RW-réplica: d20f71f3-6147-4f80-a0c2-470541ef09e6 @ USN 104583382 @ Time <DateTime>
Vetor atualizado de um GC: d20f71f3-6147-4f80-a0c2-470541ef09e6 @ USN 104762881 @ Time <DateTime>

Nesse caso, o DC criou o objeto após a replicação com os DCs em seu próprio domínio começar a falhar, mas ele ainda foi replicado com servidores de catálogo globais em outros domínios.

Para resolve esse problema, deixe que esses objetos se tornem objetos persistentes reais (envelhecidos além do TSL) e, em seguida, remova-os usando o script neste artigo. Para garantir que os dados continuem a ser replicados, defina Permitir Replicação com Parceiro Divergente e Corrompido em todos os DCs na floresta.

Se você não puder resolve os erros nos arquivos de log usando esses métodos, poderá estar enfrentando um problema diferente. Entre em contato com os Serviços de Suporte ao Produto da Microsoft para obter assistência adicional.

Coleta de dados

Se você precisar de ajuda do suporte da Microsoft, recomendamos coletar as informações seguindo as etapas mencionadas em Coletar informações usando problemas de replicação do TSS para Active Directory.