Como encontrar (e remover) GPOS não vinculados no Active Directory

À medida que uma organização cresce, também cresce seu ambiente de Active Directory (AD) e infraestrutura de Group Policy (GP). Os objetos de Group Policy (GPOs) podem logo ficar fora de controle e, antes que você perceba, terá dezenas de GPOs desvinculados que estão bagunçando seu ambiente. Vamos mudar isso.

Neste tutorial, você aprenderá como descobrir todos esses GPOs desvinculados tanto com o Group Policy Management Console (GPMC) quanto com o PowerShell.

Vamos lá!

Pré-requisitos

Este artigo será um tutorial com exemplos práticos. Se você quiser acompanhar, certifique-se de ter:

De onde vêm os GPOs desvinculados?

Quando você cria uma GPO e define todas as configurações que pretende aplicar aos computadores clientes, essa GPO na verdade não está fazendo nada. Para afetar realmente os computadores clientes, a GPO deve ser vinculada a uma unidade organizacional (OU) do AD.

À medida que o tempo passa e mais administradores criam GPOs, esquecem de vinculá-las, desvinculam GPOs das OUs, pretendem removê-las mas nunca o fazem, as GPOs ficam apenas paradas e não fazem nada podem se proliferar. Especialmente em organizações grandes, GPOs desvinculadas podem se multiplicar até atingirem centenas se não forem devidamente mantidas.

Localizando GPOs Desvinculadas no GPMC

Você pode encontrar GPOs desvinculadas de duas maneiras: via GPMC ou via PowerShell. Se você tiver apenas algumas GPOs desvinculadas, pode fazer sentido usar o GPMC em vez de criar um script do PowerShell.

Para encontrar GPOs desvinculadas via GPMC:

1. Abra o GPMC indo para o menu Iniciar e digitando “gerenciamento de política de grupo”. Quando o programa GPMC aparecer, abra-o.

2. No GPMC, vá para Floresta: <nome da sua floresta —> Domínios —> <nome do seu domínio>, clique com o botão direito no nome do domínio e clique em Procurar. Esta ação abrirá a caixa de diálogo Procurar Objetos de Política de Grupo.

Search option in GPMC console

3. Clique na lista suspensa Item de Pesquisa e selecione os links de GPO. Este item de pesquisa irá procurar GPOs que estão ligadas a uma OU. Altere a lista suspensa Condição para ser Existem Em e o domínio para ser o seu domínio.

Na captura de tela abaixo, a combinação dessas configurações procurará todas as GPOs ligadas a pelo menos uma OU no domínio homelab.local.

Quando terminar, clique em Adicionar para adicionar o critério. Ele aparecerá na seção Todos os critérios de pesquisa.

Adding search item in “Search for Group Policy Objects” window

4. Agora, clique no botão Pesquisar para encontrar todas as GPOs que correspondem aos critérios de pesquisa.

using search option in “Search for Group Policy Objects” window

5. Como mostrado na captura de tela abaixo, apenas as GPOs ligadas são mostradas nos resultados da pesquisa.

Search results for linked GPOs

6. Para encontrar as GPOs não ligadas, compare manualmente todas as GPOs com as GPOs ligadas, conforme mostrado abaixo. Na captura de tela abaixo, apenas três GPOs estão ligadas. Ao olhar sob o nó Objetos de Política de Grupo, você pode ver que duas das GPOs não aparecem (UnlinkedGPO1 e UnlinkedGPO2). Isso significa que elas não estão ligadas.

Esta tarefa será demorada e é por isso que você verá como executar esta tarefa via PowerShell na próxima seção.

Comparing search results with all the Group Policy Objects

As GPOs ligadas terão um link quando estiverem atribuídas a um objeto AD como uma OU, conforme mostrado abaixo. Se você tiver apenas algumas GPOs, pode procurar GPOs que têm um link e aquelas que não têm um link. As GPOs que não têm um link são as GPOs não ligadas.

Displaying linked GPO

Encontrando GPOs Não Ligadas com PowerShell

Pesquisar através dos GPOs no GPMC pode funcionar para alguns GPOs, mas você vai ter dificuldades se tiver centenas ou milhares de GPOs gerenciando milhares de endpoints. Nesse caso, é hora de automatizar esse processo e construir uma ferramenta útil do PowerShell.

Supondo que você esteja em seu PC Windows local associado ao domínio com RSAT instalado:

1. Abra um console do Windows PowerShell.

2. Importe o módulo GroupPolicy. O módulo GroupPolicy vem com o RSAT e deve estar instalado em seu sistema. Este módulo contém todos os comandos necessários para trabalhar com GPOs no PowerShell.

Import-Module GroupPolicy

3. Execute o cmdlet do PowerShell Get-GPO usando o parâmetro All. Este cmdlet consulta o AD e retorna todos os GPOs encontrados.

Get-GPO -All
Get-Gpo cmdlet output

4. Agora que você pode consultar todos os GPOs no domínio, você precisa descobrir quais estão desvinculados. Para fazer isso, execute o cmdlet Get-GPOReport. Este cmdlet permite que você forneça um nome e um tipo de saída para retornar.

Get-GPOReport -Name SomeGPO -ReportType XML

Copie e cole manualmente um dos nomes de GPO encontrados na etapa acima e execute este comando. Você verá que o cmdlet retorna um relatório XML de todas as configurações que os GPOs possuem. Em particular, observe a seção chamada LinksTo, como mostrado abaixo. Esta seção contém o nó XML SOMPath que representa o caminho para a OU à qual está vinculado.

Sample output containing LinksTo section

O cmdlet Get-GPOReport só pode obter um relatório para um único GPO de cada vez. Este cmdlet inclui apenas resultados de pesquisa de domínios e não de sites AD.

5. Agora que você sabe como encontrar todos os GPOs com o Get-GPO e o cmdlet para descobrir com o que eles estão vinculados (Get-GPOReport), combine-os copiando e colando o comando PowerShell abaixo em seu console.

O comando abaixo consulta todos os GPOs no domínio (Get-GPO) e depois gera um relatório XML para cada um deles (Get-GPOReport), permitindo apenas aqueles que não têm uma string <LinksTo> no relatório (Select-String) serem retornados.

Get-GPO -All | Where-Object {
     $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>"
 }

No ambiente do tutorial, você pode ver no exemplo abaixo que UnlinkedGPO1 e UnlinkedGPO2 não estão vinculados a nenhum OU.

Listing out unlinked GPO in the domain

Construindo uma Ferramenta PowerShell para GPOs não Vinculados

Agora vamos colocar tudo que você aprendeu junto e construir um script PowerShell que você pode usar no mundo real.

1. Abra seu editor de código favorito e copie/cole o seguinte script PowerShell nele. Salve o script como Remove-UnlinkedGPO.ps1. Este script:

  • Cria uma pasta com a data atual para armazenar relatórios de GPOs não vinculados.
  • Encontra todos os GPOs no AD que não estão vinculados.
  • Cria um relatório HTML para cada GPO não vinculado e o salva no disco.
  • Cria e anexa a um arquivo de texto uma lista de todos os GPOs não vinculados.
  • Remove cada GPO não vinculado com uma etapa de confirmação usando o cmdlet Remove-GPO.

Você também pode baixar o script Remove-UnlinkedGPO.ps1 via GitHub.

Import-Module GroupPolicy
 $Date = Get-Date -Format dd_MM_yyyy
 $BackupDir = "c:\GPOBackup\$Date"
## Cria um diretório para armazenar os relatórios GPO
 if (-Not(Test-Path -Path $BackupDir))  {
   New-Item -ItemType Directory $BackupDir -Force
 }
# Obter todas as GPOs com o tipo de relatório gpo como XML e também procurar a seção no relatório xml.
# Considere apenas as GPOs que não têm a seção.
 Get-GPO -All | Where-Object { $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>" } | ForEach-Object {
   # Fazer backup da GPO, relatório HTML e salvar os detalhes da GPO em um arquivo de texto são opcionais.
   Backup-GPO -Name $_.DisplayName -Path $BackupDir
    # Executar o relatório e salvar como um relatório HTML no disco
   Get-GPOReport -Name $_.DisplayName -ReportType Html -Path "$BackupDir\$($_.DisplayName).html"
   # Criar e anexar a um arquivo de texto chamado UnlinkedGPOs.txt na pasta de backup que
   # contém cada objeto GPO que Get-GPO retorna
   $_ | Select-Object * | Out-File "$BackupDir\UnLinkedGPOs.txt" -Append
   # Remover a GPO mas primeiro solicitar antes de remover
   $_.Displayname | Remove-GPO -Confirm
 }

2. Execute o script Remove-UnlinkedGPO.ps1.

3. Se um GPO não vinculado for encontrado, o script solicitará que você o remova. Essa solicitação vem do Remove-GPO cmdlet usando o interruptor Confirm. Para confirmar a remoção desse único GPO, clique em Sim, caso contrário, clique em Sim para Todos para remover todos os GPOs não vinculados sem mais confirmação.

GPO deletion confirmation prompt

Após a conclusão do script e se pelo menos um GPO não vinculado for encontrado, você deverá ver na pasta C:\GPOBackup\<data> o conteúdo do GPO em uma pasta GUID juntamente com os relatórios HTML e o arquivo UnlinkedGPOs.txt.

Displaying Backup Folder

4. Agora, abra um dos relatórios HTML do GPO com um navegador da web. Você pode ver abaixo que o relatório contém todas as configurações definidas nesse GPO. No exemplo abaixo, o GPO UnlinkedGPO1 contém configurações para a política de execução do PowerShell.

GPO HTML report

5. Finalmente, abra o arquivo UnlinkedGPOs.txt. Você verá abaixo que ele contém a mesma saída que você recebeu do cmdlet Get-GPO.

UnlinkedGPOs.txt GPO listing

Conclusão

Agora você deve saber como encontrar todos esses GPOs não vinculados em seu ambiente AD usando o GPMC e o PowerShell.

Qual método você prefere? Consegue pensar em uma maneira de melhorar o script do PowerShell abordado?

Source:
https://adamtheautomator.com/unlinked-gpo/