Descubre con nosotros los comandos de Powershell para desplegar y gestionar GPO, y poder crear tus propios GPO script para el despliegue de políticas de grupo.
Desde hace algunos años, existe una clara tendencia al uso de PowerShell para la administración del sistema operativo o los aplicativos de servidor, así como para el despliegue de servicios e infraestructuras. Dicha tendencia se promueve tanto por parte de Microsoft como por parte de muchos administradores, alejándose cada vez más del uso de la consola gráfica de toda la vida.
Los que hayan probado a administrar servicios mediante PowerShell, estarán de acuerdo, que si bien, es más complicado administrarlos de esta manera, dado que la curva de aprendizaje es mucho más pronunciada, la potencia y flexibilidad de trabajar con este modelo basado en comandos es mucho mayor.
Por esta razón y tras dedicar varios artículos a ver cómo desplegar distintas GPO mediante entorno gráfico, creemos conveniente repasar la forma en la que podríamos desplegar GPO mediante el uso de comandos de PowerShell, aunando los comandos descritos en un fichero y creando de esta manera nuestro propio GPO script para el despliegue de políticas.
NOTA: Debemos diferenciar entre desplegar GPO que ejecute código de PowerShell y desplegar GPO mediante PowerShell. En el primer caso, creamos una GPO que cuando se ejecuta lanza la ejecución de un archivo que contiene un script de PowerShell. En el segundo caso, se usan comandos de PowerShell para lanzar configurar o GPO.
A continuación, vamos a repasar lo que necesitamos y lo que podemos hacer con PowerShell en lo que respecta a Políticas de Grupo (GPO), aunque no podremos entrar en todos los comandos que podemos usar, si que vamos a tratar los más importantes, y los necesarios para desplegar GPO, configurarlas, actualizarlas, generar informes y eliminarlas cuando ya no sean necesarias.
A la hora de trabajar con PowerShell, debemos saber, que existen innumerables comandos y módulos de librerías, y que debemos importar algunos módulos para poder trabajar con algunos servicios o productos, y que, además, estas tienen su propia documentación que deberemos conocer.
Lo primero que debemos saber, es que, como requisito, en el caso del módulo dedicado a Active Directory es “ActiveDirectory” y que se puede instalar mediante el siguiente comando:
Import-Module ActiveDirectory
Este módulo, arrastra todo lo que necesitamos para la gestión de las Políticas de Grupo (GPO), pero si no lo hiciera, podríamos lanzar el siguiente comando para importarlo:
Import-Module GroupPolicy
Para tener una idea de lo que podemos hacer con PowerShell en lo que respecta a Directivas, podemos lanzar un comando que permite listar todos los comandos que contiene el módulo de GPO:
Get-Command –Module GroupPolicy
Aun sin saber nada de PowerShell, seremos capaces de intuir que se puede hacer con estos comandos, pero vamos a hacer un breve repaso de lo que podremos hacer:
Para obtener información detallada del módulo, se puede acceder a la web de Microsoft Learn.
Vamos a ver cómo podríamos realizar algunas de las acciones descritas.
Podemos ejecutar una consulta para mostrar todas las GPO que tenemos em el dominio, para ello se debe usar el comando “Get-GPO”, pasándole como parámetro el nombre del dominio. El comando resultante es el siguiente:
Get-GPO -Domain <dominio> -All
Donde:
Un ejemplo de esto podría ser el siguiente:
Get-GPO -Domain pruebasnacho.int -All
Para crear una nueva GPO con PowerShell, trabajamos tal como haríamos con una GPO mediante consola gráfica. Lo primero que se debe hacer es crear una nueva GPO en blanco, por lo que se usará el comando:
New-GPO -Name <Nombre> -Comment <Comentario>
Donde:
Un ejemplo de GPO podría ser:
New-GPO -Name PruebaGPO1 -Comment «Comentario de mi GPO hecha con PowerShell»
El siguiente punto para configurar, usualmente suele ser el vincular (link) la GPO a una Unidad Organizativa (OU) que será la raíz a partir de la que se ejecutará la política.
En este caso, se hace mediante el comando “New-GPLink” al que se le dirige la GPO que se ha creado. El comando ejecutado puede ser similar al siguiente:
Get-GPO <Nombre> | New-GPLink -Target «ou=zaragoza, dc=pruebasnacho, dc=int»
Donde:
Un ejemplo de esto, vinculándose a la estructura de la OU de la Delegación de Zaragoza dentro del Dominio PruebasNacho.int:
Get-GPO PruebaGPO | New-GPLink -Target «ou=zaragoza,ou=delegaciones,dc=pruebasnacho,dc=int»
Cuando se quiere desvincular (unlink) la GPO a una Unidad Organizativa (OU), se debe utilizar el comando “Remove-GPLink” con un formato como el que se muestra a continuación:
Remove-GPLink -Name <Nombre> -Target <Path_OU_Dominio>
Donde:
En el siguiente ejemplo podemos ver como se desvincula de la estructura de la OU de la Delegación de Zaragoza dentro del Dominio PruebasNacho.int:
Remove-GPLink -Name PruebaGPO -Target «ou=zaragoza,ou=delegaciones,dc=pruebasnacho,dc=int»
Otra opción es deshabilitar una GPO de manera temporal, sin desvincularla de la OU a la que está vinculada. Esta práctica suele realizarse para pruebas o mientras se hacen cambios, por lo que decimos que es temporal, pero se puede usar para deshabilitarla de manera indefinida, aunque en caso de ser indefinido, sería mejor desvincularla y eliminarla para evitar acumular “basura”.
Para deshabilitar el link de una GPO a una OU se puede usar el siguiente comando:
Set-GPLink -Name <Nombre> -Target <Path_OU_Dominio> -linkenabled no
Donde:
Un ejemplo de esto, sobre la OU de la Delegación de Zaragoza dentro del Dominio PruebasNacho.int:
Set-GPLink -Name PruebaGPO1 -Target «ou=zaragoza, dc=pruebasnacho, dc=int» -linkenabled no
Cuando se quiera eliminar una GPO por estar causando problemas, no ser útil o simplemente porque queremos empezar la creación desde cero, se puede usar el comando “Remove-GPO” para eliminarla.
La sintaxis del comando es bastante simple:
Remove-GPO -Name <Nombre> -Domain <dominio>
Donde:
Un ejemplo de esto podría ser:
Remove-GPO -Name PruebaGPO -Domain “PruebasNacho.int”
También existe la posibilidad de sustituir “Name” y trabajar en base al “Guid” que es una cadena alfanumérica que identifica de manera única la GPO en el dominio. Quedando el comando de la siguiente manera:
Remove-GPO -Guid 0b14-50c-46dd-3e45-afa0-8b4d-331c-12bc -Domain “PruebasNacho.int”
Para empezar, debemos saber que no es lo mismo hacer una copia de seguridad de una sola GPO que hacer la copia de seguridad de todas las GPO existentes.
Para hacer una copia de seguridad de todas las Políticas existentes en un Controlador de Dominio, se debe lanzar el siguiente comando:
Backup-GPO -All -Path <Ruta_Destino>
Donde:
Un ejemplo podría ser:
Backup-GPO -All -Path F:\Backups\ADDS\GPO\
En caso de querer hacer la copia de seguridad de una sola GPO, se deberá hacer aludiendo el nombre que se le ha dado a la GPO:
Backup-GPO -Name <Nombre> -Path <Ruta_Destino>
Donde:
Un ejemplo de esto podría ser:
Backup-GPO -Name PruebaGPO -Path F:\Backups\ADDS\GPO\
Existe la posibilidad de asignar comentarios que ayudarán a saber fecha de la copia de seguridad, permitiendo ordenarlas debidamente, o tener claro cual se debe recuperar.
Un ejemplo con etiqueta sería:
Backup-GPO -Name PruebaGPO -Path F:\Backups\ADDS\GPO\ – Comment “Backup PruebaGPO 20221107”
Este apartado, puede ser especialmente interesante convertirlo en un GPO Script para programar copias de seguridad de las políticas y poder almacenarlas en un repositorio seguro para evitar posibles desastres.
El caso de la recuperación es significativamente similar al del backup, cosa que favorece la operativa y sobre todo el acordarse de cómo se debe proceder.
En caso de que se quiera recuperar una copia de una GPO guardada, se deberá ejecutar el siguiente comando:
Restore-GPO -Name <Nombre> -Path <Ruta_Destino> – Comment <Comentario>
Donde:
Un ejemplo de esto puede ser:
Restore-GPO -Name PruebaGPO -Path F:\Backups\ADDS\GPO\ – Comment “Backup PruebaGPO 20221107”
Como todos los que hayan trabajado con políticas alguna vez sabrán, las GPO no siempre funcionan a la primera, o, mejor dicho, no siempre se cargan o actualizan los cambios a la primera. En muchas ocasiones, se tiene que forzar la ejecución de las políticas de manera manual. Para esto, se tiene el comando clásico de CMD:
Gpupdate /force
En el caso de PowerShell, también tenemos un comando que nos permite actualizar las políticas, este es “Invoke-GPUpdate”, que usualmente se opera lanzándolo desde el ordenador en el que quiere que se actualicen las GPO:
Invoke-GPUpdate
Si se quiere refrescar las políticas en un equipo remoto, se puede lanzar el siguiente comando:
Invoke-GPUpdate -Computer <equipo>
Donde:
Un ejemplo sería:
Invoke-GPUpdate -Computer “pruebasnacho\laptop1”
Usualmente se ejecuta lanzándolo sobre todas las GPO, pero podríamos decidir que se actualicen solo las relativas a usuarios o solo las relativas a equipos, en ese caso, para lanzarlo solo sobre usuarios se añadiría el modificador:
-Target «User»
Y en caso de lanzarlo sobre equipos se añadiría el modificador:
-Target «Computer»
Por otro lado, es posible lanzar la actualización de GPO sobre una Unidad Organizativa completa mediante un pequeño “one line script” como el siguiente:
Get-ADComputer –filter * -Searchbase <Path_OU> | foreach{ Invoke-GPUpdate –computer $_.name -force}
Donde:
ejecutándolo sobre la OU de la delegación de Zaragoza, quedaría de la siguiente manera:
Get-ADComputer –filter * -Searchbase «ou=zaragoza,ou=delegaciones,dc=pruebasnacho,dc=int» | foreach{ Invoke-GPUpdate –computer $_.name -force}
Si se quisiera sobre todo el dominio, se debería ejecutar sobre el Searchbase de la raíz del dominio.
Con esto, se puede crear un GPO Script, que nos permita lanzar actualizaciones de las GPO sobre los equipos que sea necesario, o incluso sobre todo el dominio.
Cuando trabajamos con políticas, muchas veces tenemos algún tipo de problema, o la necesidad de auditar lo que estamos haciendo para ver donde hay fallos o como está configurado todo.
Para poder hacer este tipo de informes disponemos del cmdlet “Get-GPOReport” que genera un informe cuya salida puede ser configurada en formato HTML o XML y que describe las propiedades y la configuración de políticas para una GPO específica o para todas las GPO del dominio.
Este informe contiene:
Para lanzar un informe de este tipo se puede usar el siguiente comando:
Get-GPOReport -name <Nombre> -ReportType <HTML/XML> -Path <Ruta_Salida>
Donde:
Un ejemplo de ejecución puede ser el siguiente:
Get-GPOReport -name PruebaGPO -ReportType HTML -Path “F:\Informes\ADDS\GPO\report.html”
En caso de querer generar el informe de todas las políticas, se debe sustituir el parámetro “-name <Nombre>” por “-all”.
Las Directivas de Grupo o GPO, son una de las herramientas principales para poder mantener nuestra infraestructura empresarial bien gestionada, de una manera rápida y eficiente, especialmente, cuando esta cuente con gran número de host.
A través de ellas se podrá desplegar software de manera automática o provisionar configuraciones estándar para conjuntos de host que podremos definir en base a su ubicación dentro de la estructura de AD DS, o lo que es lo mismo, en función de la Unidad Organizativa (OU) a la que pertenezca.
Como todo en el mundo de Microsoft, las GPO pueden gestionarse mediante comandos de PowerShell y conociendo un conjunto relativamente pequeño de cmdlets se puede realizar la mayoría de las tareas relacionadas con ellas. De hecho, con lo contenido en este artículo, puedes aprender a desplegar tus propios GPO Script para automatizar el despliegue de políticas en tu AD DS Server.
Esperamos que este artículo haya sido interesante, pero si tienes dudas, te recomendamos visitar el artículo “Qué son y para qué sirven las GPO” que da una pequeña noción sobre que son y como se ejecutan las GPO.
Para completar esta información, recomendamos que visites los siguientes enlaces, donde podrás ver información adicional y algunos ejemplos de operativas que se pueden realizar en base a directivas de grupo, como, por ejemplo:
¡Gracias por acompañarnos!