PowerShell: Notificación por correo electrónico a los usuarios del tiempo restante hasta la caducidad de su contraseña de dominio

En esta entrada voy a explicaros como podemos notificar por correo electrónico a los usuarios, con una serie de días de antelación, de la caducidad de sus contraseñas de dominio.

Para ello simplemente tendréis que utilizar un script de PowerShell y configurar una tarea programada de Windows para que se ejecute de forma periódica.

Configuración Script

En primer lugar abriremos Windows PowerShell ISE o en su defecto cualquier editor de texto que tengamos, copiaremos el siguiente script y modificaremos la configuración para adaptarla a nuestro entorno.

#Dirección del servidor SMTP mediante el que enviaremos los correos electrónicos. En este ejemplo utilizo los servidores de Office 365.
$smtpServer="vitro-bio.mail.protection.outlook.com"
#Dirección del remitente
$from = "[email protected]"
$encoding=[System.Text.Encoding]::UTF8
#Mediante este parámetro filtraremos los usuarios a los que queremos realizar la notificación. Sólo se notificarán a los usuarios que les queden los días que hayamos definido en este parámetro. En este ejemplo 15 días o menos.
$expireindays = 15

Import-Module ActiveDirectory
#Obtenemos los usuarios a los que se notificará.
#En el ejemplo serán aquellos usuarios que se encuentren en la OU Internos de nuestro dominio, estén activos, no tengan marcado el check de que la contraseña nunca expira y la contraseña no haya expirado ya.
#Estos filtros podeis modificarlos para adaptarlos a vuestras necesidades
$users = get-aduser -filter {EmailAddress -like "*"} -SearchBase "ou=Internos,dc=dominio,dc=com" -properties * |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false }

foreach ($user in $users)
{
  $Name = (Get-ADUser $user | foreach { $_.Name})
  $emailaddress = $user.emailaddress
  $passwordSetDate = (get-aduser $user -properties * | foreach { $_.PasswordLastSet })
  $maxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge
  $expireson = $passwordsetdate + $maxPasswordAge
  $today = (get-date)
  $daystoexpire = (New-TimeSpan -Start $today -End $Expireson).Days
  #En esta variable definiremos el asunto del correo
  $subject="Correo informativo: Caducidad de Contraseña en $daystoExpire días"
  #Mediante esta variable definiremos el cuerpo del correo que enviaremos.
  #El texto será en formato html por lo que podremos diseñarlo a nuestro gusto utilizando etiquetas de HTML
  $body ="
  <p>Le quedan $daystoexpire días para que su contraseña de acceso al dominio caduque. Por favor modifiquela a la mayor brevedad posible.</p>"

  if (($daystoexpire -lt $expireindays) -and ($daystoexpire -gt 0))
  {
    Send-Mailmessage -smtpServer $smtpServer -from $from -to $emailaddress -subject $subject -body $body -bodyasHTML -priority High -Encoding $encoding     
  }    
}

Una vez hechas las modificaciones necesarias guardaremos el script en la ubicación que deseemos para utilizarlo en el siguiente paso.

Configuración tarea programada

Para que se ejecute el script crearemos una tarea programada en nuestro servidor controlador de dominio para en función de la periodicidad que definamos se envíen las notificaciones a los usuarios.

Para el ejemplo yo he creado una tarea que se ejecuta de forma diaria por las mañanas para informar a aquellos usuarios que le quedan 15 días o menos para la expiración de la contraseña.

Y listo con estos sencillos pasos los usuarios recibirán una notificación con suficiente antelación que les permita cambiar su contraseña de dominio a tiempo.

Espero os haya servido de utilidad.

2 comentarios en “PowerShell: Notificación por correo electrónico a los usuarios del tiempo restante hasta la caducidad de su contraseña de dominio”

  1. Gracias Sergio. Voy a tratar de implantarlo en mi AD, que usamos O365 y muchos ordenadores no estan unidos al dominio. Gran aporte.

    Responder

Deja un comentario