Cómo encontrar (y eliminar) GPOS no vinculados en Active Directory
A medida que una organización crece, también crece su entorno de Active Directory (AD) y su infraestructura de Política de grupo (GP). Los objetos de política de grupo (GPO) pronto pueden salirse de control y, antes de que te des cuenta, tendrás docenas de GPO desvinculados que saturan tu entorno. Cambiemos eso.
En este tutorial, aprenderá cómo descubrir todos esos GPO desvinculados tanto con la Consola de administración de políticas de grupo (GPMC) como con PowerShell.
¡Pongámonos manos a la obra!
Requisitos previos
Este artículo será un tutorial con ejemplos prácticos. Si desea seguirnos, asegúrese de tener:
- Un dominio de directorio activo. Este artículo utilizará un dominio llamado HomeLab.Local.
- Una computadora con Windows unida al dominio AD. Este tutorial utilizará Windows 10.
- La computadora con Windows tiene instalado el paquete de herramientas de administración remota del servidor (RSAT).
¿De dónde proceden los GPO desvinculados?
Cuando crea un GPO y define todas las configuraciones que desea aplicar a las computadoras cliente, ese GPO en realidad no hace nada. Para afectar realmente a los equipos cliente, el GPO debe estar vinculado a una unidad organizativa (OU) de AD.
A medida que pasa el tiempo y más administradores crean GPO, olvídese de vincularlos, desvincularlos de las unidades organizativas, intente eliminarlos pero nunca lo haga, los GPO que simplemente se quedan sin hacer nada pueden proliferar. Especialmente en organizaciones grandes, los GPO no vinculados pueden llegar a ser cientos si no se mantienen adecuadamente.
Encontrar GPO no vinculados en GPMC
Puede encontrar GPO no vinculados de dos maneras: a través de GPMC o mediante PowerShell. Si solo tiene un puñado de GPO desvinculados, puede tener sentido utilizar GPMC en lugar de crear un script de PowerShell.
Para buscar GPO desvinculados a través de GPMC:
1. Abra GPMC yendo al menú de inicio y escribiendo "administración de políticas de grupo". Cuando aparezca el programa GPMC, ábrelo.
2. En GPMC, vaya a Bosque:
3. Haga clic en el menú desplegable Buscar elemento y seleccione los enlaces GPO. Este elemento de búsqueda buscará GPO que estén vinculados a una unidad organizativa. Cambie el menú desplegable Condición para que sea Existir en y el dominio para que sea su dominio.
En la siguiente captura de pantalla, la combinación de estas configuraciones buscará todos los GPO vinculados a al menos una unidad organizativa en el dominio homelab.local.
Cuando haya terminado, haga clic en Agregar para agregar los criterios. Aparecerá en la sección Todos los criterios de búsqueda.
4. Ahora, haga clic en el botón Buscar para encontrar todos los GPO que coincidan con los criterios de búsqueda.
5. Como se muestra en la siguiente captura de pantalla, en los resultados de búsqueda solo se muestran los GPO vinculados.
6. Para encontrar los GPO no vinculados, ahora compare manualmente todos los GPO con los GPO vinculados como se muestra a continuación. En la captura de pantalla siguiente, solo están vinculados tres GPO. Al mirar debajo del nodo Objetos de política de grupo, puede ver que dos de los GPO no aparecen (UnlinkedGPO1 y UnlinkedGPO2). Eso significa que no están vinculados.
Esta tarea llevará mucho tiempo y verás cómo realizarla a través de PowerShell en la siguiente sección.
Los GPO vinculados tendrán un vínculo cuando se asignen a un objeto AD como OU, como se muestra a continuación. Si solo tiene unos pocos GPO, puede buscar los GPO que tengan un vínculo y los que no lo tengan. Los GPO que no tienen un vínculo son GPO desvinculados.
Encontrar GPO no vinculados con PowerShell
La búsqueda de GPO en GPMC puede funcionar para unos pocos GPO, pero tendrá dificultades si tiene cientos o miles de GPO que administran miles de puntos finales. En ese caso, es hora de automatizar este proceso y crear una útil herramienta PowerShell.
Suponiendo que estás en tu PC Windows unida a un dominio local con RSAT instalado:
1. Abra una consola de Windows PowerShell.
2. Importe el módulo GroupPolicy. El módulo GroupPolicy viene con RSAT y ya debería estar instalado en su sistema. Este módulo contiene todos los comandos necesarios para trabajar con GPO en PowerShell.
Import-Module GroupPolicy3. Ejecute el cmdlet de PowerShell Get-GPO utilizando el parámetro All. Este cmdlet consulta AD y devuelve todos los GPO encontrados.
Get-GPO -All4. Ahora que puede consultar todos los GPO en el dominio, debe determinar cuáles están desvinculados. Para hacerlo, ejecute el cmdlet Get-GPOReport. Este cmdlet le permite proporcionar un nombre y un tipo de resultado a devolver.
Get-GPOReport -Name SomeGPO -ReportType XMLCopie y pegue manualmente uno de los nombres de GPO que se encuentran en el paso anterior y ejecute este comando. Verá que el cmdlet devuelve un informe XML de todas las configuraciones que tienen los GPO. En particular, observe 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 unidad organizativa a la que está vinculado.
El cmdlet
Get-GPOReportsolo 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 sabe cómo encontrar todos los GPO con Get-GPO y el cmdlet para descubrir a qué están vinculados (Get-GPOReport), combínelos copiándolos. y pegando el comando de PowerShell a continuación en su consola.
El siguiente comando consulta todos los GPO en el dominio (Get-GPO) y luego genera un informe XML para cada uno de ellos (Get-GPOReport), permitiendo solo aquellos que no No tiene una cadena en el informe (Select-String) para devolver.
Get-GPO -All | Where-Object {
$_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>"
}En el entorno del tutorial, puede ver en el siguiente ejemplo que UnlinkedGPO1 y UnlinkedGPO2 no están vinculados a ninguna unidad organizativa.
Creación de una herramienta PowerShell de GPO no vinculada
Ahora reunamos todo lo que ha aprendido y creemos un script de PowerShell que pueda usar en el mundo real.
1. Abra su editor de código favorito y copie/pegue el siguiente script de PowerShell en él. Guarde el script como Remove-UnlinkedGPO.ps1. Este guión:
- Crea una carpeta con la fecha actual para almacenar informes de GPO no vinculados.
- Encuentra todos los GPO en AD que están desvinculados.
- Crea un informe HTML para cada GPO desvinculado y lo guarda en el disco.
- Crea y agrega a un archivo de texto una lista de todos los GPO no vinculados.
- Elimina cada GPO desvinculado con un paso de confirmación mediante el cmdlet
Remove-GPO.
También puedes descargar el script Remove-UnlinkedGPO.ps1 a través de GitHub.
Import-Module GroupPolicy
$Date = Get-Date -Format dd_MM_yyyy
$BackupDir = "c:\GPOBackup\$Date"
## Creates a directory to store the GPO reports
if (-Not(Test-Path -Path $BackupDir)) {
New-Item -ItemType Directory $BackupDir -Force
}
# Get all GPOs with the gpo report type as XML and also look for the section in the xml report.
# Consider only the GPOs that doesnt have section.
Get-GPO -All | Where-Object { $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>" } | ForEach-Object {
# Backup the GPO, HTML report and saving the GPO details to text file are optional.
Backup-GPO -Name $_.DisplayName -Path $BackupDir
# Run the report and save as an HTML report to disk
Get-GPOReport -Name $_.DisplayName -ReportType Html -Path "$BackupDir\$($_.DisplayName).html"
# Create and append to a text file called UnlinkedGPOs.txt in the backup folder that
# contains each GPO object that Get-GPO returns
$_ | Select-Object * | Out-File "$BackupDir\UnLinkedGPOs.txt" -Append
# Remove the GPO but first prompt before removing
$_.Displayname | Remove-GPO -Confirm
}2. Ejecute el script Remove-UnlinkedGPO.ps1.
3. Si se encuentra un GPO no vinculado, el script le pedirá que lo elimine. Este mensaje proviene del cmdlet Remove-GPO mediante el interruptor Confirm. Para confirmar la eliminación de ese único GPO, haga clic en Sí; de lo contrario, haga clic en Sí a todos para eliminar todos los GPO desvinculados sin más confirmación.
Una vez que se completa el script y encuentra al menos un GPO no vinculado, debería ver en la carpeta C:\GPOBackup\
4. Ahora, abra uno de los informes HTML de GPO con un navegador web. Puede ver a continuación que el informe contiene todas las configuraciones definidas en ese GPO. En el siguiente ejemplo, el GPO UnlinkedGPO1 contiene configuraciones para la política de ejecución de PowerShell.
5. Finalmente, abra el archivo UnlinkedGPOs.txt. Verá a continuación que contiene el mismo resultado que recibió del cmdlet Get-GPO.
Conclusión
Ahora debería saber cómo encontrar todos esos GPO desvinculados en su entorno AD utilizando GPMC y PowerShell.
¿Qué camino prefieres? ¿Se te ocurre alguna manera de mejorar el script de PowerShell cubierto?












