Quantas GPOs do seu domínio não fazem nada?
Abra o Group Policy Management do seu domínio e conte quantas GPOs existem. Agora responda: quantas dessas estão de fato aplicadas em alguma coisa?
Se você hesitou, o problema já começou. Porque a resposta quase nunca é "todas".
Quase sempre, uma GPO que alguém criou para testar, aplicou uma vez, e nunca removeu, é deixada lá. Toda política que foi desligada porque "estava dando problema" e ninguém teve coragem de apagar, continua lá. Em um ambiente com alguns anos de vida, é comum que um terço ou mais das GPOs não afete uma única máquina.
Elas não fazem mal direto. Uma GPO parada não aplica nada, não quebra nada. O problema é outro, e é mais sutil.
Por que o lixo importa
O problema de uma GPO que não faz nada não é ela. É o que a presença dela faz com a sua capacidade de entender o próprio ambiente.
Quando metade das suas GPOs é ruído, você perde a noção de qual política controla o quê. Vai auditar uma configuração de segurança e encontra três GPOs com nomes parecidos, duas inúteis e uma útil, e precisa abrir cada uma para descobrir qual está no ar. Vai fazer uma mudança e não sabe se aquela GPO ainda é usada ou se é resíduo de coisa antiga. O SYSVOL fica inchado, a replicação carrega peso a toa, e qualquer relatório de configuração vira uma caça ao que é real.
Um ambiente que você não consegue ler é um ambiente que você não consegue proteger. GPO morta não é sujeira estética, é névoa em cima da coisa que você mais precisa enxergar com clareza.
GPO "que não faz nada" tem três formas
O termo é vago, e vale separar, porque cada forma esconde uma história diferente sobre como o ambiente ficou assim.
A órfã pura. Foi criada e nunca linkada em lugar nenhum. Existe no diretório, tem configurações dentro, e nunca tocou uma máquina. Quase sempre é resto de teste. Alguém montou para experimentar, aplicou por outro caminho, e a GPO ficou. É a forma mais fácil de detectar e a mais inofensiva, porque nunca esteve no ar.
A que teve o link desligado. Essa já esteve aplicada. Em algum momento alguém desabilitou o link em vez de removê-lo, geralmente durante um troubleshooting ("desliga isso aqui pra ver se para o problema"). O problema parou, e o link nunca voltou nem foi apagado. Essa é mais interessante, porque documenta uma decisão que ninguém registrou, alguma coisa naquela política estava causando efeito, e a solução foi desligar sem saber efetivamente o motivo.
A que tem o status desabilitado. Aqui a GPO pode até estar linkada, mas o status dela está como "todas as configurações desabilitadas". Ela aparece aplicada na árvore, o que engana quem olha rápido, mas não entrega nenhuma configuração. É a mais traiçoeira das três, porque parece ativa.
As três somam no seu total de ruído. A primeira é a que você conta primeiro, porque é a que roda limpo em qualquer ambiente sem margem de erro.
Conte as órfãs puras
Toda GPO que está linkada em algum lugar tem o próprio identificador escrito no atributo gPLink de algum site, domínio ou OU. A lógica da contagem é direta: pegue todas as GPOs que existem, pegue todos os identificadores que aparecem em algum gPLink, e a diferença entre os dois conjuntos são as órfãs.
Roda em qualquer Domain Controller, só lê, não altera nada:
$todas = Get-GPO -All
$linkadas = (Get-ADObject -Filter 'gPLink -like "*"' -Properties gPLink |
ForEach-Object { [regex]::Matches($_.gPLink, '{[0-9A-Fa-f-]+}') } |
ForEach-Object { $_.Value.Trim('{','}') }) | Sort-Object -Unique
$orfas = $todas | Where-Object { $linkadas -notcontains $_.Id.Guid }
"GPOs no total: $($todas.Count)"
"Sem link nenhum: $($orfas.Count)"
Duas linhas de saída: quantas GPOs existem, e quantas não estão linkadas em coisa nenhuma. A segunda dividida pela primeira é a fração do seu ambiente que é puro resíduo.
Para ver o nome de cada órfã, e não só a contagem, adicione uma linha ao final. A variável $orfas já contém apenas as sem link, então isto lista só elas, não o domínio inteiro:
$orfas | Select-Object DisplayName, CreationTime
A data de criação costuma contar a história sozinha: um monte de GPO órfã criada no mesmo mês de anos atrás é a marca de um projeto que veio, testou, e foi embora sem limpar.
Some as que têm o status desligado
A terceira forma, a GPO que aparece na árvore mas está com todas as configurações desabilitadas, tem um comando próprio e igualmente limpo:
$mortas = Get-GPO -All | Where-Object { $_.GpoStatus -eq 'AllSettingsDisabled' }
"GPOs com tudo desabilitado: $($mortas.Count)"
Essas são as que enganam a leitura rápida. Estão linkadas, aparecem aplicadas, e não entregam nada. Quem audita olhando só a árvore de links conta elas como vivas.
A segunda forma, o link desabilitado, é a mais trabalhosa de varrer, porque exige percorrer o gPLink de cada container e ler a flag de cada link, um a um. Não cabe em uma linha honesta, e fazer caber gera um comando frágil que quebra no copiar e colar. Essa varredura completa, a que cruza as três formas e devolve o inventário limpo do que está vivo e do que é resíduo, é um dos exercícios do curso de AD. Aqui o ponto é outro, fazer você ver que o número existe, e que é maior do que você imaginava.
O que fazer com o número, e o que não fazer
A tentação, depois de rodar isso, é sair apagando. Não faça.
GPO parada é barata de deixar e cara de apagar errado. A órfã pura você pode remover com relativa tranquilidade, ela nunca esteve no ar. Mas a que teve o link desligado e a que está com status desabilitado carregam a pergunta que ninguém respondeu na época: por que desligaram isso? Apagar sem saber a resposta é apagar a única pista de um problema antigo que pode voltar.
O caminho certo é o mesmo de sempre em AD, primeiro entender, depois mexer. Para cada GPO que o comando devolveu, uma pergunta antes de qualquer ação.
Ela é resto de teste, ou é uma decisão desligada no escuro? A data de criação e o nome geralmente dizem. "Teste-WSUS-v2" criada e nunca linkada é lixo. "Bloqueio-USB" com o link desabilitado há dois anos é uma decisão que alguém tomou e não documentou, e merece investigação antes do delete.
Se eu apagar, alguém sente falta? Antes de remover, o backup. Backup-GPO guarda a política inteira, e reverter um delete precipitado vira trivial. Ninguém deveria apagar GPO sem backup, do mesmo jeito que ninguém formata sem confirmar que tem cópia.
O inventário não é o fim, é o começo. O número que o comando devolve é o tamanho da névoa. Limpar a névoa, com método, sem apagar o que importa, é o trabalho. E é justamente o tipo de coisa que separa quem opera o AD no susto de quem projeta um AD que se lê sozinho.
Rode os dois comandos no seu ambiente. Some as órfãs puras com as de status desabilitado.
Esse é o piso do seu ruído, e o número verdadeiro, com os links desligados incluídos, é maior ainda.
Qual foi o seu?