Automatización de Active Directory con PowerShell
Active Directory es el pilar de la gestion de identidades en entornos empresariales Windows. Mientras que las herramientas graficas como Active Directory Users and Computers funcionan para operaciones individuales, PowerShell transforma la administracion de AD al permitir automatizar tareas repetitivas, realizar operaciones masivas y generar reportes detallados que serian imposibles de crear manualmente. Esta guia cubre los cmdlets esenciales y scripts practicos que todo administrador de Windows necesita dominar.
Configuración del Módulo y Primeros Pasos
Antes de comenzar a gestionar Active Directory con PowerShell, necesitas asegurarte de que el modulo ActiveDirectory esta instalado y disponible. En un Domain Controller el modulo esta disponible automaticamente, pero en una estacion de trabajo necesitas instalar las herramientas RSAT.
# Instalar RSAT en Windows 10/11
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
# Instalar en Windows Server
Install-WindowsFeature -Name RSAT-AD-PowerShell
# Verificar que el modulo esta disponible
Import-Module ActiveDirectory
Get-Module ActiveDirectory
Una vez importado el modulo, puedes explorar los cmdlets disponibles con Get-Command -Module ActiveDirectory. El modulo incluye mas de 150 cmdlets para gestionar usuarios, grupos, computadoras, OUs, politicas de contrasena y muchos otros objetos de Active Directory.
Para conectarte a un dominio diferente al tuyo, usa el parametro -Server especificando el nombre del Domain Controller. El parametro -Credential te permite autenticarte con credenciales alternativas cuando necesitas acceso a dominios con relaciones de confianza.
Aprovisionamiento de Usuarios
La creacion de cuentas de usuario es una de las tareas mas frecuentes en la administracion de Active Directory. PowerShell permite tanto la creacion individual como la masiva desde archivos CSV, eliminando el trabajo manual repetitivo.
# Crear un usuario individual
New-ADUser -Name "Maria Garcia" `
-GivenName "Maria" `
-Surname "Garcia" `
-SamAccountName "mgarcia" `
-UserPrincipalName "mgarcia@dominio.local" `
-Path "OU=Empleados,DC=dominio,DC=local" `
-AccountPassword (ConvertTo-SecureString "P@ssw0rd2026!" -AsPlainText -Force) `
-Enabled $true `
-Department "Ingenieria" `
-Title "Desarrolladora Senior"
# Creacion masiva desde CSV
Import-Csv -Path "C:\Scripts\nuevos_usuarios.csv" | ForEach-Object {
New-ADUser -Name "$($_.Nombre) $($_.Apellido)" `
-GivenName $_.Nombre `
-Surname $_.Apellido `
-SamAccountName $_.Usuario `
-UserPrincipalName "$($_.Usuario)@dominio.local" `
-Path $_.OU `
-AccountPassword (ConvertTo-SecureString $_.Password -AsPlainText -Force) `
-Enabled $true `
-Department $_.Departamento
# Agregar a grupos
if ($_.Grupos) {
$_.Grupos -split ";" | ForEach-Object {
Add-ADGroupMember -Identity $_ -Members $using:_.Usuario
}
}
}
El parametro -WhatIf es fundamental para verificar las operaciones antes de ejecutarlas. Agrega -WhatIf al final de cualquier cmdlet destructivo para simular la ejecucion y ver que cambios se realizarian sin modificar nada en el directorio.
Reportes y Auditoría
Generar reportes regulares de Active Directory es esencial para la seguridad y el cumplimiento. PowerShell permite consultar el directorio y exportar resultados en multiples formatos para revision y documentacion.
# Usuarios que no han iniciado sesion en 90 dias
$inactivos = Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00 -UsersOnly |
Select-Object Name, SamAccountName, LastLogonDate, Enabled |
Sort-Object LastLogonDate
$inactivos | Export-Csv -Path "C:\Reportes\usuarios_inactivos.csv" -NoTypeInformation
# Cuentas con contrasena que nunca expira
Get-ADUser -Filter {PasswordNeverExpires -eq $true} -Properties PasswordNeverExpires |
Select-Object Name, SamAccountName, PasswordNeverExpires |
Export-Csv -Path "C:\Reportes\password_never_expires.csv" -NoTypeInformation
# Cuentas bloqueadas actualmente
Search-ADAccount -LockedOut |
Select-Object Name, SamAccountName, LockedOut, LastLogonDate
Estos reportes identifican riesgos de seguridad comunes: cuentas abandonadas que podrian ser comprometidas, contrasenas que nunca expiran violando las politicas de seguridad y cuentas bloqueadas que pueden indicar intentos de acceso no autorizado. Programa estos reportes para ejecutarse semanalmente con Task Scheduler y enviar los resultados por correo electronico.
Gestión de Grupos y Unidades Organizativas
La gestion eficiente de grupos y OUs es fundamental para mantener un Active Directory organizado y aplicar politicas de forma granular. PowerShell simplifica tanto la creacion como el mantenimiento continuo de la estructura del directorio.
# Crear grupo de seguridad
New-ADGroup -Name "Desarrollo-Web" `
-GroupScope Global `
-GroupCategory Security `
-Path "OU=Grupos,DC=dominio,DC=local" `
-Description "Equipo de desarrollo web"
# Agregar multiples usuarios a un grupo
$usuarios = "mgarcia", "jlopez", "amoreno"
Add-ADGroupMember -Identity "Desarrollo-Web" -Members $usuarios
# Listar miembros de un grupo con detalles
Get-ADGroupMember -Identity "Domain Admins" -Recursive |
Get-ADUser -Properties Department, Title |
Select-Object Name, SamAccountName, Department, Title
# Crear estructura de OUs
$departamentos = @("Ingenieria", "Ventas", "RRHH", "Finanzas", "Operaciones")
foreach ($dept in $departamentos) {
New-ADOrganizationalUnit -Name $dept `
-Path "OU=Empresa,DC=dominio,DC=local" `
-ProtectedFromAccidentalDeletion $true
}
La proteccion contra eliminacion accidental (-ProtectedFromAccidentalDeletion $true) es una practica recomendada para todas las OUs en produccion. Evita que un administrador elimine accidentalmente una OU completa con todos los objetos que contiene, una operacion que podria tener consecuencias catastroficas.
Para mover usuarios entre OUs cuando cambian de departamento, usa Move-ADObject. Combina esto con la lectura de un CSV de cambios organizacionales para automatizar las transferencias masivas manteniendo un registro de cada movimiento.