Cómo encontrar (y eliminar) GPOS no vinculados en Active Directory

A medida que una organización crece, también lo hace su entorno de Active Directory (AD) y su infraestructura de Directiva de Grupo (GP). Los Objetos de Directiva de Grupo (GPO) pueden volverse inmanejables rápidamente y, antes de que te des cuenta, te encontrarás con docenas de GPO no vinculados que desordenan tu entorno. Vamos a cambiar eso.

En este tutorial, aprenderás cómo descubrir todos esos GPO no vinculados tanto con la Consola de Administración de Directivas de Grupo (GPMC) como con PowerShell.

¡Empecemos!

Requisitos previos

Este artículo será un tutorial con ejemplos prácticos. Si deseas seguirlo, asegúrate de tener:

¿De dónde provienen los GPO no vinculados?

Cuando creas una GPO y defines todas las configuraciones que pretendes aplicar a las computadoras cliente, esa GPO en realidad no está haciendo nada. Para afectar realmente a las computadoras cliente, la GPO debe estar vinculada a una unidad organizativa (OU) en el Directorio Activo (AD).

Con el tiempo, a medida que más administradores crean GPO, olvidan vincularlas, desvinculan GPO de OUs, tienen la intención de eliminarlas pero nunca lo hacen, las GPO simplemente quedan allí sin hacer nada y pueden proliferar. Especialmente en organizaciones grandes, las GPO no vinculadas pueden llegar a ser cientos si no se mantienen adecuadamente.

Buscar GPO no vinculadas en el GPMC

Puedes encontrar GPO no vinculadas de dos maneras: a través del GPMC o mediante PowerShell. Si solo tienes un puñado de GPO no vinculadas, puede tener sentido usar el GPMC en lugar de crear un script de PowerShell.

Para encontrar GPO no vinculadas a través del GPMC:

1. Abre el GPMC yendo al menú de inicio y escribiendo “gestión de directivas de grupo”. Cuando aparezca el programa GPMC, ábrelo.

2. En el GPMC, ve a Bosque: <tu nombre de bosque —> Dominios —> <tu nombre de dominio>, haz clic derecho en el nombre de dominio y selecciona Buscar. Esta acción abrirá la ventana de diálogo Buscar objetos de directiva de grupo.

Search option in GPMC console

3. Haz clic en el menú desplegable Buscar elemento y selecciona los enlaces GPO. Este elemento de búsqueda buscará los GPO que están vinculados a una OU. Cambia el menú desplegable Condición a Existente en y el dominio a tu dominio.

En la captura de pantalla siguiente, la combinación de estos ajustes buscará todos los GPO vinculados a al menos una OU en el dominio homelab.local.

Cuando hayas terminado, haz clic en Agregar para añadir el criterio. Aparecerá bajo la sección Todos los criterios de búsqueda.

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

4. Ahora, haz clic en el botón Buscar para encontrar todos los GPO que coincidan con los criterios de búsqueda.

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

5. Como se muestra en la captura de pantalla siguiente, solo se muestran los GPO vinculados en los resultados de la búsqueda.

Search results for linked GPOs

6. Para encontrar los GPO no vinculados, compara manualmente todos los GPO con los GPO vinculados como se muestra a continuación. En la captura de pantalla siguiente, solo tres GPO están vinculados. Al mirar bajo el nodo Objetos de directiva de grupo, puedes ver que dos de los GPO no aparecen (GPO no vinculado 1 y GPO no vinculado 2). Eso significa que no están vinculados.

Esta tarea llevará tiempo y por eso verás cómo realizar esta tarea mediante PowerShell en la siguiente sección.

Comparing search results with all the Group Policy Objects

Los GPO vinculados tendrán un vínculo cuando estén asignados a un objeto AD como OU, como se muestra a continuación. Si solo tienes unos pocos GPO, puedes buscar los GPO que tienen un vínculo y los que no tienen un vínculo. Los GPO que no tienen un vínculo son los GPO no vinculados.

Displaying linked GPO

Encontrar GPO no vinculados con PowerShell

Revisar los GPO en el GPMC puede funcionar para algunos GPO, pero tendrás dificultades si tienes cientos o miles de GPO gestionando miles de puntos finales. En ese caso, es hora de automatizar este proceso y construir una práctica herramienta de PowerShell.

Suponiendo que estás en tu PC Windows local unido al dominio con RSAT instalado:

1. Abre una consola de Windows PowerShell.

2. Importa el módulo GroupPolicy. El módulo GroupPolicy viene con RSAT y debería estar instalado en tu sistema. Este módulo contiene todos los comandos necesarios para trabajar con GPOs en PowerShell.

Import-Module GroupPolicy

3. Ejecuta el cmdlet de PowerShell Get-GPO usando el parámetro All. Este cmdlet consulta AD y devuelve todos los GPO encontrados.

Get-GPO -All
Get-Gpo cmdlet output

4. Ahora que puedes consultar todos los GPOs en el dominio, debes averiguar cuáles están desvinculados. Para hacerlo, ejecuta el cmdlet Get-GPOReport. Este cmdlet te permite proporcionar un nombre y un tipo de salida para devolver.

Get-GPOReport -Name SomeGPO -ReportType XML

Copia y pega manualmente uno de los nombres de GPO encontrados en el paso anterior y ejecuta este comando. Verás que el cmdlet devuelve un informe XML de todos los ajustes que tiene el GPO. En particular, observa la sección llamada LinksTo, como se muestra a continuación. Esta sección contiene el nodo XML SOMPath que representa la ruta a la OU a la que está vinculado.

Sample output containing LinksTo section

El cmdlet Get-GPOReport solo puede obtener un informe para un único GPO a la vez. Este cmdlet solo incluye resultados de búsqueda de dominios y no de sitios de AD.

5. Ahora que sabes cómo encontrar todos los GPO con Get-GPO y el cmdlet para descubrir a qué están vinculados (Get-GPOReport), combínalos copiando y pegando el comando de PowerShell a continuación en tu consola.

El comando a continuación consulta todos los GPO en el dominio (Get-GPO) y luego genera un informe XML para cada uno de ellos (Get-GPOReport), solo permitiendo que se devuelvan aquellos que no tienen una cadena <LinksTo> en el informe (Select-String).

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

En el entorno del tutorial, puedes ver en el siguiente ejemplo que UnlinkedGPO1 y UnlinkedGPO2 no están vinculados a ningún OU.

Listing out unlinked GPO in the domain

Creando una herramienta de PowerShell para GPOs no vinculados

Ahora pongamos todo lo que has aprendido juntos y construyamos un script de PowerShell que podrías usar en el mundo real.

1. Abre tu editor de código favorito y copia/pega el siguiente script de PowerShell en él. Guarda el script como Remove-UnlinkedGPO.ps1. Este script:

  • Crea una carpeta con la fecha actual para almacenar informes de GPO no vinculados.
  • Encuentra todos los GPOs en AD que no están vinculados.
  • Crea un informe HTML para cada GPO no vinculado y lo guarda en disco.
  • Crea y agrega a un archivo de texto una lista de todos los GPOs no vinculados.
  • Elimina cada GPO no vinculado con un paso de confirmación utilizando el cmdlet Remove-GPO.

También puedes descargar el script Remove-UnlinkedGPO.ps1 desde GitHub.

Import-Module GroupPolicy
 $Date = Get-Date -Format dd_MM_yyyy
 $BackupDir = "c:\GPOBackup\$Date"
## Crea un directorio para almacenar los informes de GPO
 if (-Not(Test-Path -Path $BackupDir))  {
   New-Item -ItemType Directory $BackupDir -Force
 }
# Obtiene todas las GPO con el tipo de informe gpo como XML y también busca la sección en el informe XML.
# Considera solo las GPO que no tienen la sección.
 Get-GPO -All | Where-Object { $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>" } | ForEach-Object {
   # La copia de seguridad de la GPO, el informe HTML y guardar los detalles de la GPO en un archivo de texto son opcionales.
   Backup-GPO -Name $_.DisplayName -Path $BackupDir
    # Ejecuta el informe y guárdalo como un informe HTML en el disco
   Get-GPOReport -Name $_.DisplayName -ReportType Html -Path "$BackupDir\$($_.DisplayName).html"
   # Crea y añade al archivo de texto llamado UnlinkedGPOs.txt en la carpeta de copia de seguridad que
   # contiene cada objeto GPO que devuelve Get-GPO
   $_ | Select-Object * | Out-File "$BackupDir\UnLinkedGPOs.txt" -Append
   # Elimina la GPO pero primero solicita confirmación antes de eliminar
   $_.Displayname | Remove-GPO -Confirm
 }

2. Ejecuta el script Remove-UnlinkedGPO.ps1.

3. Si se encuentra un GPO no vinculado, el script te pedirá que lo elimines. Esta solicitud proviene del cmdlet Remove-GPO utilizando el interruptor Confirm. Para confirmar la eliminación de ese único GPO, haz clic en ; de lo contrario, haz clic en Sí para Todos para eliminar todos los GPO no vinculados sin más confirmaciones.

GPO deletion confirmation prompt

Después de que el script esté completo y haya encontrado al menos un GPO no vinculado, deberías ver en la carpeta C:\GPOBackup\<fecha> el contenido del GPO como una carpeta GUID junto con los informes HTML y el archivo UnlinkedGPOs.txt.

Displaying Backup Folder

4. Ahora, abre uno de los informes HTML del GPO con un navegador web. Puedes ver que el informe contiene todas las configuraciones definidas en ese GPO. En el ejemplo a continuación, el GPO UnlinkedGPO1 contiene configuraciones para la directiva de ejecución de PowerShell.

GPO HTML report

5. Por último, abre el archivo UnlinkedGPOs.txt. Verás que contiene la misma salida que recibiste del cmdlet Get-GPO.

UnlinkedGPOs.txt GPO listing

Conclusión

Ahora deberías saber cómo encontrar todos esos GPO no vinculados en tu entorno de AD usando GPMC y PowerShell.

¿Qué método prefieres? ¿Puedes pensar en una forma de mejorar el script de PowerShell cubierto?

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