Notificación de cambio de contraseña cuando la contraseña de un usuario de AD está a punto de caducar

En este artículo, mostraremos cómo averiguar cuándo caduca una contraseña de una cuenta de usuario de Active Directory usando PowerShell, cómo configurar una contraseña para que nunca caduque (PasswordNeverExpires = True) y notificar a los usuarios con anticipación para que cambien su contraseña.

Si la contraseña de un usuario en un dominio ha caducado, la cuenta no está bloqueada, pero no se puede utilizar para acceder a los recursos del dominio hasta que el usuario cambie la contraseña caducada por una nueva. La mayoría de las veces, los usuarios remotos se encuentran con problemas con contraseñas caducadas, ya que no pueden cambiar sus contraseñas con herramientas estándar.

El límite de tiempo de caducidad de la contraseña de un usuario en un dominio, la frecuencia con la que debe cambiarse (antigüedad máxima de la contraseña) y los requisitos de complejidad se establecen en la política de contraseñas de dominio de AD. Estos parámetros se establecen en la Política de dominio predeterminada o en la Política de contraseñas específicas.

Puede obtener la configuración actual de la política de caducidad de la contraseña en un dominio mediante este comando de PowerShell:

Get-ADDefaultDomainPasswordPolicy|select MaxPasswordAge

En nuestro ejemplo, la antigüedad máxima de la contraseña de usuario en el dominio es de 60 días.

powershell: Get-ADDefaultDomainPasswordPolicy | seleccione MaxPasswordAge

¿Cómo obtener una fecha de vencimiento de la contraseña de usuario en Active Directory?

Puede ver la antigüedad de la contraseña y la fecha en la que se cambió la última vez en el símbolo del sistema mediante el Usuario de red mando:

net user jsmith /domain

dominio de usuario neto: obtenga la última contraseña establecida y los valores de fecha de vencimiento

Puedes encontrar la información que necesitas en estas líneas:

  • Última configuración de contraseña: 9/9/2020 9:23:59 a. M.
  • Caduca la contraseña – 7/1/2021 9:23:59 a.m.
  • Contraseña cambiable – 10/09/2020 9:23:59 a.m.
Puede obtener la fecha de vencimiento de la contraseña para cualquier usuario. Para hacerlo, no necesita privilegios de administrador o privilegios delegados en el contenedor de AD con cuentas de usuario.

Para ver la configuración de las cuentas AD, usaremos un módulo especial de PowerShell para Active Directory que le permite obtener valores de diferentes atributos de objetos AD (vea cómo instalar e importar el módulo AD PowerShell en Windows 10 y Windows Server 2012 R2 / 2016 ).

Con el cmdlet Get-ADUser, puede ver la fecha en que se cambió la contraseña del usuario la última vez y verificar si la opción PasswordNeverExpires está configurada:

get-aduser jsmith -properties PasswordLastSet, PasswordNeverExpires, PasswordExpired |ft Name, PasswordLastSet, PasswordNeverExpires,PasswordExpired

powershell: get-aduser PasswordLastSet, PasswordNeverExpires, PasswordExpired

  • ContraseñaÚltimo es la fecha y hora del último cambio de contraseña;
  • La contraseña nunca expira devoluciones Cierto si una contraseña de usuario nunca caduca;
  • La contraseña expiró – si la contraseña de un usuario ha expirado, vuelve Cierto, si la contraseña no está caducada, vuelve Falso.

Puede comprobar la hora del último cambio de contraseña en el complemento gráfico MMC Usuarios y equipos de Active Directory (dsa.msc). Para hacerlo, abra las propiedades del usuario, vaya a la pestaña Editor de atributos y verifique el valor del pwdLastSet atributo.

Pero como puede ver, el complemento MMC solo muestra la hora en que se cambió la contraseña. No está claro cuándo caduca la contraseña.

Valor de pwdlastset en las propiedades del usuario ADUC

Para obtener la fecha de caducidad de la contraseña en lugar de la hora en que se cambió por última vez, utilice un atributo de AD construido especial: msDS-UserPasswordExpiryTimeComputed. El valor msDS-UserPasswordExpiryTimeComputed se calcula automáticamente en función de la fecha del último cambio de contraseña y la política de contraseña del dominio.

los UserPasswordExpiryTimeComputed El parámetro devuelve la fecha en el formato TimeStamp, así que utilizo el FromFileTime función para convertirlo a valor legible por humanos:

Get-ADUser -Identity jsmith -Properties msDS-UserPasswordExpiryTimeComputed | select-object @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") }}

Por lo tanto, obtuvimos una fecha de vencimiento de la contraseña de usuario.

Get-ADUser msDS-UserPasswordExpiryTimeComputed

Si el valor de msDS-UserPasswordExpiryTimeComputed es 0, significa que pwdLastSet está vacío (nulo) o es igual a 0 (la contraseña nunca se ha cambiado).

Para obtener las fechas de caducidad de la contraseña para todos los usuarios del contenedor específico (OU) en AD, puede usar el siguiente script de PowerShell:

$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, CannotChangePassword
$Users | select Name, @{Name="ExpirationDate";Expression= {[datetime]::FromFileTime ($_."msDS-UserPasswordExpiryTimeComputed")}}, PasswordLastSet

Da como resultado una tabla con la lista de usuarios activos, fecha de vencimiento y hora del último cambio de contraseña.

Cómo obtener la fecha de vencimiento de la contraseña de los usuarios de AD usando powershell

Puede mostrar solo la lista de usuarios con contraseñas caducadas:

$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, PasswordLastSet, CannotChangePassword
foreach($user in $Users){
if( [datetime]::FromFileTime($user."msDS-UserPasswordExpiryTimeComputed") -lt (Get-Date)) {
$user.Name
}
}

¿Cómo configurar la contraseña de usuario de AD para que nunca caduque?

Si desea establecer una contraseña permanente para una cuenta, marque la La contraseña nunca expira opción en las propiedades del usuario en AD (es uno de los valores de bit del atributo UserAccoutControl).

ADUC: opción del usuario "La contraseña nunca expira"

O puede habilitar esta opción con PowerShell configurando el atributo de usuario:

Get-ADUser jsmith | Set-ADUser -PasswordNeverExpires:$True

Puede configurar la opción La contraseña nunca caduca a la vez para varios usuarios de una lista en un archivo de texto:

$users=Get-Content "C:PSusers_password_never_expire.txt"
Foreach ($user in $users) {
Set-ADUser $user -PasswordNeverExpires:$True
}

Puede mostrar la lista de todos los usuarios con la opción de cambio de contraseña regular deshabilitada:

Get-ADUser -filter * -properties Name, PasswordNeverExpires | where {$_.passwordNeverExpires -eq "true" } |  Select-Object DistinguishedName,Name,Enabled |ft

Política de notificación de vencimiento de contraseña de Active Directory

Windows tiene un parámetro de Política de grupo especial que permite notificar a los usuarios que deben cambiar sus contraseñas.

La política se llama Inicio de sesión interactivo: pida al usuario que cambie la contraseña antes de la expiración y se encuentra en la sección GPO: Configuración del equipo -> Políticas -> Configuración de Windows -> Configuración de seguridad -> Políticas locales -> Opciones de seguridad.

De forma predeterminada, la política está habilitada en la configuración local de Windows y las notificaciones comienzan a aparecer 5 días antes de que expire una contraseña. Puede cambiar la cantidad de días que los usuarios verán una notificación de cambio de contraseña.

Parámetro de directiva de grupo: Inicio de sesión interactivo: solicitar al usuario que cambie la contraseña antes de la expiración

Después de habilitar esta política, si la contraseña del usuario caduca, aparecerá una notificación para cambiar una contraseña en la bandeja cada vez que un usuario inicie sesión.

Consider changing your password
Your password will expire in xx days.

Considere cambiar la notificación de su contraseña en Windows 10

También puede usar un simple script de PowerShell que muestra automáticamente una ventana de diálogo con el mensaje para cambiar una contraseña si caduca en menos de 5 días:

Add-Type -AssemblyName PresentationFramework
$curruser= Get-ADUser -Identity $env:username -Properties 'msDS-UserPasswordExpiryTimeComputed','PasswordNeverExpires'
if ( -not $curruser.'PasswordNeverExpires') {
$timediff=(new-timespan -start (get-date) -end ([datetime]::FromFileTime($curruser."msDS-UserPasswordExpiryTimeComputed"))).Days
if ($timediff -lt 5) {
$msgBoxInput = [System.Windows.MessageBox]::Show("Your password expires in "+ $timediff + " days!`nDo you want to change it now?","Important!","YesNo","Warning")
switch ($msgBoxInput) {
'Yes' {
cmd /c "explorer shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}"
}
'No' { }
}
}
}

Si un usuario hace clic en SÍ, aparecerá una ventana de seguridad de Windows que verá después de presionar Ctrl+Alt+Del o Ctrl+Alt+End (en caso de una conexión RDP / RDS).

recordatorio de caducidad de contraseña usando PowerShell

Habilite el inicio automático del script PS o ejecútelo como un script de inicio de sesión de GPO.

Notificación por correo electrónico de vencimiento de la contraseña a través de Powershell

Si desea notificar a los usuarios sobre la caducidad de su contraseña por correo electrónico, puede usar este script de PowerShell:

$Sender = "[email protected]"
$Subject="Important! Your password expires soon!"
$BodyTxt1 = 'Your password for'
$BodyTxt2 = 'expires in '
$BodyTxt3 = 'days. Remember to change your password in advance. If you have other questions, contact the HelpDesk.'
$smtpserver ="smtp.woshub.com"
$warnDays = (get-date).adddays(7)
$2Day = get-date
$Users = Get-ADUser -SearchBase 'OU=Users,OU=NewYork,DC=woshub,DC=com' -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -Properties msDS-UserPasswordExpiryTimeComputed, EmailAddress, Name | select Name, @{Name ="ExpirationDate";Expression= {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}, EmailAddress
foreach ($user in $users) {
if (($user.ExpirationDate -lt $warnDays) -and ($2Day -lt $user.ExpirationDate) ) {
$lastdays = ( $user.ExpirationDate -$2Day).days
$EmailBody = $BodyTxt1, $user.name, $BodyTxt2, $lastdays, $BodyTxt3 -join ' '
Send-MailMessage -To $user.EmailAddress -From $Sender -SmtpServer $smtpserver -Subject $Subject -Body $EmailBody
}
}

La secuencia de comandos verifica a todos los usuarios de dominio activos cuyas contraseñas están a punto de caducar. En 7 días antes de que expire la contraseña, un usuario comienza a recibir correos electrónicos enviados a la dirección especificada en AD. Los correos electrónicos se envían hasta que la contraseña se cambia o caduca.

Ejecute este script de PowerShell con regularidad en cualquier computadora / servidor de su dominio (es más fácil hacerlo con el Programador de tareas). Por supuesto, tendrá que agregar la dirección IP del host que envía correos electrónicos a la lista de remitentes permitidos (puede enviar correos electrónicos sin autenticación) en su servidor SMTP.

Artículos Interesantes