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

À medida que uma organização cresce, também cresce o seu ambiente de Active Directory (AD) e infraestrutura de Políticas de Grupo (GP). Os Objetos de Política de Grupo (GPOs) podem logo sair de controle e, antes que você perceba, você tem dezenas de GPOs desvinculados que estão poluindo o seu ambiente. Vamos mudar isso.

Neste tutorial, você aprenderá como descobrir todos esses GPOs desvinculados, tanto com o Console de Gerenciamento de Política de Grupo (GPMC) quanto com o PowerShell.

Vamos começar!

Pré-requisitos

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

  • Um domínio de Active Directory. Este artigo usará um domínio chamado HomeLab.Local.
  • A Windows computer joined to the AD domain. This tutorial will use Windows 10.
  • O computador Windows tem o pacote de Ferramentas de Administração de Servidor Remoto (RSAT) instalado.

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 realmente afetar 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-se de vinculá-las, desvinculam as GPOs das OUs, pretendem removê-las mas nunca o fazem, as GPOs ficam apenas ocupando espaço sem fazer nada. Especialmente em organizações grandes, as GPOs não vinculadas podem se multiplicar em centenas se não forem mantidas adequadamente.

Localizando GPOs não Vinculadas no GPMC

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

Para encontrar GPOs não vinculadas pelo 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: <seu nome de floresta —> Domínios —> <seu nome de domínio>, clique com o botão direito no nome de 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 caixa suspensa Item de Pesquisa e selecione os Links GPO. Este item de pesquisa irá procurar por GPOs que estão vinculadas a uma OU. Altere a caixa suspensa Condição para ser Existir em e o domínio para ser o seu domínio.

Na captura de tela abaixo, a combinação dessas configurações procurará por todas as GPOs vinculadas 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 vinculadas são mostradas nos resultados da pesquisa.

Search results for linked GPOs

6. Para encontrar as GPOs não vinculadas, agora compare manualmente todas as GPOs com as GPOs vinculadas, como mostrado abaixo. Na captura de tela abaixo, apenas três GPOs estão vinculadas. Olhando sob o nó Objetos de Diretiva de Grupo, você pode ver que duas das GPOs não aparecem (UnlinkedGPO1 e UnlinkedGPO2). Isso significa que elas não estão vinculadas.

Esta tarefa será demorada e é por isso que você aprenderá como executá-la via PowerShell na próxima seção.

Comparing search results with all the Group Policy Objects

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

Displaying linked GPO

Encontrando GPOs não Vinculadas com PowerShell

Fazendo uma varredura nos GPOs no GPMC pode funcionar para alguns GPOs, mas você vai enfrentar dificuldades se tiver centenas ou milhares de GPOs gerenciando milhares de endpoints. Nesse caso, é hora de automatizar esse processo e criar uma ferramenta útil do PowerShell.

Supondo que você esteja em seu PC Windows local associado ao domínio com o 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 deles não estão vinculados. Para fazer isso, execute o cmdlet Get-GPOReport. Este cmdlet permite fornecer um nome e um tipo de saída para retornar.

Get-GPOReport -Name SomeGPO -ReportType XML

Copie e cole manualmente um dos nomes dos GPOs 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, conforme mostrado abaixo. Esta seção contém o nó XML SOMPath que representa o caminho para a Unidade Organizacional (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 do AD.

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

O comando abaixo consulta todos os GPOs no domínio (Get-GPO) e então gera um relatório XML para cada um deles (Get-GPOReport), permitindo apenas que aqueles que não têm uma cadeia <LinksTo> no relatório (Select-String) sejam 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 juntar tudo que você aprendeu 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 pelo GitHub.

Import-Module GroupPolicy
 $Date = Get-Date -Format dd_MM_yyyy
 $BackupDir = "c:\GPOBackup\$Date"
## Cria um diretório para armazenar os relatórios da GPO
 if (-Not(Test-Path -Path $BackupDir))  {
   New-Item -ItemType Directory $BackupDir -Force
 }
# Obtenha todas as GPOs com o tipo de relatório da GPO como XML e procure também pela 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
    # Execute o relatório e salve como um relatório HTML no disco
   Get-GPOReport -Name $_.DisplayName -ReportType Html -Path "$BackupDir\$($_.DisplayName).html"
   # Crie e anexe a um arquivo de texto chamado UnlinkedGPOs.txt na pasta de backup que
   # contém cada objeto de GPO que o Get-GPO retorna
   $_ | Select-Object * | Out-File "$BackupDir\UnLinkedGPOs.txt" -Append
   # Remova a GPO, mas primeiro peça 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. Este prompt vem do Remove-GPO cmdlet usando o switch 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ções.

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\<date> os conteúdos do GPO como 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. Por fim, 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 PowerShell.

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

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