Grupos de seguridad dinámicos en AD – Powershell

Translate

Algo que hecho en falta en Active Directory son grupos de seguridad dinámicos, es un concepto que por ahora no existe, pero que podemos hacer de manera “manual” mediante scripts de Powershell.

Que es un grupo de seguridad dinámico?

La idea no es nueva, existe en multitud de plataformas, pero no en AD. El objetivo es conseguir que ciertos grupos de nuestro AD, por ejemplo, grupos de departamentos o de delegaciones, se mantengan de manera automática, es decir, si un usuario pertenece a un departamento concreto o está ubicado en una OU concreta, automáticamente se añada a su correspondiente grupo de seguridad.

Definición del entorno

En el ejemplo, vamos a ver un AD organizado por delegaciones directamente en OUs, lo cual nos permitirá asignar ese usuario al grupo de la delegación correspondiente, sin necesidad de mantenerlo de manera manual.

Tenemos dos fases en el script , una de añadir los usuarios y otra de eliminarlos. Aun que estén en el mismo script podemos omitir una u otra según nos convenga, comentando las lineas.

Comentarios sobre el Script

Lo primero que hace el script es importar los módulos de Active Directory y crear un archivo donde registraremos los usuarios que se añadan o se eliminen.

El siguiente paso es listar y aplicar un bucle, con los nombres de las Delegaciones, es importante, en este script, que los nombre de los grupos y las delegaciones coincidan para aprovecharlo y que sea más sencillo.

Ahora definimos variables y listamos todos los usuarios de la OU, lanzando un bucle. Dentro de este mediante una condición comprobaremos si ya existe el usuario o en caso contrario lo añadiremos.

Para eliminar a los usuarios que no pertenezcan a la OU, listamos los miembros del grupo de seguridad y ejecutamos un bucle.

Ahora comprobamos si el DistinguishedName del usuario, no contiene la cadena de la OU de la delegación, en tal caso se elimina el usuario del grupo de seguridad.

Script de Powershell

Import-Module ActiveDirectory

#Crear fichero de control, se guarda en la ubicación indicada.
$fecha = Get-Date -uFormat "%Y%m%d%H%M"
$file =  "c:\scripts\update_"+ $fecha + ".txt"
Out-File $file

#Listar todas las OUs de Delegaciones.
$OUs = Get-ADOrganizationalUnit -Filter * -SearchScope 1 -SearchBase "OU=Delegaciones,OU=CNBT,DC=cnbt,DC=local" | select name
foreach($ou in $OUs)
{

  $delegacion = $ou.name
  $groupName = $delegacion + " Usuarios"
  $path = "OU=Usuarios,OU=" + $delegacion + ",OU=Delegaciones,OU=CNBT,DC=cnbt,DC=local"
  $SearchPath = "*" + $path +"*"

  #Añadir usuarios de la OU al grupo de seguridad.

  Write-Output " "****** $delegacion ******" " | Out-File -append $file

  #Lista de usuarios en la OU de la delegacion
  $users = Get-ADUser -Filter * -SearchBase $path
  foreach($user in $users)
  {
    #Comprobar si ya existe el usuario dentro del grupo de seguridad.
    $userExist = Get-ADGroupMember -Identity $groupname | where {$_.samaccountname -like $user.samaccountname}
    if($userExist -eq $null)
    {
      #Añade al usuario de la OU al grupo de seguridad.
      Add-ADGroupMember -Identity $groupname -Members $user.samaccountname -ErrorAction SilentlyContinue
      $text1 = "El usuario " + $user.samaccountname + " ha sido añadido al grupo " + $groupName
      write-output $text1 | Out-File -append $file
    }
  }

  #Eliminar usuarios que no pertenecen a la OU.

  #Lista todos los miembros del grupo de seguridad de la empresa
  $members = Get-ADGroupMember -Identity $groupname
  foreach($member in $members)
  {
    #Comprueba que el distinguishedname contenga la cadena de la OU de la delegación.
    if($member.distinguishedname -notlike $Searchpath)
    {
      #Elimina del grupo de seguridad al usuario que no sea de la OU
      Remove-ADGroupMember -Identity $groupname -Members $member.samaccountname -Confirm:$false
      $text2 = "El usuario " + $member.samaccountname + " ha sido eliminado del grupo " + $groupName
      Write-Output $text2 | Out-File -append $file
    }
  }
}

Como podéis ver funciona, ahora solo queda crear una tarea programada de Windows y que se lance según la programación que más nos convenga.

Crear tarea programada

Desde el Programador de tareas de Windows crearemos una nueva tarea.

Marcaremos la opción de Ejecutar tanto si el usuario inició sesión como si no.

Estableceremos un desencadenador que nos convenga, en este caso cada día a las 00:00 y que se repetirá cada hora.

Ahora colocamos la acción para ejecutar el script, en la C:\Scripts\ he dejado el fichero .ps1.

Cuando guardemos la tarea nos pide la clave del adminsitrador para poder ejecutarla sin problemas.

Para revisar si todo va bien, creamos un usuario nuevo y lanzamos la tarea.

 

Espero que os haya servido, si tenéis alguna duda comentar el post y haré lo posible para ayudaros.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *