Unidades Organizativas Active Directory por PowerShell

9 noviembre 2016
Josep Ma Solanes 0

Con esta entrada se automatiza el proceso de creación de las estructuras de unidades organizativas de Active Directory en el estándar que deseamos. Con la creación de grupos de seguridad y usuarios operadores por defecto. Es un proceso muy fácil y que seguramente sólo utilizaremos una vez en nuestras instalaciones. Sin embargo, en el camino del DevOps es necesario tener esta parte automatizada.

Partimos de un entorno de Active Directory virgen, donde todavía no se han creado las unidades organizativas ni nada por el estilo. En ella se crean las diferentes Unidades Organizativas que contendrán los objetos:

  • GRUPOS DE SEGURIDAD. Donde ponemos los diferentes grupos de seguridad que necesitamos.
  • EQUIPOS. Donde pondremos los equipos que no son controladores de dominio. Se estructura en otras unidades organizativas para poder aplicar correctamente las Políticas de Grupo y delegación.
    • Estaciones de Trabajo
    • Móviles
    • VDIs
    • Servidores miembros
      • Clústeres
      • Hipervisores
      • NAS
  • USUARIOS. Donde pondremos los usuarios. También se estructura en otras unidades organizativas para poder aplicar correctamente las Políticas de Grupo y delegación.
    • Administradores
    • Empresa
    • Externos
    • Servicios

Para redondearlo, en la Unidad Organizativa Grupos de Seguridad, se crearán los siguientes:

  • Usuarios Wi-Fi
  • Usuarios VPN
  • Técnicos de HelpDesk
  • Administradores de SQL Server
  • Administradores de SharePoint

Para acabar con dos usuarios Administradores de SQL Server y de SharePoint, creados en la Unidad Organizativa Administradores:

  • Operador
  • Administrador Josep Solanes

 

Crear Unidades Organizativas

Los comandos son sencillos. También partiremos de la variable donde se especifica el nombre del dominio:

$dominioLDAP="DC=jmsolanes,DC=local"

Para crear las unidades organizativas, se indica el nombre, el nombre con el que tiene que aparecer y la ruta LDAP donde se tienen que crear:

New-ADOrganizationalUnit -DisplayName "USUARIOS" -Name "USUARIOS" -path $dominioLDAP
New-ADOrganizationalUnit -DisplayName "EQUIPOS" -Name "EQUIPOS" -path $dominioLDAP
etc...

¡Que aburrido si cada vez tengo que hacer esto! Porque no lo mejoramos con una función que, además, compruebe si existe antes de crearla:

function CreaEstructura
{
   $NombreOU = $args[0]
   $dominioLDAP = $args[1]
   $rutaOU = ("OU="+$NombreOU+","+$dominioLDAP)
   if ([adsi]::Exists(("LDAP://" + $rutaOU))) 
   {
      write-host ("La Unidad Organizativa " + $NombreOU + " ya existe.") -ForegroundColor Red
   } 
   else
   {
      write-host ("Creando la OU "+$NombreOU+","+$dominioLDAP) -ForegroundColor Green
      new-ADOrganizationalUnit -DisplayName $NombreOU -Name $NombreOU -path $dominioLDAP
   }
}

Con la función creada que trabaja para nosostros, sólo hay que ir llamándola para crear el árbol de Unidades Organizativas según necesitemos, indicando el nombre de la nueva unidad seguida dentro de que carpeta se tiene que crear:

CreaEstructura "GRUPOS DE SEGURIDAD" $dominioLDAP
CreaEstructura "USUARIOS" $dominioLDAP
CreaEstructura "Administradores" ("OU=USUARIOS,"+$dominioLDAP)
CreaEstructura "Servicios" ("OU=USUARIOS,"+$dominioLDAP)
CreaEstructura "Empresa" ("OU=USUARIOS,"+$dominioLDAP)
CreaEstructura "Externos" ("OU=USUARIOS,"+$dominioLDAP)
CreaEstructura "EQUIPOS" $dominioLDAP
CreaEstructura "Estaciones de Trabajo" ("OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "Móviles" ("OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "VDIs" ("OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "Servidores miembros" ("OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "NAS" ("OU=Servidores miembros,OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "Hipervisores" ("OU=Servidores miembros,OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "Clústeres" ("OU=Servidores miembros,OU=EQUIPOS,"+$dominioLDAP)

 

Crear los Grupos de Seguridad

Con la estructura de Unidades Organizativas creada, vamos a por los grupos de seguridad. Por ejemplo, el de Usuarios de la Wi-Fi:

New-ADGroup -DisplayName "Usuarios Wi-Fi" -Name "Usuarios Wi-Fi" -GroupScope DomainLocal -GroupCategory Security -Path "GRUPOS DE SEGURIDAD"

También lo podemos mejorar un poco, ¿no? La adaptamos para crear una función. Véis que hay muchos parámetros casi iguales con la función anterior, ¿no? Se puede simplificar y al final lo veréis. De momento, lo dejo para entender los diferentes apartados:

function NuevoGrupoSeguridad
{
   $NombreGrupo = $Args[0]
   $NombreOU = "GRUPOS DE SEGURIDAD"
   $dominioLDAP = "DC=jmsolanes,DC=local"
   $rutaOU = ("OU="+$NombreOU+","+$dominioLDAP)
   if (Get-ADGroup -Filter {SamAccountName -eq $NombreGrupo})
   {
     write-host ("El grupo de seguridad " + $NombreGrupo + " ya existe.") -ForegroundColor Red
   }
   else
   {
     New-ADGroup -DisplayName $NombreGrupo -Name $NombreGrupo -GroupScope DomainLocal -GroupCategory Security -Path $rutaOU
   }
}

Esta función la llamaremos indicando el nombre del grupo de seguridad a crear:

NuevoGrupoSeguridad "Administradores Web"

 

Crear Usuarios

Tenemos las Unidades Organizativas y los Grupos de Seguridad. El siguiente paso es crear usuarios. El comando también es sencillo. Se crea el usuario Operador con la contraseña P@ssw0rd, que la tendrá que cambiar en el primer inicio de sesión y que se creará en la Unidad Organizativa de Administradores:

New-ADUser -DisplayName "Operador" -Name "Operador" -UserPrincipalName "Operador" -Enabled:$true -Path "OU=Administradores,OU=USUARIOS,DC=jmsolanes,DC=local" -AccountPassword (ConvertTo-SecureString -string "P@ssw0rd" -AsPlainText -Force) -ChangePasswordAtLogon:$True

Como que es un usuario para administrar el sistema informático, lo añadimos a los grupos de seguridad de Administración:

Add-ADGroupMember -Identity "Administradores de SQL Server" -Members Operador
Add-ADGroupMember -Identity "Administradores de SharePoint" -Members Operador

Volvemos a crear una nueva función, en que cogemos el nombre del usuario que se tiene que visualizar y el nombre de logon:

function NuevoUsuario
{
   $NombreUsuario=$Args[0]
   $NombreLogon=$Args[1]
   $NombreOU = "OU=Administradores,OU=USUARIOS"
   $dominioLDAP = "DC=jmsolanes,DC=local"
   $rutaOU = ($NombreOU+","+$dominioLDAP)
   $rutaOU = ($NombreOU+","+$dominioLDAP)
   if (Get-ADUser -Filter {SamAccountName -eq $NombreLogon})
   {
     write-host ("La cuenta de usuario " + $NombreLogon + " ya existe.") -ForegroundColor Red
   }
   else
   {
     write-host("Creando el usuario " + $NombreLogon + " en la unidad organizativa "+$rutaOU) -ForegroundColor Green
     New-ADUser -DisplayName $NombreUsuario -Name $NombreLogon -UserPrincipalName $NombreLogon -Enabled:$true -Path $rutaOU -AccountPassword (ConvertTo-SecureString -string "P@ssw0rd" -AsPlainText -Force) -ChangePasswordAtLogon:$True
   }
}

Esta función la llamaremos indicando el nombre con el que se tiene que visualizar seguido del nombre de logon:

NuevoUsuario "Josep Solanes" "jmsolanes"

Ya tenemos los tres apartados preparados. ¿Vamos a hacer una mezcla de todo ello?

 

Script para crear una estructura estándar de Unidades Organizativas

No hay demasiado más que decir, juntamos todas las partes en una de sola para generar la estructura a partir del script.

# Variables generales
$dominioLDAP = "DC=jmsolanes,DC=local"

# Función para crear un nuevo Grupo de Seguridad
function NuevoGrupoSeguridad
{
  $NombreGrupo = $Args[0]
  $NombreOU = $Args[1]
  $dominioLDAP = $Args[2]
  $rutaOU = ("OU="+$NombreOU+","+$dominioLDAP)
  if (Get-ADGroup -Filter {SamAccountName -eq $NombreGrupo})
  {
    write-host ("El grupo de seguridad " + $NombreGrupo + " ya existe.") -ForegroundColor Red
  }
  else
  {
    New-ADGroup -DisplayName $NombreGrupo -Name $NombreGrupo -GroupScope DomainLocal -GroupCategory Security -Path $rutaOU
  }
}

# Función para crear un nuevo Usuario, si se crea la OU Administradores. Lo añade automáticamente a los Grupos de Administradores de SQL y SharePoint.
function NuevoUsuario
{
  $NombreUsuario=$Args[0]
  $NombreLogon=$Args[1]
  $NombreOU = $Args[2]
  $dominioLDAP = $Args[3]
  $rutaOU = ($NombreOU+","+$dominioLDAP)
  if (Get-ADUser -Filter {SamAccountName -eq $NombreLogon})
  {
    write-host ("La cuenta de usuario " + $NombreLogon + " ya existe.") -ForegroundColor Red
  }
  else
  {
    write-host("Creando el usuario " + $NombreLogon + " en la unidad organizativa "+$rutaOU) -ForegroundColor Green
    New-ADUser -DisplayName $NombreUsuario -Name $NombreLogon -UserPrincipalName $NombreLogon -Enabled:$true -Path $rutaOU -AccountPassword (ConvertTo-SecureString -string "P@ssw0rd" -AsPlainText -Force) -ChangePasswordAtLogon:$True
  }
  if ($NombreOU="Administradores")
  {
    Add-ADGroupMember -Identity "Administradores de SQL Server" -Members $NombreLogon
    Add-ADGroupMember -Identity "Administradores de SharePoint" -Members $NombreLogon
  }
}

# Función principal para crear la estructura y a partir de ella ir creando los grupos de seguridad y usuarios.
function CreaEstructura
{
  $NombreOU = $args[0]
  $dominioLDAP = $args[1]
  $rutaOU = ("OU="+$NombreOU+","+$dominioLDAP)
  Write-Host ("Creando Unidad Organizativa: " + $rutaOU) -ForegroundColor Yellow
  if ([adsi]::Exists(("LDAP://"+$rutaOU))) 
  {
    write-host ("La Unidad Organizativa " + $NombreOU + " ya existe.") -ForegroundColor Red
  } 
  else
  {
    write-host ("Creando la OU "+$NombreOU+","+$dominioLDAP) -ForegroundColor Green
    new-ADOrganizationalUnit -DisplayName $NombreOU -Name $NombreOU -path $dominioLDAP
  }
  if ($NombreOU -eq "GRUPOS DE SEGURIDAD")
  {
    write-host ("Estoy en la OU "+$NombreOU+" creando los grupos de seguridad correspondientes.") -ForegroundColor Green
    NuevoGrupoSeguridad "Usuarios Wi-Fi" $NombreOU $dominioLDAP
    NuevoGrupoSeguridad "Usuarios VPN" $NombreOU $dominioLDAP
    NuevoGrupoSeguridad "Técnicos de HelpDesk" $NombreOU $dominioLDAP
    NuevoGrupoSeguridad "Administradores de SQL Server" $NombreOU $dominioLDAP
    NuevoGrupoSeguridad "Administradores de SharePoint" $NombreOU $dominioLDAP
  }
  if ($NombreOU -eq "Administradores")
  {
    write-host ("Estoy en la OU "+$NombreOU+"; creando los usuarios correspondientes.") -ForegroundColor Green
    NuevoUsuario "Operador" "Operador" ("OU="+$NombreOU) $dominioLDAP
    NuevoUsuario "Administrador Josep Solanes" "adminjmsolanes" ("OU="+$NombreOU) $dominioLDAP
  }
}

# Ejecutamos la función principal con los nombres de las diferentes OUs y su ubicación.
CreaEstructura "GRUPOS DE SEGURIDAD" $dominioLDAP
CreaEstructura "USUARIOS" $dominioLDAP
CreaEstructura "Administradores" ("OU=USUARIOS,"+$dominioLDAP)
CreaEstructura "Servicios" ("OU=USUARIOS,"+$dominioLDAP)
CreaEstructura "Empresa" ("OU=USUARIOS,"+$dominioLDAP)
CreaEstructura "Externos" ("OU=USUARIOS,"+$dominioLDAP)
CreaEstructura "EQUIPOS" $dominioLDAP
CreaEstructura "Estaciones de Trabajo" ("OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "Móviles" ("OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "VDIs" ("OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "Servidores miembros" ("OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "NAS" ("OU=Servidores miembros,OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "Hipervisores" ("OU=Servidores miembros,OU=EQUIPOS,"+$dominioLDAP)
CreaEstructura "Clústeres" ("OU=Servidores miembros,OU=EQUIPOS,"+$dominioLDAP)

 

Para acabar, cuatro costillitas para borrar objetos

Para borrar un usuario (operador) del Active Directory

Get-ADUser -filter {SamAccountName -like "Operador*"} | Remove-ADUser

Para borrar un grupo (todos los que empiecen por Técnicos) del Active Directory

get-adgroup -filter {SamAccountName -like "Técnicos*"} | Remove-ADGroup

Para borrar una unidad organizativa del Active Directory, a la que además, se debe quitar el checkbox de protección contra borrado:

Get-ADOrganizationalUnit -Filter {Name -eq "nas"} | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion:$false 
Get-ADOrganizationalUnit -Filter {Name -eq "nas"} | Remove-ADOrganizationalUnit -confirm:$false

Borrar las unidades organizativas a partir de una lista desde un archivo (OUs.txt) con los nombres de cada una de ellas en forma de listado:

get-content .\OUs_es.txt | foreach-object {Get-ADOrganizationalUnit -Filter {Name -eq $_ } | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion:$false}

get-content .\OUs_es.txt | foreach-object {Get-ADOrganizationalUnit -Filter {Name -eq $_ } | Remove-ADOrganizationalUnit -confirm:$false}

¿Ei, esta última idea es buena, verdad? Tenerlo todo en un archivo a partir del cual se crea toda la estructura. Hala, ya tenéis trabajo.

Para terminar, si habéis desplegado todo el entorno anterior y se quiere automatizar el borrado y creación, porque nos hemos equivocado o estamos jugando con ella, aquí tenéis el script para hacerlo:

get-adgroup -filter * | ? {$_.Name -like "Técnicos*"} |Remove-ADGroup -Confirm:$false
get-adgroup -filter * | ? {$_.Name -like "Usuarios*"} |Remove-ADGroup -Confirm:$false
get-adgroup -filter * | ? {$_.Name -like "Administradores*"} | Remove-ADGroup -Confirm:$false
get-aduser -filter {SamAccountName -eq "adminjmsolanes"} | Remove-ADUser -Confirm:$false
get-aduser -filter {SamAccountName -eq "Operador"} | Remove-ADUser -Confirm:$false
get-content .\OUs_es.txt | foreach-object {Get-ADOrganizationalUnit -Filter {Name -eq $_ } | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion:$false}
get-content .\OUs_es.txt | foreach-object {Get-ADOrganizationalUnit -Filter {Name -eq $_ } | Remove-ADOrganizationalUnit -confirm:$false}

Como siempre, podeis encontrar los scripts en mi repositorio de GitHub:

 

¿Te ha gustado el artículo? Lo puedes compartir en las redes sociales. También puedes dejar tu opinión, comentario o sugerencia. ¡Gracias!

Similar Posts by The Author: