Erro “The requested domain could not be deleted because there exist domain controllers that still host this domain” ao tentar remover um domínio filho.
By Josué Yen
Introdução
Há alguns meses trabalhei em um chamado muito interessante, onde o cliente estava criando um ambiente de testes através de P2V, criando uma réplica do seu domínio Windows Server 2003 em um laboratório virtual. Como parte da preparação do ambiente ele precisava realizar um Metadata Cleanup removendo DCs e domínios que não seriam usados neste teste, porém ao tentar remover um domínio filho ele estava recebendo a seguinte mensagem: "The requested domain could not be deleted because there exist domain controllers that still host this domain"
Normalmente quando este erro aparece basta procurar por algum Domain Controller que foi esquecido no processo e despromover através do DCPROMO.EXE ou Metadata Cleanup. Algumas vezes quando os objetos são deletados, eles podem se tornar “órfãos” e com isso serão enviados para o container Lost and Found. Neste caso eles podem ser removidos pelo ADSIEDIT.MSC, porém neste caso já estava tudo limpo.
Durante o processo de “limpeza” do ambiente de testes, muitos Sites e seus componentes foram removidos, e dentro desses containers normalmente ficam informações sobre Domain Controllers e os Domínios (Naming Content). Em alguns casos, por algum motivo desconhecido, quando o objeto CN=NTDS Settings de um site é deletado o atributo msDS-hasMasterNCs não é apagado e continua junto do objeto em Tombstone. No Windows 2000 e Windows Server 2003 sem Service Pack o objeto fica nesse estado por 60 dias até que seja deletado permanentemente. Quando o Service Pack 1 do Windows Server 2003 é instalado o período é alterado para 180 dias.
Determinando a causa do problema
Quando fui engajado neste chamado o engenheiro já havia identificado a causa do problema executando o comando: ldifde -f msDs_hasMasterNCs.txt -d cn=configuration,dc=contoso,dc=com -x -r "(objectclass=ntdsdsa)" -l msds-hasmasterNCs esse comando trouxe um Output parecido com o abaixo:
dn: CN=NTDS Settings\0ADEL:7ec338db-cfda-4f92-b254-37429ea9a0ca,CN=CONTOSODC4\0ADEL:1e26f310-5577-41ae-816b-1355a2ee3f01,CN=Servers,CN=SITE01,CN=Sites,CN=Configuration,DC=contoso,DC=com
changetype: add
msDS-hasMasterNCs: DC=ForestDnsZones,DC=contoso,DC=com
msDS-hasMasterNCs: DC=child,DC=contoso,DC=com
msDS-hasMasterNCs: CN=Schema,CN=Configuration, DC=contoso,DC=com
msDS-hasMasterNCs: CN=Configuration, DC=contoso,DC=com
dn: CN=NTDS Settings\0ADEL:44475949-1a25-4293-9121-23760b4fad5a,CN=CONTOSODC1\0ADEL:2cf628bf-6101-491c-9fa7-c2762a6e7d3b,CN=Servers\0ADEL:cad630e3-6e57-4231-8bb9-fec8a7ace8fd,CN=SITE02\0ADEL:e4733629-aeac-43c2-9a1f-38c116bc78a1,CN=Sites,CN=Configuration, DC=contoso,DC=com
changetype: add
dn: CN=NTDS Settings\0ADEL:ca837fe6-2ba2-45f0-a091-c30495ff83b7,CN=CONTOSODC10\0ADEL:2ed7ae7d-a219-44a2-b535-a71950bf62c5,CN=Servers\0ADEL:d2182d9f-4200-4b37-a7e2-087add80ea1b,CN=SITE01\0ADEL:d32a8228-545e-411e-9ea8-796019161c67,CN=Sites,CN=Configuration, DC=contoso,DC=com
changetype: add
Encontramos a “sujeira” no nosso ambiente, porém a pergunta era: Como deletar o atributo de um objeto que já foi deletado? E a resposta é muito simples: Reanimando o objeto e deletando novamente. Porém antes de mostrar como isso pode ser feito, eu gostaria de explicar para vocês como a deleção de um objeto funciona no AD.
O que acontece quando os objetos são deletados no AD?
Quando um objeto é deletado ele não é apagado da base. Na verdade a seguinte operação especial de modificação do objeto é feito:
- O atributo isDeleted é alterado para True
- O Relative Distinguished name do objeto é alterado para um valor que não pode ser configurado por uma aplicação que use LDAP
- Todos os atributos que não serão mais necessário são removidos, deixando apenas alguns atributos importantes, como objectGUID, objectSid, distinguishedName, nTSecurityDescriptor, uSNChanged e lastKnownParent (o último Distinguished Name do objeto)
- O objeto é movido para o container oculto Deleted Objects
Após todos esses passos o objeto é considerado um Tombstone. Alguns objetos de configuração são protegidos e o NTDS Settings é um deles. Por isso quando ele é deletado todos os passos acima são seguidos com exceção do passo 4. Isso explica por que o objeto deletado continua dentro de CN=Sites,CN=Configuration,DC=contoso,DC=com
Como reanimar um objeto que foi deletado?
O processo para reanimar um objeto é bem simples. De uma forma bem resumida basta remover o atributo isDeleted e mudar o atributo distinguishedName com o DN do local onde o objeto reanimado vai ficar. Neste caso podemos usar o valor guardado em lastKnownParent.
NOTA: Um objeto só pode ser reanimado em um Controlador de domínio Windows Server 2003 em diante.
Existem ferramentas que podem nos ajudar nesta tarefa e uma delas é o ADRestore da Sysinternals que pode ser obtida clicando aqui.
O seu funcionamento é bem simples, após o download e instalar o programa, basta abrir um prompt de comando elevado e digitar adrestore.exe e uma lista com todos os objetos em Tombstone será listado conforme a figura abaixo:
Para restaurar qualquer um dos objetos basta executar o comando novamente com o parâmetro –r. Quando esse parâmetro for usado a aplicação irá pedirá confirmação para cada objeto se você deseja reanimar.
Após restaurar o objeto ele estará localizado no DN especificado no atributo lastKnownParent.
Se o ADRestore não conseguir listar o objeto que você pretende reanimar a alternativa será fazer isso manualmente. Para essa operação vamos usar o LDP.EXE que pode ser obtido no Support Tools. E siga os passos abaixo:
1- Com o Support Tools instalado vá até Iniciar > Executar > ldp.exe
2- Na console do LDP precisamos conectar em um Domain Controller. Para isso vá até Connection e selecione Connect
3- Se você estiver abrindo o LDP direto de um Domain Controller deixe o campo server em branco. Mantenha a porta padrão 389 e clique em OK. Caso contrário digite o nome ou IP do DC.
4- Após se conectar em um DC devemos nos autenticar. Para isso vá novamente a Connection e selecione Bind
5- Se você já estiver logado no servidor como um usuário com direitos de Doman Administrator selecione “Bnd as currently logged on user” caso contrário selecione “Bind with Credentials” e coloque suas credenciais
6- Depois de conectado e autenticado, clique em View e selecione Tree para escolher a partição que vamos acessar.
7- Para irmos até os sites devemos nos conectar na partição de Configuração
8- Ao expandir a partição de configuração encontraremos o Container dos sites
9- Expanda os sites e localize o site onde o servidor estava e vá descendo até encontrar o servidor que foi deletado (repare que o nome foi alterado com a adição de \0ADEL: {GUID})
10- Selecione o servidor e clicando com o botão direito selecione Modify
11- No campo Attribute digite isDeleted e deixe o campo Values em branco. Selecione a operação Delete e clique em Enter
12- Repita o passo anterior, porém em atribute digite distinguishedName, no campo Values digite o DN do servidor terminando no nome do servidor (ex: CN=WIN2K3DC03,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=JOSUE,DC=YEN). Selecione a operação Replace e clique em Enter
13- Selecione a opção Synchronous e extended. A tela deve ficar parecida com a abaixo:
14- Para iniciar a restauração do objeto clique em Run
15- Se tudo estiver correto teremos uma mensagem parecida com a abaixo:
***Call Modify...
ldap_modify_ext_s(Id,
‘CN=blvaagc-ads001\0ADEL:2cf628bf-6101-491c-9fa7-c2762a6e7d3b,CN=Servers,CN=SITE02,CN=Sites,CN=Configuration,DC=JOSUE,DC=YEN;
Modified
“CN=blvaagc-ads001\0ADEL:2cf628bf-6101-491c-9fa7-c2762a6e7d3b,CN=Servers,CN=SITE02,CN=Sites,CN=Configuration,DC=JOSUE,DC=YEN”.
Depois que o servidor foi reanimado podemos ver ele de volta na console Sites and Services. Abaixo do servidor também temos o container CN= NTDS Settings que também precisa ser restaurado seguindo os passos acima. Depois de tudo restaurado, basta deletar eles novamente.
Se toda a estrutura do site foi apagado, vamos precisar restaura toda a estrutura do site seguindo todos os passos anteriores para os seguintes objetos:
- Restaure o DN: CN=<Nome_do_Site>,CN=Sites,CN=Configuration,DC=JOSUE,DC=YEN
- Restaure o DN: CN=Servers,CN=<Nome_do_Site>,CN=Configuration,DC=JOSUE,DC=YEN
- Restaure o DN: CN=<Nome_do_Servidor>,CN=Servers,CN=<Nome_do_Site>,CN=Configuration,DC=JOSUE,DC=YEN
- Restaure o DN: CN=NTDS Settings,CN=<Nome_do_Servidor>,CN=Servers,CN=<Nome_do_Site>,CN=Configuration,DC=JOSUE,DC=YEN
Conclusão
O ato de remover domain controllers do domínio ou até mesmo Domínios dentro da nossa floresta é muito simples, porém é necessário sempre seguir cuidadosamente as recomendações abaixo:
Removing a Domain Controller from a Domain
How to remove data in Active Directory after an unsuccessful domain controller demotion
How to remove orphaned domains from Active Directory
Para saber qual o tempo de Tombstone do seu domínio siga as instruções do artigo abaixo:
Determine the tombstone lifetime for the forest
Se estiver procurando informações sobre como restaurar objetos do domínio, abaixo temos um ótimo artigo:
How to restore deleted user accounts and their group memberships in Active Directory