La gestión de las contraseñas es siempre un dolor de cabeza para los administradores de sistemas. No solo las políticas si no sobretodo el hecho de educar a los usuarios para que hagan un buen uso.
Hoy solo quiero publicar una pequeña servicio que añadimos no hace mucho que envía un email a cada usuarios cuando su contraseña esta a punto de caducar. Es cierto que la mayoría de servicios ya tienen implementado un sistema de recordatorios mediante popups o advertencias, pero por norma general estas avisos suelen ser ignorados. En cambio, la gente sí que hace caso al email, y aunque parezca una tontería, estas notificaciones han reducido significativamente el número de tickets abiertos por caducidad de contraseña.
Para enviar estas notificaciones, busque en la galeria de scripts de microsoft y encontré uno de un tal RoberPearman que encaja como anillo al dedo con lo que necesitábamos. Sobre este script, solo he tenido que añadir la posibilidad de enviar emails a través de Office 365, que requiere autenticación y cifrado SSL.
El script permite:
- configurar el servidor y la cuenta de envío
- el número de días en que caducará la contraseña
- personalizar el asunto y el mensaje del email. El cuerpo del mensaje puede ser en HTML.
Requiere:
- El modulo de Active Directory de Powershell
Sin más el enlace para descargar el script y el código:
https://gallery.technet.microsoft.com/Password-Expire-Office-365-4e0b0459
################################################################################################################### Version 1.0 September 2016# Fernando Pérez# Based on Robert Pearman (WSSMB MVP)## Script to Automated Email using Office 365 account to remind users Passwords Expiracy.# Office 365 require SSL# Requires: Windows PowerShell Module for Active Directory##################################################################################################################### Please Configure the following variables....$smtpServer="smtp.office365.com" # Office 365 official smtp server$expireindays = 10 # number of days for password to expire$from = "Your email address <youremail@domain.com>" # email from$logging = "Enabled" # Set to Disabled to Disable Logging$logFile = "c:\Scripts\PasswordChangeNotification.csv" # ie. c:\Scripts\PasswordChangeNotification.csv$testing = "Disabled" # Set to Disabled to Email Users$testRecipient = "yourtestrecipient@domain.com"$date = Get-Date -format ddMMyyyy##################################################################################################################### Add EMAIL FunctionFunction EMAIL{Param($emailSmtpServer = $smtpServer, #change to your SMTP server$emailSmtpServerPort = 587,$emailSmtpUser = "username@domain.com", #Email account you want to send from$emailSmtpPass = "passsword", #Password for Send from email account$emailFrom = "emailfromaddress@domain.com", #Email account you want to send from$emailTo,$emailAttachment,$emailSubject,$emailBody)Process{$emailMessage = New-Object System.Net.Mail.MailMessage( $emailFrom , $emailTo )$emailMessage.Subject = $emailSubject$emailMessage.IsBodyHtml = $true$emailMessage.Priority = [System.Net.Mail.MailPriority]::High$emailMessage.Body = $emailBody$SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort )$SMTPClient.EnableSsl = $true$SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );$SMTPClient.Send( $emailMessage )}}# Check Logging Settingsif (($logging) -eq "Enabled"){# Test Log File Path$logfilePath = (Test-Path $logFile)if (($logFilePath) -ne "True"){# Create CSV File and HeadersNew-Item $logfile -ItemType FileAdd-Content $logfile "Date,Name,EmailAddress,DaystoExpire,ExpiresOn"}} # End Logging Check# Get Users From AD who are Enabled, Passwords Expire and are Not Currently ExpiredImport-Module ActiveDirectory$users = get-aduser -filter * -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false }$DefaultmaxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge# Process Each User for Password Expiryforeach ($user in $users){$Name = $user.Name$emailaddress = $user.emailaddress$passwordSetDate = $user.PasswordLastSet$PasswordPol = (Get-AduserResultantPasswordPolicy $user)# Check for Fine Grained Passwordif (($PasswordPol) -ne $null){$maxPasswordAge = ($PasswordPol).MaxPasswordAge}else{# No FGP set to Domain Default$maxPasswordAge = $DefaultmaxPasswordAge}$expireson = $passwordsetdate + $maxPasswordAge$today = (get-date)$daystoexpire = (New-TimeSpan -Start $today -End $Expireson).Days# Set Greeting based on Number of Days to Expiry.# Check Number of Days to Expiry$messageDays = $daystoexpireif (($messageDays) -ge "1"){$messageDays = "in " + "$daystoexpire" + " days."}else{$messageDays = "today."}# Email Subject Set Here$subject="Your password will expire $messageDays"# Email Body Set Here, Note You can use HTML, including Images.$body ="<p>Dear $name,<br></P><br><p>Your Password will expire $messageDays.<br>Please change your password before it expires to avoid problems accessing to your work services. <br></P><br><p>Thanks, <br></P><br><br><p>Dear $name,<br></P><br><P>Su contraseña caducará en $daystoExpire días.<br>Por favor cambie su contraseña antes de que ésta expire para evitar problemas al acceder a su entorno de trabajo. <br></P><br><P>Gracias, <br></P><br><br><p>Caro $name,<br></P><br><p>A sua password vai expirar dentro de $daystoExpire dias<br>Por favor altere a mesma antes dela expirar de forma a evitar ter problemas de acesso ao seu ambiente de trabalho. <br></P><br><p>Obrigado, <br></P>"# If Testing Is Enabled - Email Administratorif (($testing) -eq "Enabled"){$emailaddress = $testRecipient} # End Testing# If a user has no email address listedif (($emailaddress) -eq $null){$emailaddress = "youremailaddress@domain.com"}# End No Valid Email# Send Email Messageif (($daystoexpire -ge "0") -and ($daystoexpire -lt $expireindays)){# If Logging is Enabled Log Detailsif (($logging) -eq "Enabled"){Add-Content $logfile "$date,$Name,$emailaddress,$daystoExpire,$expireson"}EMAIL -emailTo $emailaddress -emailSubject $subject -emailBody $body} # End Send Message} # End User Processing# End
Si te ha parecido útil este post, por favor haz click en alguno de los banners, no te costará nada y ayudaras a mantener este blog.