Compartilhar via


Os objetos persistentes podem permanecer depois de colocar um servidor de catálogo global desatualizado novamente online

Este artigo descreve os procedimentos para limpar objetos que são reintroduzidos no AD depois de voltar a colocar um DC offline online.

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

Sintomas

Pode colocar um controlador de domínio (DC) ou um servidor de catálogo global online depois de este estar offline durante muito tempo. Depois de estar online, irá ver um ou mais dos seguintes problemas:

  • As mensagens de e-mail não são entregues a um utilizador cujo objeto de utilizador foi movido entre domínios. Depois de colocar o DC desatualizado ou o servidor de catálogo global novamente online, ambas as instâncias do objeto de utilizador aparecem no catálogo global. Ambos os objetos têm o mesmo endereço de e-mail, pelo que não é possível entregar mensagens de e-mail.
  • Uma conta de utilizador que já não existe ainda aparece na lista de endereços global.
  • Um grupo universal que já não existe ainda aparece no token de acesso de um utilizador.
  • Outros DCs ou servidores de catálogo global registam eventos como EventID 1084. Não existe tal objeto no servidor. A replicação adicional é bloqueada nos DCs afetados ou nos servidores de catálogo global.

Motivo

Estes problemas podem ocorrer se o DC ou o servidor de catálogo global estiver offline há mais tempo do que o valor do atributo Tombstone-Lifetime dos objetos de utilizador.

Para obter mais informações sobre o atributo Tombstone-Lifetime , veja Tombstone-Lifetime attribute (Atributo Tombstone-Lifetime).

O atributo Tombstone-Lifetime define o número de dias antes de um objeto eliminado ser removido dos serviços de diretório. Isto ajuda a remover objetos de servidores replicados e a impedir que os restauros reintroduzam um objeto eliminado. O valor padrão é 180 dias. Após esse período, o Active Directory já não precisa de memorizar a 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 , a respetiva cópia do Active Directory (ou catálogo global) poderá conter objetos que tenham sido eliminados nos outros DCs. No entanto, os outros DCs já não se lembram de que os objetos foram eliminados. Quando colocar o DC offline online, sincroniza a respetiva cópia do Active Directory com o resto do domínio. Uma vez que as informações sobre as eliminações foram eliminadas, o DC replica os objetos afetados (referidos como objetos persistentes) de volta para o resto do domínio.

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

Os DCs e os servidores de catálogo global também podem utilizar um modelo de consistência de replicação rigoroso. Neste modelo, quando o DC recebe um objeto replicado que ainda não existe no DIT local, o DC deixa de receber ou enviar dados replicados e regista eventos, como o ID do Evento 1084, "Não existe tal objeto no servidor". Para obter mais informações sobre a consistência de replicação rigorosa, incluindo as circunstâncias em que os DCs podem utilizar este modelo por predefinição, veja KB 910205, Informações sobre objetos persistentes numa floresta do Active Directory do Windows Server. Para obter mais informações sobre problemas de tombstone, veja KB216993 Útil prazo de validade de uma cópia de segurança de estado do sistema do Active Directory.

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

A BDC 910205, explica várias formas de determinar se o seu sistema do Active Directory tem objetos persistentes acumulados. O 910205 também descreve os passos que pode seguir para impedir que objetos persistentes se acumulem.

Resolução 2: Eliminar objetos persistentes

Se o objeto não deve existir no Active Directory (por exemplo, se o objeto tiver sido reintroduzido por um controlador de domínio desatualizado), pode eliminar os objetos com as ferramentas padrão (como ADSIEdit ou o snap-in Utilizadores e Computadores do Active Directory).

É fácil remover objetos persistentes para contextos de nomenclatura de leitura/escrita. No Windows Server 2003 e versões posteriores, pode remover objetos persistentes com o comando repadmin /removelingeringobjects. Para obter informações sobre como utilizar o RepAdmin, consulte ID de Evento de Replicação do Active Directory 1388 ou 1988: É detetado um objeto persistente.

Este artigo descreve como remover objetos persistentes que já apareceram em contextos de nomenclatura só de leitura, como partições de diretórios em servidores de catálogo global ou controladores de domínio Read-Only (RODCs). A funcionalidade abordada na secção Mais informações ainda existe em sistemas operativos mais recentes e ainda pode ser útil para resolver problemas de comportamento inesperado do RepAdmin.

Mais informações

Este procedimento requer o objectGUID de um DC que tenha uma cópia de leitura/escrita do objeto e o objectGUID do próprio objeto. Se tiver de remover mais do que um objeto, determine se algum dos objetos está numa relação principal/subordinada (pode determinar isto a partir dos nomes distintos dos objetos). Se for este o caso, ordene as eliminações para que todos os objetos subordinados sejam eliminados antes dos objetos principais.

Este procedimento tem três passos principais, que tem de executar num computador com acesso à floresta (e tem de utilizar uma conta de utilizador que tenha permissões administrativas na floresta):

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

Importante

Cada servidor de catálogo global no qual pretende executar as operações de eliminação (passo 3) tem de ter conectividade de rede ao controlador de domínio que identificou (passo 2).

Para obter informações sobre a resolução de problemas, veja as secções seguintes:

  • 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 único e ObjectGUID do objeto persistente

A melhor forma de identificar o domínio em que um objeto está localizado (e a partir daí para determinar o nome de um DC que tem uma cópia de leitura/escrita do objeto) é obter o nome único do objeto. Pode procurar o nome (ou partes do nome) do objeto com a ferramenta Ldp.exe. Para fazer isso, siga estas etapas:

  1. Comece Ldp.exe.

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

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

  3. SelecioneVincularLigação>. Escreva credenciais válidas se as suas credenciais atuais não forem suficientes para consultar todos os conteúdos do catálogo global. Selecione OK.

  4. Selecione Ver>Árvore. Introduza o nome único da raiz da floresta e, em seguida, selecione OK.

  5. Na lista de árvores, clique com o botão direito do rato na raiz da floresta e, em seguida, selecione Procurar.

  6. Na caixa Filtro , escreva um filtro que utilize o <formato atributo> = <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 está a procurar. Pode utilizar ***** como caráter universal no valor e pode utilizar uma expressão.

    Para obter informações sobre a sintaxe do filtro LDAP (Lightweight Directory Access Protocol), veja Search Filter Syntax (Sintaxe do Filtro de Pesquisa).

    Por exemplo, para localizar objetos para os quais o atributo sAMAccountName tem um valor de testuser, escreva (sAMAccountName = testuser) na caixa Filtro . Para procurar um objeto de utilizador, os seguintes atributos são mais úteis:

    • cn
    • userPrincipalName
    • sAMAccountName
    • name
    • correio
    • sn

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

    • cn
    • sAMAccountName
    • name
  7. Em Âmbito, selecione Subárvore.

  8. Selecione a caixa Atributos e, em seguida, selecione o fim da cadeia de atributos. Tipo ; objectGUID no final da cadeia.

    Captura de ecrã da janela Procurar com ;objectGUID escrito no final da cadeia na caixa Atributo.

    Em algumas versões do Ldp, tem de selecionar Opções para ver a caixa Atributos .

  9. Para executar a consulta, selecione Executar.

    Os resultados são apresentados na janela Ldp principal.

  10. Determine quais, se existirem, dos objetos listados nos resultados devem ser removidos do catálogo global. Uma indicação de que encontrou um objeto incorreto é que o objeto não existe numa cópia de leitura/escrita do contexto de nomenclatura.

  11. Se os objetos que procura não estiverem incluídos nos resultados da consulta, volte a sintagma o filtro e execute a pesquisa novamente.

  12. Se tiver identificado um objeto persistente, tenha em atenção os valores dos respetivos atributos DN e objectGUID . Irá 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 conhecer o domínio, pode identificar um SERVIDOR DE DC ou um servidor de catálogo 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 está no name1.name2.com domínio.

  2. Para localizar um DC (ou um servidor de catálogo global) neste domínio, abra Utilizadores e Computadores do Active Directory, abra o contentor de domínio e, em seguida, abra o contentor Controladores de Domínio.

  3. Abra uma janela de Linha de Comandos elevada e introduza repadmin /showreps dc-name.

    Observação

    Neste comando, dc-name representa o nome do computador do DC que identificou no passo 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 semelhantes aos seguintes:

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

  4. Tenha em atenção o valor do GUID do objeto DSA. Este é o valor objectGUID do DC.

Eliminar objetos persistentes

Utilize os seguintes métodos para eliminar objetos persistentes.

Eliminar alguns objetos persistentes de alguns servidores de catálogo global

Se tiver apenas alguns objetos e catálogos globais, siga estes passos para eliminar os objetos com Ldp.exe:

  1. Utilize as credenciais de Administrador do Enterprise para iniciar sessão em cada servidor de catálogo global que contém uma cópia do objeto persistente.

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

  3. SelecioneVincularLigação>. Deixe todas as caixas vazias (já tem sessão iniciada como Administrador do Enterprise).

  4. Selecione Procurar>Modificar.

    Captura de ecrã da janela Modificar com algumas entradas que podem ser configuradas.

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

    1. Deixe a caixa DN vazia.

    2. Na caixa Atributo , escreva RemoveLingeringObject.

    3. Na caixa Valores , escreva um valor que utilize o seguinte formato:

      <GUID=dcGUID>: <GUID=objectGUID>

      Neste valor, dcGUID representa o GUID do DC que identificou no passo 2 desta secção e objectGUID representa o GUID do objeto persistente que identificou no passo 1 desta secção.

      O valor deve assemelhar-se ao seguinte:

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

      Importante

      No valor, não omita os espaços antes e depois dos dois pontos.

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

      A caixa Lista de Entradas mostra o comando completo.

    5. Selecione Executar.

      Os resultados são apresentados na janela Ldp principal e devem assemelhar-se ao seguinte.

      Chamar Modificar... ldap_modify_s(ld, '(null)',[1] attrs); "" modificado.

Eliminar um grande número de objetos persistentes de vários servidores de catálogo global

Se tiver de eliminar um grande número de objetos persistentes, pode eliminar de forma mais eficiente ao utilizar scripts do que ao eliminá-los manualmente. Para criar esses scripts, utilize os seguintes passos:

  1. Crie uma nova pasta e, nessa pasta, crie novos ficheiros com os seguintes nomes:

    • Walkservers.cmd
    • Walkobjects.cmd
    • Modifyrootdse.vbs
    • Server-list.txt
    • Object-list.txt ficheiro
  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 começar a Modifyrootdse.vbs manualmente, certifique-se de que coloca entre aspas quaisquer parâmetros que contenham espaços.

  5. Crie uma lista de todos os nomes de domínio completamente qualificados dos servidores de catálogo global e DCs que contêm os objetos persistentes e, em seguida, cole a lista em Server-list.txt. Utilize os nomes de domínio completamente qualificados para evitar pesquisas de sufixos DNS.

  6. Para cada objeto persistente, identifique um DC no domínio de objeto que não tenha uma cópia do objeto persistente. Normalmente, este é um DC que tem um contexto de nomenclatura de leitura/escrita no qual eliminou manualmente o objeto persistente. Conforme descrito noutro local neste artigo, utilize RepAdmin para obter o valor objectGUID de cada DC.

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

    <GUID=dcGUID>: <GUID=objectGUID>

    Observação

    Neste 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 assemelhar-se ao seguinte:

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

    Importante

    No valor, não omita os espaços antes e depois dos dois pontos.

  8. Execute o ficheiro Walk-servers.cmd.

Para cada dc ou servidor de catálogo global listado no Server-list.txt, os scripts geram um ficheiro de registo com o nome Update-server-name.log. Cada ficheiro de registo contém uma linha para cada objeto que vai ser eliminado.

Uma vez que os objetos persistentes podem não existir em todos os servidores listados, os erros nos ficheiros de registo não indicam necessariamente um problema. No entanto, as mensagens de erro da operação de formulário recusadas ou erro de operação indicam que existe um problema com os GUIDs ou com a sintaxe do valor. Se estes erros ocorrerem, verifique o seguinte:

  • Confirme que os GUIDs do DC são os GUIDs corretos para controladores de domínio que contêm um contexto de nomenclatura de leitura/escrita do domínio que contém o objeto.

  • Confirme que os GUIDs de objeto identificam objetos persistentes em contextos de nomenclatura só de leitura (servidores de catálogo global ou RODCs).

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

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

Causa para este erro

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

Exemplo

No exemplo seguinte, o objeto persistente a ser removido está localizado no domínio corp.company.local. No entanto, a <entrada GUID=<GUID>> no ficheiro 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/escrita para o domínio corp.company.local.

A pesquisa seguinte produz vários objetos que representam o mesmo utilizador (João) e lista os respetivos valores objectGUID .

ldap_search_s(ld, "DC=company,DC=local", 2, "(cn=User*)", attrList, 0, &msg) Resultado <0>: (nulo)
DNs correspondentes:
A obter 4 entradas:
>> Dn: CN=User, Joe,UO=Exec,UO=Corporate Users,DC=corp,DC=company,DC=local
1> canonicalName: corp.company.local/Corporate Users/Exec/User, Joe;
1> cn: Utilizador, João; 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: Utilizador, João;
>> Dn: CN=User, Joe,UO=Migration,DC=corp,DC=company,DC=local 1> canonicalName: corp.company.local/Migration/User, Joe;
1> cn: Utilizador, João;
1> descrição: Conta Desativada; 1> displayName: User, Joe; 1> distinguishedName: CN=User, Joe,OU=Migration,DC=corp,DC=company,DC=local;
4> objectClass: top; person; organizationalPerson; utilizador;
1> objectGUID: <GUID>;
1> nome: Utilizador, João;

Neste exemplo, suponha que existe um DC no domínio corp.company.local com o nome CORP-DC-01. A execução do comando repadmin /showreps CORP-DC-01 produz o GUID do valor <objectGUID>. Este GUID substitui o GUID anterior no ficheiro Objects-list.txt. A entrada para este objeto persistente é agora apresentada da seguinte forma:

<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 esta alteração, o script Walk-servers.cmd é executado com êxito.

Mensagem de erro 87 ao remover objetos persistentes no ambiente

Este erro pode ocorrer quando deteta que os objetos não aparecem em todos os DCs que alojam o contexto de nomenclatura, mas repadmin /removelingeringobjects não os remove. Isto pode ser uma situação em que um DC do hub replica novos objetos que criou com servidores de catálogo global, mas não com DCs de réplica de leitura/escrita no seu próprio domínio.

Este erro é devolvido apenas em dois casos:

  • O objeto existe no DC de referência.
  • O objeto é demasiado jovem (em comparação com o valor TSL atual) para ser persistente.

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

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

Neste caso, o DC criou o objeto após a replicação com os DCs no seu próprio domínio que começaram a falhar, mas ainda assim replicado com servidores de catálogo global noutros domínios.

Para resolver este problema, deixe que estes objetos se tornem objetos persistentes reais (com idade superior a TSL) e, em seguida, remova-os com o script neste artigo. Para se certificar de que os dados continuam a ser replicados, defina Permitir Replicação Com Parceiro Divergente e Danificado em todos os DCs na floresta.

Se não conseguir resolver os erros nos ficheiros de registo com estes métodos, poderá estar a ter um problema diferente. Contacte os Serviços de Suporte Técnico da Microsoft para obter assistência adicional.

Coleta de dados

Se precisar de ajuda do suporte da Microsoft, recomendamos que recolha as informações ao seguir os passos mencionados em Recolher informações com o TSS para problemas de replicação do Active Directory.