Después de ver en al cybertruco previo en esta serie sobre la gestión de Active Directory con Powershell como podíamos gestionar tanto los usuarios como los ordenadores dentro de nuestra red, vamos a abordar ahora la gestión de los grupos y la membresía de estos objetos a los mismos.

gestionando active directory grupos

 

En Active Directory utilizamos los grupos para gestionar de manera unificada los permisos a diferentes recursos para conjuntos de usuarios y/o máquinas. Hablamos principalmente de grupos de seguridad y de listas de distribución en ambos casos estos grupos están aplicados a un determinado ámbito (scope) que pueden ser Universal, Global o Domain Local.

Ámbito de grupo

Antes de empezar con los ejemplos conviene que repasemos y tengamos claros estos conceptos, básicamente cada tipo de grupo por su ámbito (Universal, Global y Domain Local) se diferencian en los tres siguientes aspectos:

  • Que tipo de miembros puede incluir
  • Donde podemos asignarle permisos
  • A qué ámbito podríamos convertirlo

Universal

-Que tipo de miembros puede incluir?

  • Cuentas de cualquier dominio dentro del bosque en el cual resida el grupo Universal
  • Grupos Globales de cualquier dominio dentro del bosque en el cual resida el grupo Universal
  • Grupos Universales de cualquier dominio dentro del bosque en el cual resida el grupo Universal

-Donde podemos asignarle permisos?

  • En cualquier dominio o bosque

-Se puede convertir a..

  • Domain Local y Global (siempre que no tenga como miembro otro grupo Universal)

Global

-Que tipo de miembros puede incluir

  • Cuentas del mismo dominio que el grupo Global padre
  • Grupos Globales del mismo dominio que el grupo Global padre

-Donde podemos asignarle permisos

  • En cualquier dominio

-Se puede convertir a..

  • Universal (siempre que el grupo no sea miembro de otro grupo Global)

Domain Local

-Que tipo de miembros puede incluir

  • Cuentas de cualquier dominio
  • Grupos Globales de cualquier dominio
  • Grupos Universales de cualquier dominio
  • Grupos Domain Local pero solo del mismo dominio que el grupo Domain Local padre

-Donde podemos asignarle permisos

  • Unicamente dentro del propio dominio

-A qué ámbito podríamos convertirlo

  • Universal (siempre que no tenga como miembro otro grupo Domain Local)

Tenéis toda la información detallada en el siguiente link de Microsoft

Gestión de grupos con Active Directory

Vamos a ver cómo podemos agilizar en gran medida la gestión de nuestros grupos de seguridad a través de powershell. Como siempre y como con cualquier código que encontréis en Internet, probad los siguientes comandos en entornos de pruebas y adaptadlos a vuestro entorno antes de llevarlos a producción.

Crear grupos

Para crear un nuevo grupo de seguridad utilizaremos el cmdlet new-adgroup y para ellos necesitaremos indicarle tres parámetros que serán el propio nombre -name que queramos asignar al grupo, el -path de la OU y el ámbito con el parámetro -groupscope. En este caso utilizamos el domainlocal pero podemos especificar global o universal

new-adgroup -name "grupoprueba" -path "OU=grupos,DC=cyberseguridad,DC=net" -groupscope domainlocal

Ver información de un grupo

Para buscar un grupo o ver su información utilizaremos el cmdlet get-adgroup. Podemos ejecutarlo de manera directa para ver información relevante de nuestros grupos como podría ser el nombre, groupcategory (security o distribution), groupscope (Universal,Global o Domain Local) y objectcategory (DN)

Get-adgroup - filter * -properties * | select name,groupcategory,groupscope,objectcategory

Podemos también de manera sencilla, como hemos visto en otros ejemplos, buscar un grupo por su nombre utilizando el parámetro filter

Get-adgroup -filter {name -like “*grupoprueba*”}

O con una doble condición de filtrado

Get-adgroup -filter {name -like “*prueba*” -or name -eq “grupoprueba”}

Modificar información de un grupo

Para modificar la información de un grupo determinado actuaremos de la misma manera que respecto a los usuarios y ordenadores, seleccionaremos con el get-adgroup aquel o aquellos grupos sobre los cuales queramos realizar la modificación y la ejecutaremos con el cmdlet set-adgroup.

Por ejemplo con el siguiente comando añadiremos una descripción a un grupo

get-adgroup -filter {name -eq "grupoprueba" } | set-adgroup - description "test"

De la misma manera podemos aplicar cambios a diversos grupos en un mismo comando ya sea porque ampliemos nuestro filtro de búsqueda en get-adgroup o porque le pasemos los nombres de los mismos en una variable o desde un fichero a set-adgroup

$listagrupos = get-adgroup -filter {name -eq “*prueba*”}
foreach($grupo in $listagrupos) { set-adgroup -description $grupo.description “grupo de prueba”}

get-content C:\gruposparacambiar.txt | foreach { set-adgroup -identity $_ -description “grupo de prueba”}

Como estamos hablando repetidamente del scope de un grupo, vemos otro ejemplo en el cual cambiamos este valor a través del parámetro -groupscope

get-adgroup -filter {name -eq "grupoprueba" } | set-adgroup -groupscope domainlocal

De la misma manera podemos cambiar el tipo de grupo (security o distribution) de la siguiente manera con el parámetro -groupcategory

get-adgroup -filter {name -eq "grupoprueba" } | set-adgroup - groupcategory security

Ver miembros de un grupo

Después de ver cómo podemos crear y modificar grupos vamos a abordar ahora como podemos ver los miembros actuales de un grupo. Un grupo de seguridad puede contener usuarios, ordenadores, otros grupos o una combinación de los mismos y nos referiremos a ellos como miembros.Para esta tarea usaremos el cmdlet get-adgroupmember, en este caso solo tenemos que indicar a través del parámetro -identity el nombre del grupo en cuestión

get-adgroupmember -identity prueba

Esto nos saca un listado de los miembros de un grupo con una serie de propiedades preestablecidas a mostrar en pantalla (distinguishedname, name, objectclass, objectguid, samaccountname y sid). A partir de aquí podemos por ejemplo sacar el número de miembros de un grupo con

get-adgroupmember -identity prueba | measure-object

O sacar una tabla para visualizar los datos más claramente con los datos que queramos con por ejemplo en el siguiente ejemplo en que también mostramos el tipo de objeto del que se trata

get-adgroupmember -identity prueba | select name, objectclass

En caso que queramos datos extras dependiendo del tipo de objeto miembro podemos realizar un filtrado adicional como vemos a continuación para sacar información únicamente de los usuarios del grupo

get-adgroupmember -identity prueba | where-object {$_.objectclass -eq "user" } | foreach {get-aduser -identity $_} | select name, enabled, distinguishedname, emailaddress

Si queremos ver los miembros de grupos anidados dentro de otro podemos utilizar el parámetro -recursive como vemos a continuación

get-adgroupmember -identity prueba -recursive | select name, objectclass

Añadir miembros a un grupo

Para añadir miembros usaremos el cmdlet add-adgroupmember

En el siguiente ejemplo vemos cómo añadimos el usuario tempuser al grupo grupoprueba, con el parámetro -identity indicamos al cmdlet el contenedor (grupo) al que queremos añadir el miembro y con el parámetro -members indicamos que miembro queremos añadir

add-adgroupmember –identity "grupoprueba" –members tempuser

Como podéis suponer, podemos añadir múltiples usuarios desde un archivo, desde variable, separados por comas... a uno o a múltiples grupos, vamos a ver algunos ejemplos

Añadiendo múltiples usuarios directamente escritos en el comando

add-adgroupmember –identity "grupoprueba" –members tempuser1,tempuser2

Añadiendo el mismo usuario a diversos grupos

“Grupo1”, “grupo2” | foreach {add-adgroupmember -identity $_ -members tempuser}

Añadiendo un listado de usuarios a un grupo

get-content C:\usuariosparagrupopruebas.txt | foreach { add-adgroupmember -identity “grupoprueba” -members $_}

Añadiendo todos los miembros de una OU a un grupo

get-aduser -searchbase "OU=it,DC=cyberseguridad,dc=net" -filter {objectclass -eq "user" } | foreach {add-adgroupmember -identity grupoprueba -Members $_}

O copiar los de un grupo a otro con un comando similar

get-adgroupmember -identity grupoprueba | foreach {add-adgroupmember -identity grupoprueba2 -members $_}

Añadir ordenadores a un grupo

El procedimiento es exactamente igual que para los usuarios pero añadiendo el símbolo $ tras el nombre de la máquina, tal y como almacena AD el samaccountname de las máquinas, por ejemplo en el caso más sencillo
add-adgroupMember -identity grupoprueba -members "pcprueba$"

Teniendo esto en cuenta el procedimiento es exactamente igual que para los usuarios por lo que podéis utilizar los ejemplos anteriores.

Anidamiento de grupos

Es probable que tengamos que anidar grupos de seguridad dentro de otros para obtener un control más sencillo de sus permisos, para ello hemos de tener en cuenta lo que hemos visto anteriormente sobre las limitaciones sobre los miembros que puede contener. De todas maneras si tratamos de anidar un grupo incompatible dentro de otro (ejemplo grupo universal dentro de grupo global) el mismo cmdlet nos devolverá un error.

De nuevo leeros detenidamente la documentación de Microsoft para entender este aspecto. Una vez hecho esto, como veis en el siguiente ejemplo, en el que añadimos el grupo grupoprueba2 dentro del grupo grupoprueba, no tiene mayor dificultad

add-adgroupmember -identity grupoprueba -members grupoprueba2

Si ahora ejecutáramos el cmdlet get-adgroupmember contra el grupo grupoprueba veríamos entre sus miembros el grupo grupoprueba2

Get-adgroupmember -identity grupoprueba | select name,objectclass

Y si lo ejecutáramos con el parámetro -recursive los miembros del mismo..

Eliminar miembros de un grupo

Para mantener nuestro AD limpio esta es otra de las tareas que tendremos que realizar de manera habitual, para ello utilizaremos el cmdlet remove-adgroupmember. Este cmdlet tiene de nuevo dos parámetros obligatorios, que son -identity en el que indicaremos el nombre del grupo del cual queremos quitar miembros y el parámetro -members donde especificaremos que miembros hay que quitar del mismo.

A continuación un sencillo ejemplo para quitar el usuario testuser del grupo prueba

remove-adgroupmember -identity grupoprueba -members testuser

Este cmdlet de nuevo ejecuta una acción considerada como crítica, por lo que siempre se nos pedirá confirmación, a no ser que indiquemos lo contrario con -confirm:$false, lo que insistimos en no recomendar por cuestiones de seguridad.
Para eliminar un ordenador, como en el caso de añadirlo tendremos que añadir el símbolo $ correspondiente a su samaccountname.

Remove-adgroupmemeber -identity grupoprueba -members pcprueba$

En el caso que tengamos más de un miembro a quitar, podemos separarlos con comas en el parámetro -members, ejecutar un foreach por ejemplo a partir de un get-adusers o simplemente leerlo de una archivo donde tengamos una lista de usuarios a eliminar de cierto grupo.

get-content C:\usuariosparaeliminargrupopruebas.txt | foreach { remove-adgroupmember -identity grupoprueba -members $_}

De la misma manera podemos tener un listado de miembros (de todo tipo) y los grupos de los cuales eliminarlos, en este caso el script (que podemos ejecutar como .ps1) es un poco más largo pero igualmente sencillo

#importamos el fichero csv a una variable
$miembrosaeliminar = import-csv c:\miembrosaeliminar.csv
#vamos linea a linea
foreach($miembro en $miembrosaeliminar)
{
#sacamos el valor de la columna nombredegrupo
$grupo=$miembro.nombredegrupo
#comprobamos el valor de la columna tipodeobjeto
if($miembro.tipodeobjecto -eq “computer”)
{
#si es un ordenador, le añadimos el simbolo $ al final de su nombre
$miembroaeliminar=”{0}`$” -f $miembro.nombre
}
Else
$miembroaeliminar=$miembro.nombre
}
#ejecutamos el cmdlet para eliminar el miembro del grupo
Remove-adgroupmember -identity $grupo -members $miembroaeliminar

Borrar un grupo

En el caso que queramos borrar un grupo el cual consideremos no necesitar, lo primero que debemos hacer es asegurarnos que el mismo no tiene ningún miembro para evitar futuros fallos. Para ello podemos usar de nuevo el cmdlet get-adgroupmember

Get-adgroupmember -identity grupoprueba

Una vez tengamos claro que el grupo está vacío podemos ejecutar el cmdlet remove-adgroup como vemos a continuación

Remove-adgroup -identity grupoprueba

En este caso de nuevo tenemos la opción de indicar que se evite la confirmación con el parámetro -confirm:$false

Como en ejemplos anteriores podemos pasarle el grupo a eliminar a este cmdlet a través de una búsqueda previa enlazando cmdlets.

Get-adgroup -filter “name -eq “grupoprueba” | remove-adgroup

Esperemos como siempre que estos ejemplos os sirvan de ayuda y sean solo la base de vuestros futuros scripts que os hagan trabajar mucho más eficientemente con el potencial inmenso de powershell. Nos vemos en el próximo cybertruco.