Script ps1 en PowerShell que muestra listado (nombre de usuario y email) de los usuarios a los que les va a caducar la contraseña próximamente en un dominio LDAP de Microsoft Active Directory (Directorio Activo). Ejemplos de algunos filtros como usuarios con contraseña caducada, usuarios inactivos (deshabilitados), usuarios cuya contraseña nunca expira, etc.
- Requisitos para ejecutar script ps1 PowerShell que muestra usuarios con contraseña próxima a caducar.
- Script ps1 PowerShell que muestra listado de usuarios que tienen la contraseña a punto de caducar.
- Otros filtros para mostrar usuarios de LDAP Active Directory en PowerShell.
- Activar ejecución de script ps1 en PowerShell.
- Consultar desde PowerShell la política de caducidad de contraseñas del dominio Active Directoy.
Requisitos para ejecutar script ps1 PowerShell que muestra usuarios con contraseña próxima a caducar
Necesitaremos tener instalado el módulo de Active Directory para PowerShell en el equipo, como indicamos en el siguiente artículo:
También necesitaremos disponer de un dominio en nuestra organización, con Windows Server 2008 en adelante (2012, 2016, 2019), un Directorio Activo (Active Directory), el LDAP de Microsoft. En los siguientes enlaces explicamos cómo montar un servidor de Directorio Activo:
- Servicios de dominio de Active Directory Windows Server 2012 controlador dominio.
- Instalar Active Directory, promocionar controlador dominio, Windows Server 2008.
Script ps1 PowerShell que muestra listado de usuarios que tienen la contraseña a punto de caducar
A continuación mostramos el código fuente ps1 PowerShell que muestra los usuarios (nombre de usuario y email) del dominio LDAP Active Directory del equipo en el que se ejecuta, que tienen la contraseña a punto de caducar. Se puede establecer el número de días máximo que le queda a la contraseña por caducar cambiando la variable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$diasMaximo = 15 Import-Module ActiveDirectory #Filtrar usuarios que estén habilitados y la contraseña esté a punto de caducar (máximo de días $diasMaximo) #Filtrar usuarios que se encuentren en la Unidad Organizativa indicada, estén activos, #no tengan marcado el check de que la contraseña nunca expira #y la contraseña no haya expirado ya $usuariosLDAP = get-aduser -filter * -SearchBase "dc=proyectoa,dc=com" -properties * |where {$_.Enabled -eq $true} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false } $fechaActual = (get-date) $numUsuariosCaduca = 0 foreach ($user in $usuariosLDAP) { $nombreUsuario = (Get-ADUser $user | foreach { $_.Name}) $emailUsuario = $user.emailaddress $fechaUltimoCambio = (get-aduser $user -properties * | foreach { $_.PasswordLastSet }) $tiempoMaximoContrasena = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge $fechaExpiracionContrasena = $fechaUltimoCambio + $tiempoMaximoContrasena $expiraContrasenaDias = (New-TimeSpan -Start $fechaActual -End $fechaExpiracionContrasena).Days $mensaje = "La contraseña caduca en $expiraContrasenaDias días" #Mostramos por consola solo los que la contraseña esté próxima a expirar ($diasMaximo) if (($expiraContrasenaDias -lt $diasMaximo) -and ($expiraContrasenaDias -gt 0)) { Write-Output ($nombreUsuario + " [" + $emailUsuario + "] -> " + $mensaje) $numUsuariosCaduca = $numUsuariosCaduca + 1 } } Write-Output ("Número usuarios totales: " + $usuariosLDAP.Count) Write-Output ("Número usuarios caduca contraseña: " + $numUsuariosCaduca) |
Cambiaremos los datos variables del script anterior para adaptarlo a nuestra organización:
- $diasMaximo: número máximo de días de caducidad de contraseña a partir del cual se mostrarán los usuarios.
- uo=Facturacion: filtrar solo los usuarios de la unidad organizativa «Facturacion». Podremos cambiar el nombre, como es lógico, por otra unidad organizativa de nuestro dominio, o bien quitar «uo=Facturacion» para obtener todos los usuarios del dominio.
- dc=proyectoa,dc=com: el nombre del dominio, cambiaremos «proyectoa» y «com» por el nombre de nuestro dominio.
Podremos cambiar, en general, todo el filtro de la línea $usuariosLDAP = para mostrar los usuarios que queramos. En nuestro caso hemos filtrado por unidad organizativa y, además, que estén activos, que no les haya caducado la contraseña ya y que tengan desmarcada la opción de «La contraseña nunca expira».
Guardaremos el código PowerShell anterior en un fichero, con extensión .ps1:
Antes de ejecutar el scritp ps1 nos aseguraremos de que tenemos permisos, como indicamos aquí.
Para ejecutarlo será suficiente con añadir un punto y una contrabarra delante del nombre del fichero, en PowerShell. Puede que necesitemos ejecutar la consola PowerShell con un usuario con privilegios suficientes del dominio, al menos, para obtener usuarios:
Otros filtros para mostrar usuarios de LDAP Active Directory en PowerShell
Por supuesto, podemos hacer cualquier otro filtro que nos muestre la información que deseemos. Por ejemplo, para mostrar los usuarios que tienen marcada la opción de que la contraseña nunca expira, los usuarios que tienen la contraseña caducada, los usuarios inactivos (deshabilitados), etc.
Usuarios del dominio Active Directory cuya contraseña nunca expira
Para mostrar los usuarios del dominio Active Directory que tienen marcada la opción de que la contraseña nunca expira, podemos usar:
1 2 3 4 5 6 7 8 9 10 |
Import-Module ActiveDirectory $usuariosLDAP = get-aduser -filter * -SearchBase "dc=proyectoa,dc=com" -properties Enabled, PasswordNeverExpires, Name | where {$_.Enabled -eq $true} | where { $_.PasswordNeverExpires -eq $true } foreach ($user in $usuariosLDAP) { $nombreUsuario = $user.Name Write-Output ($nombreUsuario -> La contraseña nunca expira") } Write-Output ("Numero usuarios contraseña nunca expira: " + $usuariosLDAP.Count) |
Y, por supuesto, podemos mostrar los campos que queramos del objeto filtrado, en este caso de los usuarios, como el Nombre Distinguido (DistinguishedName):
1 2 3 4 5 6 7 8 9 10 11 12 |
Import-Module ActiveDirectory $usuariosLDAP = get-aduser -filter * -SearchBase "dc=proyectoa,dc=com" -properties Enabled, PasswordNeverExpires, DistinguishedName, Name | where {$_.Enabled -eq $true} | where { $_.PasswordNeverExpires -eq $true } foreach ($user in $usuariosLDAP) { #$nombreUsuario = (Get-ADUser $user | foreach { $_.Name}) $nombreUsuario = $user.Name $dn = $user.DistinguishedName Write-Output ($nombreUsuario + "[" + $dn + "] -> La contraseña nunca expira") } Write-Output ("Numero usuarios contraseña nunca expira: " + $usuariosLDAP.Count) |
Usuarios del dominio Active Directory que tienen la contraseña caducada
Otro ejemplo, para mostrar los usuarios que tienen la contraseña caducada, mostrando por consola el nombre de usuario, el nombre distinguido (DN o Distinguished Name) y la fecha en la que se cambió por última vez la contraseña:
1 2 3 4 5 6 7 8 9 10 11 12 |
Import-Module ActiveDirectory $usuariosLDAP = get-aduser -filter * -SearchBase "dc=proyectoa,dc=com" -properties PasswordLastSet, PasswordExpired, PasswordNeverExpires, DistinguishedName, Enabled | where {$_.Enabled -eq $true} | where { $_.PasswordNeverExpires -eq $false } | where { $_.PasswordExpired -eq $true } foreach ($user in $usuariosLDAP) { $nombreUsuario = (Get-ADUser $user | foreach { $_.Name}) $dn = $user.DistinguishedName $ultimoCambio = $user.PasswordLastSet Write-Output ($nombreUsuario + " [" + $dn + "]`r`n -> Expirada la contraseña. Fecha último cambio: " + $ultimoCambio + "`r`n") } Write-Output ("Número usuarios contraseña caducada: " + $usuariosLDAP.Count) |
Usuarios del dominio Active Directory inactivo (deshabilitados)
Para mostrar los usuarios del dominio Directorio Activo (LDAP Active Directory) que están deshabilitados (inactivos), podremos usar el script ps1 PowerShell:
1 2 3 4 5 6 7 8 9 10 11 12 |
Import-Module ActiveDirectory $usuariosLDAP = get-aduser -filter * -SearchBase "dc=proyectoa,dc=com" -properties Enabled, DistinguishedName, Name | where {$_.Enabled -eq $false} foreach ($user in $usuariosLDAP) { #$nombreUsuario = (Get-ADUser $user | foreach { $_.Name}) $nombreUsuario = $user.Name $dn = $user.DistinguishedName Write-Output ($nombreUsuario + "[" + $dn + "] -> Deshabilitado") } Write-Output ("Numero usuarios deshabilitados: " + $usuariosLDAP.Count) |
Activar ejecución de script ps1 en PowerShell
Si al ejecutar el script ps1 en PowerShell aparece este error:
.\caducidad_contraseña.ps1 : File C:\Users\alonso\Desktop\script\caducidad_contraseña.ps1
cannot be loaded because running scripts is disabled on this system. For more information, see
about_Execution_Policies at http://go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1.\usuarios_contraseña_nunca_expira.ps1
CategoryInfo : SecurityError: (:) [], PSSecurityException
FullyQualifiedErrorId : UnauthorizedAccess
Es debido a que tenemos restringido, por directiva de seguridad, la ejecución de scripts PowerShell, para activarla ejecutaremos en la propia consola de PowerShell (accediendo como administradores):
1 |
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser |
En el caso anterior, habilitaremos la ejecución de scripts ps1 PowerShell para el usuario actual. A partir de este momento podremos ejecutar script ps1.
Consultar desde PowerShell la política de caducidad de contraseñas del dominio Active Directoy
Para obtener información de las políticas de seguridad aplicadas a las contraseñas (caducidad, tamaño mínimo, caché de guardado de contraseñas, etc.) podemos usar el comando PowerShell:
1 |
Get-ADDefaultDomainPasswordPolicy |
Nos devolverá datos tan interesantes como:
- ComplexityEnabled : True
- DistinguishedName : DC=proyectoa,DC=com
- LockoutDuration : 00:30:00
- LockoutObservationWindow : 00:30:00
- LockoutThreshold : 0
- MaxPasswordAge : 180.00:00:00
- MinPasswordAge : 00:00:00
- MinPasswordLength : 4
- objectClass : {domainDNS}
- objectGuid : a123456-abcd-abcd-1234-aaddffggh
- PasswordHistoryCount : 1
- ReversibleEncryptionEnabled : False
Por ejemplo, la propieadad MaxPasswordAge la usamos en el script anterior porque devuelve el número de días (180 en ese caso) de caducidad de las contraseñas.