Unidades Organizativas Active Directory por PowerShell
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:
- Crear la estructura 4_AD_Estructura_Unidades_Organizativas.ps1
- Borrar la estructura 4b_AD_Borra_Estructura.ps1
- Fichero de texto con el nombre las unidades organizativas OUs_es.txt
¿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:
- Microsoft SQL Server con SMB3
- Microsoft SQL Server amb SMB3
- Containers en Linux
- Containers amb Linux
- Migrar el servidor de archivos a Windows Server 2019
- Migrar el servidor de fitxers a Windows Server 2019
- Puerta enlace a Azure en el Windows Admin Center
- Porta enllaç a Azure en el Windows Admin Center
- Hola mundo! WordPress 5 y Gutenberg
- Hola món! WordPress 5 i Gutenberg