Desplegar un dominio de Active Directory por PowerShell

Automatizando el proceso de desplegar un dominio de Active Directory de Windows Server 2016 core desde 0 por PowerShell. De esta forma se automatiza todo el proceso para evitar posibles errores humanos y acelerar el proceso de despliegue. Se construye el script paso a paso, entendiendo todo el proceso para llegar a desplegar un dominio. Al final del artículo encontraréis el enlace a GitHub de los archivos utilizados.
Para llevar a cabo esta tarea, se parte de una máquina virtual con Windows Server 2016 core, desplegada según la maqueta que se ha creado siguiendo la entrada de instalación de Windows Server core. Si, lo sé, esta entrada hace referencia a la versión de Windows Server 2012 R2, los pasos son los mismos para la versión Windows Server 2016. No es necesario que hagáis la configuración de las tarjetas de red ya que las haremos con este mismo script.
Iniciar sesión en la consola local, como que es una máquina que aún no está en el dominio, es precisamente lo que queremos hacer, desplegar un dominio nuevo de Active Directory.
El símbolo de comandos que obtenemos es el tradicional. Se tiene que hacer el salto a la PowerShell, ¿cómo? Pues ejecutando el comando:
powershell
La diferencia está en qué al inicio del prompt (donde nos indica en que carpeta estamos) hay las iniciales PS de PowerShell.
Personalizar la máquina para desplegar un dominio de Active Directory
Los despliegues de máquinas a partir de plantillas son despliegues genéricos, hay que personalizar el nombre, el direccionamiento IP y los servidores de DNS.
Para cambiar el nombre de la máquina, se recupera el nombre actual con la variable de sistema $env:computername
y se asigna un nuevo nombre, por ejemplo, srvDC1. Se tiene que reiniciar la máquina, pero aún no lo hacemos.
rename-computer -computername $env:computername -newname srvDC1
Como buena práctica en un servidor no utilizaremos nunca direccionamiento IP dinámico, y menos en un controlador de Active Directory. Toca configurar una dirección IP estática. Este apartado puede ser un poco más difícil de automatizar. Lo primero que se hace es localizar cuál es el adaptador de red Get-NetAdapter -Physical
que está levantado where-object {$_.Status -eq "up"}
, tiene conexión, y se asigna a una variable: $tarjeta
. Para jugar un poco más, se sustituye el comando where-object
por el símbolo de interrogación, es lo mismo ?
:
$tarjeta = Get-NetAdapter | ? {$_.Status -eq "up"}
Tenemos el adaptador, el siguiente paso es eliminar cualquier dirección IP que pueda tener para añadir una de nueva. Se hace con una sentencia condicional, es decir, se comprueba que tenga una dirección IP y en este caso la elimina:
if (($tarjeta | Get-NetIpConfiguration).IPv4Address.IPAddress) { $tarjeta | Remove-NetIpAddress -AddressFamily IPv4 -Confirm:$false }
Repetimos el proceso para la puerta de enlace por defecto:
if (($tarjeta | Get-NetIpConfiguration).IPv4DefaultGateway) { $tarjeta | Remove-NetRoute -AddressFamily IPv4 -Confirm:$false }
Definimos las variables para la configuració IP del servidor. De esta forma nos será más fácil ir modificando el script para aplicarlo a cualquier sitio, sólo cambiando el contenido de estas variables: Dirección IP ($IP), máscara de la red ($Mascara), puerta de enlace ($Puerta) y el servidor de DNS ($DNS) que como es para desplegar un dominio desde cero se utiliza la propia dirección IP asignada al servidor.
$IP = "192.168.1.202" $Mascara = 24 $Puerta = "192.168.1.201" $DNS = $IP
Ejecutamos los comandos asignando las variables anteriores para establecer la configuración de direccionamiento IP del servidor:
$tarjeta | New-NetIpAddress -AddressFamily IPv4 -IPAddress $IP -PrefixLength $Mascara -DefaultGateway $Puerta $tarjeta | set-DNSClientServerAddress -ServerAddress $DNS
Ahora sí se tiene que reiniciar el equipo, tiene que hacer el cambio de nombre del equipo y arrancar con la nueva configuración IP:
shutdown /r /t 0 /f
Si es la primera vez y no estáis seguros que todo funcione correctamente se puede comprobar con los comandos:
$env:computername $tarjeta = Get-NetAdapter | ? {$_.Status -eq "up"} ($tarjeta | Get-NetIpConfiguration).IPv4Address.IPAddress ($tarjeta | Get-NetIpConfiguration).IPv4DefaultGateway Get-DNSClientServerAddress
Instalar el rol de Active Directory y servidor DNS para desplegar un dominio
De pasada, si os apetece o no os acordáis de como se llama el rol o característica a instalar, se puede comprobar que roles y características tenemos disponible para instalar o estar instalado con el comando:
Get-WindowsFeature
Para desplegar el rol de Active Directory y DNS se utiliza el comando:
Install-WindowsFeature AD-Domain-Services,DNS
Como que no es muy habitual ir desplegando servidores de Active Directory por PowerShell, por defecto no hay cargado el módulo para su despliegue. Para cargarlo, ejecutar:
Import-module addsdeployment
A priori no hace nada, pero si comprobáis los módulos cargados en la PowerShell, en el listado aparece el addsdeployment:
get-module
Recordad, si estáis perdidos o no recordáis el comando, que para visualizar los cmdlets que pertenecen o estan disponibles en un módulo lo podéis hacer con el comando:
get-command -module addsdeployment
Llegamos a la parte más caliente, desplegar un dominio de Active Directory. Para crearlo, utilizo los siguientes datos:
- Nombre del dominio y del bosque: jmsolanes.local
- Nombre NetBIOS del dominio: jmsolanes
- Nivel funcional del bosque establecido en Windows Server 2016 nativo.
- Nivel funcional del dominio establecido en Windows Server 2016 nativo.
- El servidor actuará como catálogo global.
- El servidor hará de DNS integrado con el Active Directory.
- Contraseña para la recuperación del Active Directory: P@ssw0rd (en entornos en producción NO utilizaréis esta contraseña, claro).
- La carpeta de base de datos del Active Directory se ubicará en la carpeta por defecto: c:\Windows\NTDS
- La carpeta de logs del Active Directory se ubicará en la carpeta por defecto: c:\Windows\NTDS
- La carpeta SYSVOL del Active Directory se ubicará en la carpeta por defecto: c:\Windows\SYSVOL
Para jugar, establecemos las variables que necesitamos. Ui. ¿Son pocas no?:
$dominioFQDN = "jmsolanes.local" $dominioNETBIOS = "jmsolanes"
El comando para desplegar un dominio Windows Server 2016 nativo, una vez acaba reinicia automáticamente el servidor para aplicar los cambios:
Install-ADDSForest -DomainName $dominioFQDN -DomainNetBiosName $dominioNETBIOS -SafeModeAdministratorPassword (ConvertTo-SecureString -string "P@ssw0rd" -AsPlainText -Force) -DomainMode WinThreshold -ForestMode WinThreshold -InstallDNS -Confirm:$false
Se ha reiniciado el servidor, para trabajar cómodamente con los siguientes comandos, volvemos a declarar las variables del dominio, esta vez, añadiendo el dominio LDAP ($dominioLDAP), alerta la coma del inicio:
$dominioFQDN = "jmsolanes.local" $dominioLDAP = ",DC=jmsolanes,DC=local"
Afinamos un poco la configuración del Active Directory habilitando la papelera de reciclaje para los objetos del mismo. Ojo, esta es una operación que no tiene punto de retorno. Si el dominio no se tiene que degradar porque nos hayamos equivocado, es la mejor opción que podéis hacer, de lo contrario, mejor saltar este paso.
Enable-ADOptionalFeature -Identity ("cn=Recycle Bin Feature,cn=Optional Features,CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration" + $dominioLDAP) -Scope ForestOrConfigurationSet -target $dominioFQDN -Confirm:$false
Afinando el servidor de DNS
No nos olvidemos que el servicio de DNS es una de las partes más importantes del Active Directory, si no está bien definido o no funciona, el invento se desmorona.
$ReenviaDNS1 = "8.8.8.8" $ReenviaDNS2 = "8.8.4.4" $RedInversa = "192.168.1.0/24"
En este caso, establecemos los reenviadores de DNS hacia Internet (ISP):
Set-DNSServerForwarder -IPAddress $ReenviaDNS1,$ReenviaDNS2
Manías mías, modificar el registro del DNS para que sólo aparezcan los errores.
Set-DnsServerDiagnostics -EventLogLevel 1
Crear la zona de búsqueda inversa, que muchas veces nos dejamos, alojada en el Active Directory y que sólo permita las actualizaciones seguras:
Add-DNSServerPrimaryZone -NetworkId $RedInversa -ReplicationScope "Forest" -DynamicUpdate Secure -Confirm:$false
Forzar el registro del servidor en el DNS, tanto en la zona directa como en la inversa:
Register-DNSClient
Hacemos una pequeña consulta rápida para comprobar los registros de HOSTS dentro del DNS, en caso de aparecer registros extraños (por ejemplo el nombre del servidor anterior) convendría hacer limpieza:
Get-DnsServerResourceRecord -ZoneName $dominioFQDN -RRType "A"
Scripts para desplegar un dominio de Active Directory
Felicidades, ya tenemos un Active Directory desplegado por PowerShell, pero eso «no mola». ¡Lo quiero hacer más rápido!. Creamos el script final juntando los comandos en tres partes, para los diferentes reinicios que se necesitan:
- Personalización de la máquina – 1_AD_personaliza.ps1
- Configuración del Active Directory – 2_AD_configura.ps1
- Parametrización – 3_AD_parametriza.ps1
Script de personalización de la máquina
Recordemos que es lo primero a ejecutar con la máquina pelada.
$nombreservidor = "srvDC1" $IP = "192.168.1.202" $Mascara = 24 $Puerta = "192.168.1.201" $DNS = $IP rename-computer -computername $env:computername -newname $nombreservidor $tarjeta = Get-NetAdapter | ? {$_.Status -eq "up"} if (($tarjeta | Get-NetIpConfiguration).IPv4Address.IPAddress) { $tarjeta | Remove-NetIpAddress -AddressFamily IPv4 -Confirm:$false } if (($tarjeta | Get-NetIpConfiguration).IPv4DefaultGateway) { $tarjeta | Remove-NetRoute -AddressFamily IPv4 -Confirm:$false } $tarjeta | New-NetIpAddress -AddressFamily IPv4 -IPAddress $IP -PrefixLength $Mascara -DefaultGateway $Puerta $tarjeta | set-DNSClientServerAddress -ServerAddress $DNS shutdown /r /t 0 /f
Script de configuración del Active Directory
Reiniciada la máquina después de parametrizarla, se hace el despliegue y configuración del rol de Active Directory y DNS.
$dominioFQDN = "jmsolanes.local" $dominioNETBIOS = "jmsolanes" Install-WindowsFeature AD-Domain-Services,DNS Import-module addsdeployment Install-ADDSForest -DomainName $dominioFQDN -DomainNetBiosName $dominioNETBIOS -SafeModeAdministratorPassword (ConvertTo-SecureString -string "P@ssw0rd" -AsPlainText -Force) -DomainMode WinThreshold -ForestMode WinThreshold -InstallDNS -Confirm:$false
Script de parametrización del Active Directory
Activar la papelera de reciclaje y parametrizar el servicio de DNS. También es cierto, que este script se puede unir con el anterior en caso que utilizemos una sesión remota de PowerShell para lanzar los comandos.
$dominioFQDN = "jmsolanes.local" $dominioLDAP = ",DC=jmsolanes,DC=local" $ReenviaDNS1 = "8.8.8.8" $ReenviaDNS2 = "8.8.4.4" $RedInversa = "192.168.1.0/24" Enable-ADOptionalFeature -Identity ("cn=Recycle Bin Feature,cn=Optional Features,CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration" + $dominioLDAP) -Scope ForestOrConfigurationSet -target $dominioFQDN -Confirm:$false Set-DNSServerForwarder -IPAddress $ReenviaDNS1,$ReenviaDNS2 Set-DnsServerDiagnostics -EventLogLevel 1 Add-DNSServerPrimaryZone -NetworkId $RedInversa -ReplicationScope "Forest" -DynamicUpdate Secure -Confirm:$false Register-DNSClient
Ya tenemos el Active Directory completamente operativo, virgen, eso sí, pero a punto para empezar a crear cosas que veremos en otra entrada.
¿Te ha gustado el articulo? 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