Active Directory PowerShell: módulo, comandos y ejemplos

Active Directory PowerShell administra un directorio ordenado como este árbol: siete figuras de madera en tres niveles, una arriba, dos en medio y cuatro abajo, unidas por listones

Active Directory PowerShell es la forma de administrar con comandos las cuentas, los grupos, los equipos y las unidades organizativas de un dominio de Windows. Sustituye a los clics en la consola. Con una línea y comandos como Get-ADUser puede exportar usuarios de Active Directory a Excel, desbloquear un usuario en Active Directory o encontrar las cuentas que nadie usa desde hace meses. Esta guía explica qué es, cómo instalar el módulo de Active Directory, cómo se escriben los comandos y cuáles usa un administrador cada semana. Además, trae doce escenarios listos para copiar y los errores más comunes con su solución.

Está escrita para dos lectores. Si usted no es de sistemas, las primeras secciones le explican qué hace esta herramienta y por qué su equipo de TI la usa. En cambio, si administra un dominio, encontrará los comandos completos, con sus parámetros y sus trampas.

No copiamos el manual sin más. Comprobamos cada comando y cada parámetro contra la referencia oficial del módulo para Windows Server 2025. También medimos en un equipo con Windows 11 lo que no necesita un dominio, como la exportación a Excel. Ahí aparecieron tres trampas que conviene conocer antes de lanzar el primer script.

Qué es Active Directory PowerShell y para qué sirve

Active Directory es el directorio de la empresa: guarda quién trabaja en ella, en qué equipo inicia sesión y a qué tiene acceso. Si necesita la explicación completa, lea primero nuestra guía de qué es Active Directory. Allí se explican el dominio, los controladores y las directivas de grupo.

Active Directory PowerShell es el nombre común del módulo ActiveDirectory de PowerShell. Microsoft lo llama «módulo de Active Directory para Windows PowerShell». La referencia de Windows Server 2025 documenta 151 comandos, llamados cmdlets, para usuarios, grupos, equipos, unidades organizativas, directivas de contraseñas, sitios y replicación.

Para entenderlo sin tecnicismos, piense en el registro de personal de una empresa. La consola Usuarios y equipos de Active Directory es la ventanilla: cómoda, pero atiende de a una ficha. En cambio, Active Directory PowerShell es la oficina de archivo, donde se revisan, se corrigen o se cierran cientos de fichas a la vez, y queda escrito qué se hizo.

Sirve, sobre todo, para ocho trabajos:

  • Hacer inventario de usuarios, grupos y equipos, y exportarlo a Excel.
  • Dar de alta a varias personas a la vez desde una hoja de cálculo.
  • Desbloquear cuentas y restablecer contraseñas.
  • Encontrar cuentas y equipos que nadie usa.
  • Dar de baja a quien se va, siempre con los mismos pasos.
  • Revisar quién pertenece a cada grupo.
  • Ordenar el directorio en unidades organizativas.
  • Comprobar la salud de los controladores de dominio.

Por qué conviene frente a la consola

Desde luego, la consola sigue siendo útil para el caso suelto. Sin embargo, trabaja de a un objeto y no deja un registro reutilizable de lo que se hizo. Por eso, los administradores combinan las dos herramientas.

TareaConsola de Active DirectoryActive Directory PowerShell
Listar todos los usuarios con su cargo y su áreaCopiar columnas a manoUn informe en un archivo CSV
Crear 15 cuentas nuevasQuince asistentes, uno por personaUn ciclo sobre la hoja de altas
Encontrar las cuentas bloqueadasAbrir cada cuentaUna sola orden: Search-ADAccount -LockedOut
Saber quién no inicia sesión desde hace 90 díasNo lo junta en una vistaUn filtro sobre la fecha del último inicio de sesión
Repetir la misma revisión el mes siguienteVolver a hacer cada clicEjecutar el mismo script

En resumen, la consola sirve para lo puntual. Active Directory PowerShell sirve para lo masivo, para lo que se repite y para lo que hay que poder demostrar después.

Un consejo para aprender rápido: el Centro de administración de Active Directory tiene un visor del historial de Windows PowerShell. Haga un cambio con clics y el visor le muestra el comando exacto que la consola ejecutó por debajo, según la documentación de Microsoft.

Cómo se comunica el módulo con el dominio

El módulo no lee la base de datos directamente. En cambio, habla con el servicio Servicios web de Active Directory (ADWS), que se instala solo en cada controlador de dominio. Ese servicio escucha en el puerto TCP 9389. Por tanto, si un firewall bloquea ese puerto entre su equipo y el controlador, ningún comando funcionará, aunque la consola sí abra.

Además, el servicio fija límites de fábrica. El más útil de conocer: Get-ADGroupMember y Get-ADPrincipalGroupMembership devuelven como máximo 5.000 miembros o membresías. Microsoft documenta el valor en el parámetro MaxGroupOrMemberEntries de ADWS, que se cambia en cada controlador por separado.

Cómo instalar el módulo de Active Directory

El módulo de Active Directory no viene en Windows 11 de fábrica. Forma parte de las herramientas de administración remota del servidor, conocidas como RSAT. En los controladores de dominio, en cambio, ya está instalado.

Instalar el módulo de Active Directory en Windows 11

Abra PowerShell como administrador y ejecute:

Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
Get-WindowsCapability -Online -Name Rsat.ActiveDirectory* | Select-Object Name, State

Después, la segunda línea comprueba que el estado diga Installed. El mismo paquete instala la consola Usuarios y equipos de Active Directory. Los pasos con clics, desde Configuración, están en nuestra guía de Active Directory. Necesita Windows 11 Pro o Enterprise: según Microsoft, RSAT no se instala en la edición Home.

Instalar el módulo en Windows Server

En un servidor miembro, el módulo es una característica de Windows:

Install-WindowsFeature -Name RSAT-AD-PowerShell

Active Directory PowerShell en PowerShell 7

Según la lista de compatibilidad de Microsoft, el módulo ActiveDirectory es compatible de forma nativa con PowerShell 7 desde Windows 10 1809 y Windows Server 2019. Es decir, funciona igual en Windows PowerShell 5.1 y en PowerShell 7. En cambio, el módulo GroupPolicy, el de las directivas de grupo, figura como no probado. Para esos comandos, use Windows PowerShell 5.1.

Si todavía no distingue las dos versiones, nuestra guía de PowerShell lo explica con detalle.

Comprobar que el módulo de Active Directory carga

Estas órdenes cargan el módulo y cuentan sus comandos:

Import-Module ActiveDirectory
Get-Command -Module ActiveDirectory | Measure-Object
Get-Help Get-ADUser -Examples

Si el módulo no está instalado, PowerShell no da un error del módulo. En nuestro equipo de prueba, con Windows 11 en español y sin RSAT, Windows PowerShell 5.1 respondió:

El término 'Get-ADUser' no se reconoce como nombre de un cmdlet, función, archivo de script o programa ejecutable.

Y Import-Module ActiveDirectory respondió: No se cargó el módulo 'ActiveDirectory' especificado porque no se encontró ningún archivo de módulo válido en ningún directorio de módulo. Si ve cualquiera de los dos mensajes, falta instalar el módulo de Active Directory.

Cómo funcionan los comandos de Active Directory PowerShell

Todos los comandos siguen el patrón verbo-sustantivo de PowerShell, con el prefijo AD: Get-ADUser consulta usuarios, New-ADGroup crea grupos y Set-ADComputer cambia equipos. Además, casi todos comparten cinco parámetros. Conocerlos ahorra la mitad de los errores.

-Identity: un objeto concreto

-Identity señala un solo objeto. Acepta el nombre de inicio de sesión (SamAccountName), el nombre distintivo, el GUID o el SID. Si el objeto no existe, el comando da error, en lugar de devolver vacío.

Get-ADUser -Identity "ana.rojas"
Get-ADGroup -Identity "GG-Contabilidad"
Get-ADComputer -Identity "PC-CONTA-01"

-Filter y -LDAPFilter: buscar varios objetos

-Filter busca con una sintaxis parecida a la de PowerShell. Microsoft la explica en su ayuda sobre filtros de Active Directory. Tres reglas evitan casi todos los fallos:

  1. Escriba el filtro entre comillas simples y los textos internos entre comillas dobles: -Filter 'Department -eq "Contabilidad"'.
  2. El único comodín que admite es el asterisco, y solo con -like. El signo de interrogación de PowerShell no funciona.
  3. Puede usar variables simples dentro del filtro, como $limite. En cambio, no use propiedades de un objeto, como $_.Usuario: guárdelas antes en una variable.
Get-ADUser -Filter 'Department -eq "Contabilidad"'
Get-ADUser -Filter 'Name -like "Ana*"'
Get-ADUser -Filter 'Enabled -eq $false'
Get-ADUser -LDAPFilter "(&(objectCategory=person)(objectClass=user)(mail=*))"

Por otra parte, -LDAPFilter recibe la sintaxis clásica de LDAP. Sirve cuando ya tiene un filtro probado en otra herramienta.

-Properties: qué datos traer

Por defecto, Get-ADUser trae un conjunto reducido de propiedades: el nombre, el usuario, si la cuenta está habilitada y pocas más. Para ver el área, el correo o la fecha del último inicio de sesión, hay que pedirlas con -Properties:

Get-ADUser -Identity "ana.rojas" -Properties Department, EmailAddress, LastLogonDate, PasswordLastSet

En cambio, -Properties * trae todo y sirve para explorar una cuenta. Sin embargo, en una consulta sobre todo el dominio pide cientos de atributos por cada cuenta. Por eso, en los informes pida solo las columnas que va a usar.

-SearchBase: dónde buscar

Además, -SearchBase limita la búsqueda a una unidad organizativa y a todo lo que contiene. Es la forma más segura de trabajar: un error solo afecta a esa rama del directorio.

Get-ADUser -Filter * -SearchBase "OU=Usuarios,OU=Empresa,DC=corp,DC=example,DC=com"

Las consultas se piden por páginas de 256 objetos y, sin -ResultSetSize, traen todos los resultados. Así, en la empresa de 120 personas de esta serie basta una página; con 5.000 cuentas, el módulo pide 20 páginas por su cuenta.

-Server y -Credential: otro controlador u otra cuenta

Por defecto, el módulo trabaja con el dominio al que pertenece su equipo y con la cuenta con la que usted inició sesión. Para elegir otro controlador, o para trabajar con otra cuenta, use -Server y -Credential:

$cred = Get-Credential
Get-ADUser -Identity "ana.rojas" -Server "dc-02.corp.example.com" -Credential $cred

-WhatIf y -Confirm: probar antes de cambiar

Los comandos que cambian algo aceptan -WhatIf. Con él, PowerShell describe lo que haría sin hacerlo. Úselo siempre la primera vez que ejecuta un script sobre muchas cuentas.

Disable-ADAccount -Identity "luis.mora" -WhatIf
Remove-ADGroupMember -Identity "GG-Contabilidad" -Members "luis.mora" -Confirm:$false

Por el contrario, -Confirm:$false quita la pregunta de confirmación. Úselo solo cuando ya probó el script.

Los comandos más comunes de Active Directory PowerShell

Esta tabla reúne los comandos de Active Directory que un administrador usa cada semana. Todos están en la referencia de Windows Server 2025:

ParaComandoQué hace
UsuariosGet-ADUserConsulta una cuenta o busca varias
UsuariosNew-ADUserCrea una cuenta
UsuariosSet-ADUserCambia datos de una cuenta: cargo, área, teléfono
UsuariosRemove-ADUserBorra una cuenta
CuentasEnable-ADAccount y Disable-ADAccountHabilita o deshabilita una cuenta
CuentasUnlock-ADAccountDesbloquea una cuenta
CuentasSet-ADAccountPasswordCambia o restablece una contraseña
CuentasSearch-ADAccountBusca cuentas bloqueadas, inactivas, vencidas o deshabilitadas
GruposGet-ADGroup y New-ADGroupConsulta o crea grupos
GruposGet-ADGroupMemberLista los miembros de un grupo
GruposAdd-ADGroupMember y Remove-ADGroupMemberAgrega o quita miembros
GruposGet-ADPrincipalGroupMembershipLista los grupos de una cuenta
EquiposGet-ADComputerConsulta los equipos del dominio
EstructuraGet-ADOrganizationalUnit y New-ADOrganizationalUnitConsulta o crea unidades organizativas
EstructuraMove-ADObjectMueve un objeto a otra unidad organizativa
ObjetosGet-ADObject y Restore-ADObjectBusca cualquier objeto y recupera los borrados
ContraseñasGet-ADDefaultDomainPasswordPolicyMuestra la directiva de contraseñas del dominio
DominioGet-ADDomain, Get-ADForest y Get-ADDomainControllerMuestra el dominio, el bosque y los controladores
ReplicaciónGet-ADReplicationFailureMuestra los errores de replicación

Get-ADUser: consultas de usuarios paso a paso

Get-ADUser es el comando más usado del módulo, porque casi todo empieza por encontrar a las personas. Estos ejemplos van de lo simple a lo más útil:

Get-ADUser -Identity "ana.rojas" -Properties *
Get-ADUser -Filter * | Measure-Object
Get-ADUser -Filter 'Enabled -eq $true' -Properties Department | Group-Object Department | Sort-Object Count -Descending
Get-ADUser -Filter 'EmailAddress -like "*"' -Properties EmailAddress | Select-Object Name, EmailAddress
Get-ADUser -Filter * -Properties PasswordNeverExpires | Where-Object PasswordNeverExpires | Select-Object Name, SamAccountName

Así, la primera muestra todos los datos de una cuenta. La segunda cuenta los usuarios del dominio, y la tercera los reparte por área. Por su parte, la cuarta lista quién tiene correo y la quinta encuentra las cuentas con contraseñas que nunca vencen, un hallazgo frecuente en las revisiones.

Un detalle evita confusiones con Get-ADUser. La propiedad LastLogonDate no es la hora exacta del último inicio de sesión: es una copia que el dominio actualiza con retraso, como se explica en el escenario de cuentas inactivas.

Escenarios de ejemplo con Active Directory PowerShell

Los escenarios usan el dominio de ejemplo de nuestra guía de Active Directory: corp.example.com, con los controladores dc-01 y dc-02 y una empresa de 120 personas. Cambie los nombres por los de su dominio. Además, pruebe cada script primero con -WhatIf y sobre una unidad organizativa de prueba.

1. Exportar usuarios de Active Directory a Excel

Sin duda, es la petición más común: una lista de usuarios con su área, su cargo, su correo y su último inicio de sesión. En Windows PowerShell 5.1:

$ou = "OU=Usuarios,OU=Empresa,DC=corp,DC=example,DC=com"
Get-ADUser -Filter * -SearchBase $ou -Properties Department, Title, EmailAddress, LastLogonDate |
    Select-Object Name, SamAccountName, Enabled, Department, Title, EmailAddress, LastLogonDate |
    Export-Csv -Path "C:\Informes\usuarios.csv" -NoTypeInformation -Encoding UTF8 -Delimiter ';'

En PowerShell 7, la última línea cambia la codificación:

Get-ADUser -Filter * -Properties Department, EmailAddress | Select-Object Name, SamAccountName, Department, EmailAddress | Export-Csv -Path "C:\Informes\usuarios.csv" -Encoding utf8BOM -Delimiter ';'

¿Por qué tantas opciones? Porque exportar usuarios de Active Directory a Excel tiene tres trampas. Las medimos en Windows 11 con datos de prueba, sin dominio, exportando a «José Peña» del área de Logística y abriendo cada archivo en Excel:

Cómo se exportóQué quedó en el archivoQué mostró Excel en la primera fila de datos
PowerShell 5.1, sin opcionesUna primera línea #TYPE System.Management.Automation.PSCustomObjectEsa línea en la celda A1, y los títulos en la fila 2
PowerShell 5.1 con -NoTypeInformationLas tildes y la eñe cambiadas por signos de interrogaciónJos? Pe?a: el dato se perdió en el archivo
PowerShell 5.1 con -Encoding UTF8Texto completo, con la marca de UTF-8 al inicioJosé Peña, correcto
PowerShell 7, sin opcionesTexto completo, pero sin la marca de UTF-8José Peña
PowerShell 7 con -Encoding utf8BOMTexto completo, con la marca de UTF-8José Peña, correcto

La tercera trampa es el separador. En un equipo configurado para Colombia, el separador de lista de Windows es el punto y coma; en uno configurado para México o Estados Unidos, la coma. En nuestro equipo, con la coma, Excel abrió en una sola columna un archivo separado con punto y coma. Por eso, use -Delimiter ';' si el informe se abrirá en equipos con la configuración de Colombia, o -UseCulture para usar el separador del equipo donde corre el script.

2. Crear usuarios en bloque desde un CSV

Por lo general, recursos humanos envía las altas en una hoja de Excel. Pida que la guarden en el formato «CSV UTF-8» y con estas columnas: Nombre, Apellido, Usuario y Departamento. Luego:

$ou = "OU=Usuarios,OU=Empresa,DC=corp,DC=example,DC=com"
$clave = Read-Host -AsSecureString "Contraseña temporal"
Import-Csv -Path "C:\Altas\altas.csv" -Delimiter ';' | ForEach-Object {
    $datos = @{
        Name                  = "$($_.Nombre) $($_.Apellido)"
        GivenName             = $_.Nombre
        Surname               = $_.Apellido
        SamAccountName        = $_.Usuario
        UserPrincipalName     = "$($_.Usuario)@corp.example.com"
        Department            = $_.Departamento
        Path                  = $ou
        AccountPassword       = $clave
        ChangePasswordAtLogon = $true
        Enabled               = $true
    }
    New-ADUser @datos -WhatIf
}

Cuando el resultado de -WhatIf le parezca correcto, quite esa opción y vuelva a ejecutarlo. Tres detalles evitan sorpresas:

  • Sin Enabled = $true, la cuenta nace deshabilitada, aunque tenga contraseña. Así lo dice la referencia de New-ADUser.
  • El formato de la hoja importa. Guardamos la misma hoja desde Excel en dos formatos. Con el formato «CSV» a secas, Import-Csv leyó Jos� Pe�a en PowerShell 5.1 y en 7. En cambio, con «CSV UTF-8», leyó José Peña en los dos.
  • El separador también. Si la hoja usa punto y coma y el script no lo dice, Import-Csv lee una sola columna llamada Nombre;Apellido;Usuario;Departamento. En nuestra prueba, la columna Usuario quedó vacía en todas las filas. Por eso el script lleva -Delimiter ';'.

3. Desbloquear un usuario en Active Directory

Cuando alguien llama porque no puede entrar, lo primero es ver si su cuenta está bloqueada. Para desbloquear un usuario en Active Directory, primero se busca y luego se libera:

Search-ADAccount -LockedOut -UsersOnly | Select-Object Name, SamAccountName, LastLogonDate
Get-ADUser -Identity "ana.rojas" -Properties LockedOut, AccountLockoutTime, BadLogonCount
Unlock-ADAccount -Identity "ana.rojas"

Si la cuenta se vuelve a bloquear, algo sigue usando la contraseña vieja: un celular con el correo, una unidad de red o una tarea programada. Para encontrarlo, recuerde que el bloqueo se procesa en el controlador con el rol de emulador de PDC, según Microsoft. Allí queda el evento 4740, que trae el nombre del equipo desde el que llegaron los intentos fallidos:

$pdc = (Get-ADDomain).PDCEmulator
Get-WinEvent -ComputerName $pdc -FilterHashtable @{ LogName = 'Security'; Id = 4740 } -MaxEvents 20 |
    Select-Object TimeCreated, @{ n = 'Cuenta'; e = { $_.Properties[0].Value } }, @{ n = 'Equipo'; e = { $_.Properties[1].Value } }

Un detalle técnico: el contador de intentos fallidos, badPwdCount, no se replica. Cada controlador lleva el suyo, así que dos controladores pueden mostrar cifras distintas para la misma cuenta. Si quiere entender los eventos de Windows, lea nuestra guía del Visor de eventos.

4. Restablecer una contraseña y obligar a cambiarla

Set-ADAccountPassword -Identity "ana.rojas" -Reset -NewPassword (Read-Host -AsSecureString "Contraseña temporal")
Set-ADUser -Identity "ana.rojas" -ChangePasswordAtLogon $true
Unlock-ADAccount -Identity "ana.rojas"

Así, Read-Host -AsSecureString pide la contraseña sin mostrarla ni dejarla escrita en el script. Por eso, evite escribirla en texto plano. De hecho, en nuestra prueba, Windows PowerShell 5.1 se negó a convertir texto plano sin -Force, con el aviso El sistema no puede proteger los datos de entrada de texto sin formato. En cambio, PowerShell 7 lo aceptó sin preguntar.

5. Encontrar cuentas inactivas

Las cuentas que nadie usa son una puerta abierta. Por eso, conviene encontrarlas cada mes:

Search-ADAccount -AccountInactive -TimeSpan 104.00:00:00 -UsersOnly |
    Where-Object Enabled |
    Select-Object Name, SamAccountName, LastLogonDate |
    Export-Csv -Path "C:\Informes\inactivas.csv" -NoTypeInformation -Encoding UTF8 -Delimiter ';'

¿Por qué 104 días y no 90? Porque la fecha que usa el comando, lastLogonTimestamp, no se actualiza en cada inicio de sesión. Según Microsoft, solo se actualiza si el valor guardado es más viejo que un intervalo que, de fábrica, es de 14 días. Por tanto, puede ir hasta 14 días por detrás de la realidad:

Si pide inactividad deLa cuenta pudo usarse hace soloPara garantizar esos días, pida
30 días16 días44 días
60 días46 días74 días
90 días76 días104 días
180 días166 días194 días

Si prefiere Get-ADUser, cuidado con las cuentas que nunca iniciaron sesión. Su LastLogonDate está vacío, y en PowerShell un valor vacío es «menor» que cualquier fecha: lo comprobamos en 5.1 y en 7. Por eso, filtre aparte las cuentas sin fecha:

$limite = (Get-Date).AddDays(-104)
Get-ADUser -Filter 'Enabled -eq $true' -Properties LastLogonDate | Where-Object { $_.LastLogonDate -and $_.LastLogonDate -lt $limite } | Select-Object Name, SamAccountName, LastLogonDate
Get-ADUser -Filter 'Enabled -eq $true' -Properties LastLogonDate, whenCreated | Where-Object { -not $_.LastLogonDate } | Select-Object Name, SamAccountName, whenCreated

6. Dar de baja a una persona que se va

Una baja ordenada deja registro, cierra el acceso y conserva la cuenta un tiempo antes de borrarla:

$u = "luis.mora"
$bajas = "OU=Bajas,OU=Empresa,DC=corp,DC=example,DC=com"
Get-ADPrincipalGroupMembership -Identity $u | Select-Object Name | Export-Csv -Path "C:\Informes\grupos-$u.csv" -NoTypeInformation -Encoding UTF8 -Delimiter ';'
Disable-ADAccount -Identity $u
Set-ADUser -Identity $u -Description "Baja $(Get-Date -Format yyyy-MM-dd), solicitud 1234"
$primario = (Get-ADUser -Identity $u -Properties PrimaryGroup).PrimaryGroup
Get-ADPrincipalGroupMembership -Identity $u | Where-Object DistinguishedName -ne $primario | ForEach-Object { Remove-ADGroupMember -Identity $_ -Members $u -Confirm:$false }
Get-ADUser -Identity $u | Move-ADObject -TargetPath $bajas

En primer lugar, se guardan sus grupos, por si hay que devolverlos. Luego se deshabilita la cuenta y se anota el motivo. Después se quitan los grupos, salvo el grupo principal, que el directorio no deja quitar. Por último, la cuenta pasa a la unidad organizativa de bajas.

Si la empresa sincroniza Active Directory con Microsoft 365, la cuenta deshabilitada llega a la nube en el siguiente ciclo de sincronización. Lo explicamos más abajo.

7. Contraseñas que vencen esta semana

Con la directiva de fábrica, las contraseñas del dominio vencen a los 42 días. En una empresa de 120 personas, eso son unas 20 contraseñas por semana, si los cambios están repartidos. Este informe lista las que vencen en los próximos siete días, con el correo de cada persona, para avisarles antes:

$hasta = (Get-Date).AddDays(7)
Get-ADUser -Filter 'Enabled -eq $true' -Properties "msDS-UserPasswordExpiryTimeComputed", EmailAddress |
    Where-Object { $_."msDS-UserPasswordExpiryTimeComputed" -gt 0 -and $_."msDS-UserPasswordExpiryTimeComputed" -lt [Int64]::MaxValue } |
    Select-Object Name, EmailAddress, @{ n = 'Vence'; e = { [DateTime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") } } |
    Where-Object Vence -le $hasta | Sort-Object Vence

La línea del medio no sobra. Según la especificación de Active Directory, ese atributo vale el número más alto posible cuando la contraseña nunca vence, y cero cuando la persona debe cambiarla en el próximo inicio de sesión. Al convertir el primero en fecha, PowerShell 5.1 se detuvo en nuestra prueba con Hora del archivo Win32 no válida. Por su parte, el cero se convierte en el 31 de diciembre de 1600, una fecha que confunde cualquier informe.

8. Ver y exportar los miembros de un grupo

Get-ADGroupMember -Identity "GG-Contabilidad" -Recursive |
    Where-Object objectClass -eq "user" |
    Get-ADUser -Properties EmailAddress, Department |
    Select-Object Name, SamAccountName, EmailAddress, Department |
    Export-Csv -Path "C:\Informes\miembros-GG-Contabilidad.csv" -NoTypeInformation -Encoding UTF8 -Delimiter ';'
Add-ADGroupMember -Identity "GG-Contabilidad" -Members "ana.rojas", "jose.pena"

Aquí, -Recursive incluye a los miembros de los grupos anidados. Recuerde el límite de los Servicios web de Active Directory: con los valores de fábrica, Get-ADGroupMember entrega como máximo 5.000 miembros.

9. Inventario de equipos y equipos sin uso

Get-ADComputer -Filter * -Properties OperatingSystem | Group-Object OperatingSystem | Select-Object Count, Name
$limite = (Get-Date).AddDays(-104)
Get-ADComputer -Filter 'Enabled -eq $true' -Properties LastLogonDate, OperatingSystem | Where-Object { $_.LastLogonDate -and $_.LastLogonDate -lt $limite } | Select-Object Name, OperatingSystem, LastLogonDate

Por un lado, la primera línea cuenta los equipos por sistema operativo, útil para saber cuántos quedan con una versión sin soporte. Por otro, la segunda lista los que no se conectan al dominio desde hace más de tres meses. Antes de borrar uno, confirme que no está guardado en una bodega o de vacaciones con su dueño.

10. Crear unidades organizativas

Por su parte, las unidades organizativas ordenan el directorio y permiten aplicar directivas o delegar permisos por partes:

New-ADOrganizationalUnit -Name "Empresa" -Path "DC=corp,DC=example,DC=com"
"Usuarios", "Equipos", "Grupos", "Bajas" | ForEach-Object { New-ADOrganizationalUnit -Name $_ -Path "OU=Empresa,DC=corp,DC=example,DC=com" }
Get-ADOrganizationalUnit -Filter * | Select-Object Name, DistinguishedName

Cada unidad nueva nace protegida contra el borrado accidental, según la referencia de New-ADOrganizationalUnit. Si de verdad quiere borrar una, primero hay que quitarle la protección:

Set-ADOrganizationalUnit -Identity "OU=Bajas,OU=Empresa,DC=corp,DC=example,DC=com" -ProtectedFromAccidentalDeletion $false
Remove-ADOrganizationalUnit -Identity "OU=Bajas,OU=Empresa,DC=corp,DC=example,DC=com" -WhatIf

Ojo con -Recursive en Remove-ADOrganizationalUnit: borra también los objetos de dentro, incluso los que están protegidos.

11. Recuperar un usuario borrado

Get-ADOptionalFeature -Identity 'Recycle Bin Feature'
Get-ADObject -Filter 'SamAccountName -eq "luis.mora"' -IncludeDeletedObjects | Restore-ADObject

La recuperación necesita la papelera de reciclaje de Active Directory, que no viene activada. Según Microsoft, activarla es irreversible. Además, lo borrado antes de activarla ya no se recupera con ella. Por eso conviene activarla el primer día. Los pasos están en nuestra guía de Active Directory.

12. Revisar la salud del dominio

Get-ADDomainController -Filter * | Select-Object Name, Site, IPv4Address, OperatingSystem
Get-ADDomain | Select-Object PDCEmulator, RIDMaster, InfrastructureMaster
Get-ADForest | Select-Object SchemaMaster, DomainNamingMaster
Get-ADReplicationFailure -Target "dc-01"
Get-ADReplicationPartnerMetadata -Target "dc-01"

Estas cinco líneas muestran los controladores, quién tiene cada rol FSMO y si la replicación entre dc-01 y sus socios falla. Si Get-ADReplicationFailure no devuelve nada, no hay fallos registrados.

Errores frecuentes en Active Directory PowerShell y cómo resolverlos

Lo que pasaPor quéQué hacer
El término 'Get-ADUser' no se reconoce como nombre de un cmdlet…El módulo no está instaladoInstale RSAT en Windows 11 o la característica RSAT-AD-PowerShell en el servidor
Los comandos no encuentran ningún controladorEl equipo no llega a los Servicios web de Active Directory: puerto TCP 9389 cerrado, sin VPN o fuera del dominioRevise el firewall y la red; indique un controlador con -Server
El comando no encuentra a una persona que sí existeSe escribió mal el usuario, o la cuenta está en otro dominioUse el SamAccountName exacto o añada -Server con el dominio correcto
La cuenta creada no puede iniciar sesiónNew-ADUser sin -Enabled $true la crea deshabilitadaEjecute Enable-ADAccount o cree la cuenta con Enabled = $true
Remove-ADOrganizationalUnit se detiene con un errorLa unidad está protegida contra el borrado accidentalQuite la protección con Set-ADOrganizationalUnit si de verdad quiere borrarla
El CSV abre en Excel con signos rarosSe exportó sin la marca de UTF-8-Encoding UTF8 en 5.1 o -Encoding utf8BOM en 7
El CSV importado trae una sola columnaLa hoja usa punto y coma y el script no lo indicóAñada -Delimiter ';' a Import-Csv
Hora del archivo Win32 no válida.Se convirtió en fecha el valor de «la contraseña nunca vence»Excluya ese valor antes de convertir, como en el escenario 7
Get-ADGroupMember no trae a todos los miembros de un grupo muy grandeLos Servicios web de Active Directory entregan como máximo 5.000 de fábricaAjuste MaxGroupOrMemberEntries en cada controlador, como indica Microsoft

Recomendaciones para administrar Active Directory con PowerShell

Estas recomendaciones resumen lo que vimos en la referencia de Microsoft y en el equipo de prueba:

  1. Pruebe cada script con -WhatIf y sobre una unidad organizativa de prueba antes de usarlo en todo el dominio. Si necesita un laboratorio, puede montarlo en su equipo con Hyper-V.
  2. Limite cada consulta con -SearchBase y pida con -Properties solo las columnas que va a usar.
  3. No trabaje con una cuenta de administrador del dominio para las tareas diarias. Delegue en cada unidad organizativa solo los permisos que hacen falta.
  4. Nunca escriba contraseñas en un script. Use Read-Host -AsSecureString o Get-Credential.
  5. Exporte siempre con la marca de UTF-8 y con el separador que usarán quienes abran el archivo.
  6. Deje registro de lo que cambió: Start-Transcript guarda en un archivo todo lo que pasa en la sesión.
  7. Antes de una baja o de un cambio masivo, exporte el estado actual. Es su copia para deshacer.
  8. Active la papelera de reciclaje de Active Directory antes de necesitarla.
  9. Revise cada mes las cuentas inactivas, los equipos sin uso y las contraseñas que nunca vencen.
  10. Guarde sus scripts en un lugar con historial de versiones y con una explicación de qué hace cada uno.

Active Directory PowerShell y Microsoft 365

El módulo de Active Directory administra el dominio de la oficina, no la nube. Sin embargo, muchas empresas sincronizan las dos cosas con Microsoft Entra Connect. En ese caso, los cambios que hace con Active Directory PowerShell, como deshabilitar una cuenta, llegan a Microsoft 365 en el siguiente ciclo. Según Microsoft, el ciclo corre cada 30 minutos.

Si no puede esperar, en el servidor donde está instalado Entra Connect se lanza un ciclo a mano:

Start-ADSyncSyncCycle -PolicyType Delta

En cambio, las cuentas que solo existen en la nube se administran con Microsoft Graph PowerShell. Lo explicamos en nuestra guía de Microsoft 365 PowerShell, que además cuenta por qué ya no sirven los antiguos módulos de Azure AD.

Lo que no probamos

Una guía honesta dice dónde termina su laboratorio:

  • No nos conectamos a ningún dominio real. Validamos cada comando y cada parámetro contra la referencia oficial del módulo para Windows Server 2025, y la sintaxis de cada bloque con el analizador de PowerShell.
  • Por tanto, las salidas con datos reales no las vimos en pantalla. Los límites que citamos, como los 5.000 miembros o los 14 días de retraso, son los publicados por Microsoft.
  • Lo que no necesita un dominio sí lo medimos: la exportación a CSV, la apertura en Excel, el separador de lista, la conversión de fechas y los mensajes de error. Lo hicimos en Windows 11 en español, con Windows PowerShell 5.1, PowerShell 7.6.7 y Excel de Microsoft 365.
  • No probamos el módulo GroupPolicy ni la administración de directivas de grupo.

Cuándo conviene delegar la administración de Active Directory

Active Directory PowerShell resuelve en minutos lo que en la consola lleva días. Sin embargo, alguien tiene que revisar cada mes las cuentas inactivas, dar de baja a tiempo a quien se va y vigilar que los controladores repliquen.

En KHARONTE, ese trabajo forma parte de la gestión de usuarios y licencias de nuestra línea de gestión de plataformas. Los controladores de dominio y los servidores, por su parte, entran en nuestro servicio de infraestructura de TI. Cada solicitud, como un desbloqueo o una baja, entra por nuestra mesa de ayuda TI, queda registrada y se resuelve con su trazabilidad.

Si además quiere delegar el respaldo, el monitoreo y el soporte de los puestos de trabajo, todo eso entra en nuestros servicios administrados de TI. Puede ver el alcance completo en la página de servicios de TI para empresas.

Preguntas frecuentes sobre Active Directory PowerShell

¿Qué es Active Directory PowerShell?

Es el módulo ActiveDirectory de PowerShell, que administra usuarios, grupos, equipos y unidades organizativas de un dominio de Windows con comandos. La referencia de Windows Server 2025 documenta 151 cmdlets.

¿Cómo instalo el módulo de Active Directory en Windows 11?

Como administrador, ejecute Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0. Necesita Windows 11 Pro o Enterprise. En Windows Server, use Install-WindowsFeature -Name RSAT-AD-PowerShell.

¿Cómo exporto los usuarios de Active Directory a Excel?

Con Get-ADUser, Select-Object y Export-Csv. En Windows PowerShell 5.1 añada -NoTypeInformation -Encoding UTF8, y en PowerShell 7, -Encoding utf8BOM. Para equipos configurados para Colombia, añada también -Delimiter ';'.

¿Cómo desbloqueo un usuario en Active Directory con PowerShell?

Con Unlock-ADAccount -Identity seguido del nombre de usuario. Para ver todas las cuentas bloqueadas, use Search-ADAccount -LockedOut -UsersOnly.

¿Funciona Active Directory PowerShell en PowerShell 7?

Sí. Según Microsoft, el módulo es compatible de forma nativa con PowerShell 7 desde Windows 10 1809 y Windows Server 2019.

¿Sirve para administrar Microsoft 365?

No directamente. Administra el dominio local. Si la empresa sincroniza con Microsoft Entra Connect, los cambios llegan a Microsoft 365 en el siguiente ciclo. Las cuentas que solo existen en la nube se administran con Microsoft Graph PowerShell.

Hablemos de la TI de su empresa

Cuéntenos qué necesita su operación y le enviamos una propuesta por escrito. Cada línea del portafolio se contrata por separado.

Compartir este artículo

Últimas entradas

Escríbanos ahora