En este post veremos como poder alertar a los usuarios cuando su password de dominio expirará pronto, para ello crearemos un script en PowerShell.
Este script lo he divido en 3 funciones de las cuales explicaré cada una de ellas.
Send-Email Esta función básicamente recibe 3 paramentros, los cuales son: Nombre de usuario, correo de usuario y días restantes cuando el password expirará.
En este caso estoy usando correo sin autenticar, deben de tomar en cuenta que usar correos sin autenticar (No SSL y no password con puerto 25), quiere decir que solo se podrán enviar correos internos, si desean enviar correos fuera de su organización deben de usar el puerto 587, SSL activo e ingresar usuario y password, esto dependerá de sus requerimientos.
En la parte de los requerimientos del password les recomiendo advertir sobre las políticas que usan en su organización, aquí les dejo el link como configurar políticas de password.
Function Send-Mail() {
param($Name, $Email, $DaysToExpire)
$SmtpClient = New-Object system.net.mail.smtpClient
$MailMessage = New-Object system.net.mail.mailmessage
$mailmessage.From = "[email protected]"
$SmtpClient.Host = "outlook.mxlitpro.tk"
$SMTPClient.EnableSsl = $false
$SmtpClient.Port = '25'
$mailmessage.To.add($User.EmailAddress)
$mailmessage.Subject = "Your password will expire $DaysToExpire days"
$MailMessage.DeliveryNotificationOptions = ("onSuccess", "onFailure")
$MailMessage.Priority = "High"
$mailmessage.Body =
"Dear $Name,
Your Domain password will expire in $DaysToExpire days. Please change it as soon as possible.
To change your password, please follow the method below:
1. On your Windows computer
a. If you are not in the office, login and connect to VPN. (Your VPN Link Here!)
b. Log into your computer as usual and make sure you are connected to the internet.
c. Press Ctrl-Alt-Del and click on ""Change Password"".
d. Put your old password and set a new password. See the password requirements below.
e. Press OK to return to your desktop.
The new password must meet the minimum requirements set forth in our corporate policies including:
1. It must be at least 8 characters long.
2. It must contain at least one character from 3 of the 4 following groups of characters:
a. Uppercase letters (A-Z)
b. Lowercase letters (a-z)
c. Numbers (0-9)
d. Symbols (!@#$%^&*...)
3. It cannot match any of your past 24 passwords.
4. It cannot contain characters which match 3 or more consecutive characters of your username.
5. You cannot change your password more often than once in a 24 hour period.
If you have any questions please contact our Support team at [email protected] or call us, ext 1001
Thank you,
Mexicali IT Pro Helpdesk
"
$smtpclient.Send($mailmessage)
$SmtpClient.Dispose()
}
Get-Directory en está función solamente sirve para obtener el directorio donde se guardarán los logs.
Function Get-Directory {
$DirPath = "C:\Temp\PasswordExpiration"
$DirPathCheck = Test-Path -Path $DirPath
If (!($DirPathCheck)) {
Try {
New-Item -ItemType Directory $DirPath -Force
}
Catch {
$_ | Out-File ($DirPath + "\" + "Log.txt") -Append
}
}
return $DirPath
}
Get-User En está función se obtienen los usuarios que revisaremos para saber si su password expirará en los siguientes 7 días.
1.- La variable $ExpireInDays es la que se usará para saber cuantos días quedan para que expire el password.
2.- Aquí se llama la función Get-Directory para obtener el folder donde se guardarán los logs.
3.- Aquí se obtienen los usuarios.
4.- Se obtiene la cantidad máxima de días que dura un password.
5.- Se recorren todos los usuarios obtenidos en el punto 3.
6.- Se verifica que exista un correo en el usuario, en caso de que no exista se guardará un registro en el log.
7.- Se obtiene la ultima vez que el usuario cambio el password.
8.- Se obtienen los días que quedan para que el password expire.
9.- Si los días restantes es mayor a 0 y los días restantes es menor a los días de expiración se cumplirá la condición para enviar correo.
10.- En caso de que no se cumpla la condición anterior se guarda un log.
11.- En este punto se llama la función Send-Mail y se pasan las variables: Nombre, Correo y días restantes para el password.
Function Get-Users {
$Date = Get-Date
$ExpireInDays = 7
$DirPath = Get-Directory
"$Date - INFO: Getting users" | Out-File ($DirPath + "\" + "Log.txt") -Append
$Users = Get-ADUser -Properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress -Filter { (Enabled -eq 'True') -and (PasswordNeverExpires -eq 'False') } `
-SearchBase 'OU=Networkingzone_Users,DC=NETWORKINGZONE,DC=NET' | Where-Object { $_.PasswordExpired -eq $False }
$MaxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge
foreach ($User in $users) {
$Name = $User.NAME
Write-Host "Working on $Name..." -ForegroundColor White
Write-Host "Getting e-mail address for $Name..." -ForegroundColor Yellow
#$emailaddress = $User.EmailAddress
If (!($User.EmailAddress)) {
Write-Host "$Name has no email addresses!" -ForegroundColor Red
"$Date - WARNING: No email found for $Name" | Out-File ($DirPath + "\" + "Log.txt") -Append
}
else {
$PasswordSetDate = $User.PasswordLastSet
$PasswordPolicy = (Get-ADUserResultantPasswordPolicy $User)
if ($null -ne ($PasswordPolicy)) {
$MaxPasswordAge = ($PasswordPolicy).MaxPasswordAge
}
$Expiresoon = $PasswordSetDate + $MaxPasswordAge
$Today = (Get-Date)
$DaysToExpire = (New-TimeSpan -Start $Today -End $Expiresoon).Days
If (($DaysToExpire -ge "0") -and ($DaysToExpire -lt $ExpireInDays)) {
"$Date - INFO: Sending expiry notice email to $Name" | Out-File ($DirPath + "\" + "Log.txt") -Append
Write-Host "Sending Password expiry email to $name" -ForegroundColor Yellow
Write-Host "Sending E-mail to $User.EmailAddress..." -ForegroundColor Green
Try {
Send-Mail -Name $User.NAME -Email $User.EmailAddress -daystoexpire $DaysToExpire
}
Catch {
$_ | Out-File ($DirPath + "\" + "Log.txt") -Append
}
}
Else {
"$Date - INFO: Password for $Name not expiring for $DaysToExpire days" | Out-File ($DirPath + "\" + "Log.txt") -Append
Write-Host "Password for $Name does not expire for $DaysToExpire days" -ForegroundColor White
}
}
}
}
Cuando se cumple la condición en el punto 11, el usuario recibirá un correo indicando de que debe de realizar el cambio de password, (Para esta prueba cambie la variable $ExpireInDays )
Este es un ejemplo de los logs.
Solamente quedará pendiente de crear una tarea programada que se ejecute diariamente.