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.
Empezando a trabajar con PowerShell y GPO (GPO Script):
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.
Importación del módulo de PowerShell para GPO:
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
Operaciones sobre GPO disponibles con PowerShell:
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:
- Consultas sobre las GPO.
- Crear, copiar y eliminar GPO.
- Vincular y desvincular GPO.
- Establecer permisos y herencias de GPO.
- Hacer backup y recuperación de GPO.
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.
Mostrar las GPO que tenemos en el dominio:
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:
- Domain <dominio>: Donde se debe sustituir la cadena <dominio> por el nombre de dominio con extensión (ejemplo: pruebasnacho.int)
Un ejemplo de esto podría ser el siguiente:
Get-GPO -Domain pruebasnacho.int -All
Crear una nueva GPO con PowerShell:
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:
- New-GPO: Es el comando de creación de una nueva GPO.
- -Name <Nombre>: Proporciona el nombre que queremos darle a la GPO. La cadena <Nombre> debe sustituirse por el nombre.
- -Comment <Comentario>: Proporciona un comentario anexado a la GPO para poder darle una descripción. <Comentario> debe sustituirse por la descripción que quiera darse.
Un ejemplo de GPO podría ser:
New-GPO -Name PruebaGPO1 -Comment «Comentario de mi GPO hecha con PowerShell»
Vincular una GPO a una OU 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:
- Get-GPO <Nombre>: Proporciona el nombre de la GPO que queremos vincular. La cadena <Nombre> debe sustituirse por el nombre.
- Target <Path_OU_Dominio>: La ruta de la estructura de la Unidad organizativa a la que se vinculara la GPO. La cadena <Path_OU_Dominio> debe sustituirse por la ruta de la OU con un formato como el del ejemplo situado bajo estas palabras.
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»
Desvincular una GPO a una OU con PowerShell:
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:
- Name <Nombre>: Proporciona el nombre de la GPO que queremos desvincular. La cadena <Nombre> debe sustituirse por el nombre.
- Target <Path_OU_Dominio>: La ruta de la estructura de la Unidad organizativa a la que se vinculara la GPO. La cadena <Path_OU_Dominio> debe sustituirse por la ruta de la OU con un formato como el del ejemplo situado bajo estas palabras.
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»
Deshabilitar una GPO sin desvincularla de la OU mediante PowerShell:
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:
- Name <Nombre>: Proporciona el nombre de la GPO que queremos deshabilitar. La cadena <Nombre> debe sustituirse por el nombre.
- Target <Path_OU_Dominio>: La ruta de la estructura de la Unidad organizativa a la que está vinculada la GPO. La cadena <Path_OU_Dominio> debe sustituirse por la ruta de la OU con un formato como el del ejemplo situado bajo estas palabras.
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
Eliminar una GPO con PowerShell:
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:
- Name <Nombre>: Proporciona el nombre de la GPO que queremos eliminar. La cadena <Nombre> debe sustituirse por el nombre.
- Domain <dominio>: Es un parámetro no obligatorio. Se debe sustituir la cadena <dominio> por el nombre de dominio con extensión (ejemplo: pruebasnacho.int)
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”
Backup de las GPO con PowerShell (Perfecto para crear un GPO Script):
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:
- Path <Ruta_Destino>: debe contener la ruta absoluta del destino del backup.
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:
- Name <Nombre>: Debe ser el nombre de la GPO de la que se quiere hacer la copia de seguridad.
- Path <Ruta_Destino>: debe contener la ruta absoluta del destino del backup.
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.
Recuperación de una GPO con PowerShell:
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:
- Name <Nombre>: Debe ser el nombre de la GPO de la que se quiere hacer la copia de seguridad.
- Path <Ruta_Destino>: Debe contener la ruta absoluta del destino del backup.
- Comment <Comentario>: Debe contener el comentario que se le dio al backup y que refiere a una GPO en concreto en un momento concreto.
Un ejemplo de esto puede ser:
Restore-GPO -Name PruebaGPO -Path F:\Backups\ADDS\GPO\ – Comment “Backup PruebaGPO 20221107”
Actualizar una GPO mediante PowerShell:
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:
- <equipo>: es el nombre del equipo sobre el que se quiere actualizar las políticas. Se representará de la siguiente manera “dominio\equipo” como por ejemplo “pruebasnacho\laptop1”.
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:
- Searchbase <Path_OU>: Es la ruta del dominio donde se encuentra al OU sobre la que se quiere ejecutar.
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.
Generar un reporte de la ejecución de una GPO con PowerShell (y GPO Script):
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:
- Detalles de la GPO.
- Sus vínculos.
- Los filtrados de seguridad.
- Filtrado WMI.
- La delegación.
- La configuración de usuarios y equipos.
Para lanzar un informe de este tipo se puede usar el siguiente comando:
Get-GPOReport -name <Nombre> -ReportType <HTML/XML> -Path <Ruta_Salida>
Donde:
- Name <Nombre>: Nombre de la GPO de la que se ejecuta el reporte.
- ReportType <HTML/XML>: Especificación del formato, siendo HTML o XML.
- Path <Ruta_Salida>: La ruta absoluta donde se guardará el informe generado, incluyendo nombre de fichero de destino. Por ejemplo “F:\Informes\ADDS\GPO\report.html”.
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”.
Conclusión y próximos pasos con PowerShell y el GPO Script:
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:
- Qué son y para qué sirven las GPO
- Como configurar una GPO para el mapeo de unidades compartidas
- Como configurar GPO para mapeo de impresoras
- Cómo desplegar un GPO Script con código de PowerShell
- Como configurar unidades personales mediante GPO script
- Como configurar tu firewall mediante GPO script
- Cómo ocultar el acceso a una unidad de disco dentro de tu servidor a través del editor de políticas locales
¡Gracias por acompañarnos!