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.
| Tarea | Consola de Active Directory | Active Directory PowerShell |
|---|---|---|
| Listar todos los usuarios con su cargo y su área | Copiar columnas a mano | Un informe en un archivo CSV |
| Crear 15 cuentas nuevas | Quince asistentes, uno por persona | Un ciclo sobre la hoja de altas |
| Encontrar las cuentas bloqueadas | Abrir cada cuenta | Una sola orden: Search-ADAccount -LockedOut |
| Saber quién no inicia sesión desde hace 90 días | No lo junta en una vista | Un filtro sobre la fecha del último inicio de sesión |
| Repetir la misma revisión el mes siguiente | Volver a hacer cada clic | Ejecutar 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:
- Escriba el filtro entre comillas simples y los textos internos entre comillas dobles:
-Filter 'Department -eq "Contabilidad"'. - El único comodín que admite es el asterisco, y solo con
-like. El signo de interrogación de PowerShell no funciona. - 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:
| Para | Comando | Qué hace |
|---|---|---|
| Usuarios | Get-ADUser | Consulta una cuenta o busca varias |
| Usuarios | New-ADUser | Crea una cuenta |
| Usuarios | Set-ADUser | Cambia datos de una cuenta: cargo, área, teléfono |
| Usuarios | Remove-ADUser | Borra una cuenta |
| Cuentas | Enable-ADAccount y Disable-ADAccount | Habilita o deshabilita una cuenta |
| Cuentas | Unlock-ADAccount | Desbloquea una cuenta |
| Cuentas | Set-ADAccountPassword | Cambia o restablece una contraseña |
| Cuentas | Search-ADAccount | Busca cuentas bloqueadas, inactivas, vencidas o deshabilitadas |
| Grupos | Get-ADGroup y New-ADGroup | Consulta o crea grupos |
| Grupos | Get-ADGroupMember | Lista los miembros de un grupo |
| Grupos | Add-ADGroupMember y Remove-ADGroupMember | Agrega o quita miembros |
| Grupos | Get-ADPrincipalGroupMembership | Lista los grupos de una cuenta |
| Equipos | Get-ADComputer | Consulta los equipos del dominio |
| Estructura | Get-ADOrganizationalUnit y New-ADOrganizationalUnit | Consulta o crea unidades organizativas |
| Estructura | Move-ADObject | Mueve un objeto a otra unidad organizativa |
| Objetos | Get-ADObject y Restore-ADObject | Busca cualquier objeto y recupera los borrados |
| Contraseñas | Get-ADDefaultDomainPasswordPolicy | Muestra la directiva de contraseñas del dominio |
| Dominio | Get-ADDomain, Get-ADForest y Get-ADDomainController | Muestra el dominio, el bosque y los controladores |
| Replicación | Get-ADReplicationFailure | Muestra 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 archivo | Qué mostró Excel en la primera fila de datos |
|---|---|---|
| PowerShell 5.1, sin opciones | Una primera línea #TYPE System.Management.Automation.PSCustomObject | Esa línea en la celda A1, y los títulos en la fila 2 |
PowerShell 5.1 con -NoTypeInformation | Las tildes y la eñe cambiadas por signos de interrogación | Jos? Pe?a: el dato se perdió en el archivo |
PowerShell 5.1 con -Encoding UTF8 | Texto completo, con la marca de UTF-8 al inicio | José Peña, correcto |
| PowerShell 7, sin opciones | Texto completo, pero sin la marca de UTF-8 | José Peña |
PowerShell 7 con -Encoding utf8BOM | Texto completo, con la marca de UTF-8 | José 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 deNew-ADUser. - El formato de la hoja importa. Guardamos la misma hoja desde Excel en dos formatos. Con el formato «CSV» a secas,
Import-CsvleyóJos� Pe�aen PowerShell 5.1 y en 7. En cambio, con «CSV UTF-8», leyóJosé Peñaen los dos. - El separador también. Si la hoja usa punto y coma y el script no lo dice,
Import-Csvlee una sola columna llamadaNombre;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 de | La cuenta pudo usarse hace solo | Para garantizar esos días, pida |
|---|---|---|
| 30 días | 16 días | 44 días |
| 60 días | 46 días | 74 días |
| 90 días | 76 días | 104 días |
| 180 días | 166 días | 194 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 pasa | Por qué | Qué hacer |
|---|---|---|
El término 'Get-ADUser' no se reconoce como nombre de un cmdlet… | El módulo no está instalado | Instale RSAT en Windows 11 o la característica RSAT-AD-PowerShell en el servidor |
| Los comandos no encuentran ningún controlador | El equipo no llega a los Servicios web de Active Directory: puerto TCP 9389 cerrado, sin VPN o fuera del dominio | Revise el firewall y la red; indique un controlador con -Server |
| El comando no encuentra a una persona que sí existe | Se escribió mal el usuario, o la cuenta está en otro dominio | Use el SamAccountName exacto o añada -Server con el dominio correcto |
| La cuenta creada no puede iniciar sesión | New-ADUser sin -Enabled $true la crea deshabilitada | Ejecute Enable-ADAccount o cree la cuenta con Enabled = $true |
Remove-ADOrganizationalUnit se detiene con un error | La unidad está protegida contra el borrado accidental | Quite la protección con Set-ADOrganizationalUnit si de verdad quiere borrarla |
| El CSV abre en Excel con signos raros | Se exportó sin la marca de UTF-8 | -Encoding UTF8 en 5.1 o -Encoding utf8BOM en 7 |
| El CSV importado trae una sola columna | La 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 grande | Los Servicios web de Active Directory entregan como máximo 5.000 de fábrica | Ajuste 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:
- Pruebe cada script con
-WhatIfy 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. - Limite cada consulta con
-SearchBasey pida con-Propertiessolo las columnas que va a usar. - No trabaje con una cuenta de administrador del dominio para las tareas diarias. Delegue en cada unidad organizativa solo los permisos que hacen falta.
- Nunca escriba contraseñas en un script. Use
Read-Host -AsSecureStringoGet-Credential. - Exporte siempre con la marca de UTF-8 y con el separador que usarán quienes abran el archivo.
- Deje registro de lo que cambió:
Start-Transcriptguarda en un archivo todo lo que pasa en la sesión. - Antes de una baja o de un cambio masivo, exporte el estado actual. Es su copia para deshacer.
- Active la papelera de reciclaje de Active Directory antes de necesitarla.
- Revise cada mes las cuentas inactivas, los equipos sin uso y las contraseñas que nunca vencen.
- 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
GroupPolicyni 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.




