Powershell – Notification d’expiration de mot de passe par email

Mise en place d’une alerte par email lorsque le mot de passe d’un compte utilisateur va expiré.

Sur une infrastructure Active Directory en mode bastion, ce domaine AD est ponctuellement utilisé par des administrateurs car dédié à des comptes des services applicatifs.

Une alerte par email a été mise en place afin de prévenir les utilisateurs de l’expiration de leur mot de passe.

La configuration est basé sur un script Powershell qui parcourt Active Directory, liste les comptes et l’expiration de celui-ci. si le mot de passe arrive à expiration un email est envoyé à la personne. Ce script est stocké dans Active Directory “Sysvol” et est exécuté via une tâche planifiée déployée par GPO sur le PDC.

Sommaire

Contenu du script

PICTO_AVERTISSEMENT

Vous trouverez-ci-dessous le script permettant l’envoie des emails. Je vous laisse en prendre connaissance et l’adapté à vos besoins.

De plus, il est vivement recommandé /indispensable de signer ce script avant de le déployer. Vu que celui-ci s’exécute sur les contrôleurs de domaine. De plus la tâche planifiée doit être exécuté avec un compte de service et éviter d’utiliser le compte system.

################# Send email when the password account will expire #################

####################################################################################
############################## Custom variables ###################################
####################################################################################
# Set threshold in days
$ThresholdTrigger=14

#Root OU where find the users
$rootUsersOU='OU=TEDDYCORP,DC=teddycorp,DC=lab'

# SMTP conf
$SMTPServer="smtp.teddycorp.lab"
$eMailSender="system@teddycorp.lab"
$eMailSubjectWarning="Expiration Password"

#eMail Template
$MailTemplateWarning=@"
Bonjour %GivenName%,

Le mot de passe du compte : %Account%
Expire dans moins de %ThresholdTrigger% jours, date d'expiration : %dateExpiration%

Pensez a le changer.

Cordialement
"@

####################################################################################
####################################################################################
####################################################################################

### Init /Set var ###

$ResultUserInfos=@()

### Module and third-party import ###
Import-Module ActiveDirectory


### MAIN ###
#Collect infos utilisateurs (user enable) :
$LstUsers = Get-ADUser -SearchBase $rootUsersOU -Filter 'enabled -eq "true"' -SearchScope Subtree -Properties mail, pwdLastSet | Select-Object *


#Format data and select user with emaim address and expiration time <
foreach($User in $LstUsers){

    #If PSO or GPO
    If($(Get-ADuser $User.SamAccountName -Properties "msDS-ResultantPSO")."msDS-ResultantPSO" -eq $null){
        $DateExpiration=$([datetime]::FromFileTime($User.'msDS-UserPasswordExpiryTimeComputed'))
    }else{
        $DateLastPwdSet=$([datetime]::FromFileTime($User.'pwdLastSet'))
        $PSOPwdDuration=[int]$(Get-ADUserResultantPasswordPolicy -Identity $User.SamAccountName).MaxPasswordAge.days
        $DateExpiration=$DateLastPwdSet.AddDays($PSOPwdDuration)
    }


    #Calcul limit date
    $DateWithExpirationDuration=(Get-Date).AddDays($ThresholdTrigger)


    if(![string]::IsNullOrEmpty($User.mail)){
        if($DateExpiration -lt $DateWithExpirationDuration){
            $ObjectUser = New-Object System.Object
            $ObjectUser | Add-Member -Type NoteProperty -Name ExpirationDate -Value $DateExpiration
            $ObjectUser | Add-Member -Type NoteProperty -Name GivenName -Value $User.GivenName
            $ObjectUser | Add-Member -Type NoteProperty -Name Surname -Value $User.Surname
            $ObjectUser | Add-Member -Type NoteProperty -Name eMailAddress -Value $User.mail
            $ObjectUser | Add-Member -Type NoteProperty -Name UPN -Value $User.UserPrincipalName

            $ResultUserInfos+=$ObjectUser
        }
    }
}


#Write and send eMail :
foreach($UserInfos in $ResultUserInfos){
    $EmailUser=$MailTemplateWarning
    $EmailUser=$EmailUser.Replace("%GivenName%",$UserInfos.GivenName)
    $EmailUser=$EmailUser.Replace("%Account%",$UserInfos.UPN)
    $EmailUser=$EmailUser.Replace("%ThresholdTrigger%",$ThresholdTrigger)
    $EmailUser=$EmailUser.Replace("%dateExpiration%",$UserInfos.ExpirationDate)

    Send-MailMessage -From $eMailSender -To $UserInfos.eMailAddress -Subject $eMailSubjectWarning -Body $EmailUser -SmtpServer $SMTPServer
}

Ce même script peut être déposé dans le SYSVOL du domaine afin d’être accessible par l’ensemble des contrôleurs de domaine.

\\domain.dom\SysVol\teddycorp.lab\scripts\MailAlertPwdExpir.ps1

Planification du script par GPO

Dans le cas ci-présent, le script est exécuté depuis le PDC et ça planification est réalisée par GPO, cette solution peut-être pratique pour les “petits” environnements. Ceux-ci est optionnels, vous êtes libre d’exécuter ce script depuis n’importe quelle machine ayant un accès à votre AD et à votre serveur SMTP.

Création de la GPO

Pour distribuer le tâche planifiée par GPO uniquement sur le PDC, il est nécessaire de créer une nouvelle GPO, lier celle-ci sur l’OU “Domain Controllers” et appliquer un filtre WMI.

Tâche planifiée en GPP machine
Planification tous les jours.
La tâche exécute le script Powershell

Détail des arguments : -Noninteractive -ExecutionPolicy Bypass –Noprofile -file “\\teddycorp.lab\sysvol\teddycorp.lab\scripts\{ID}\MailAlertPwdExpired.ps1”

La tâche sera surrpimée dès lors que le GPO n'est plus appiquée
Création du filtre WMI

Comme évoqué plus haut, la GPo sera appliquée sur filtre WMI afin de ne s’exécuter que sur le PDC. Créer un nouveau filtre WMI.

WMI filter

Détail de la requète WMI : Select * From Win32_ComputerSystem where DomainRole=5

Appliquer ce nouveau filtre WMI sur la GPO.

Résumé

En résumé, nous avons appliqué un script Powershell qui liste les comptes et envoie un email à l’adresse mail référencée dans ce compte lorsque que le mot de passe de celui-ci arrive à expiration.

Ce script est mis à disposition de l’ensemble des machines car déposé dans le SYSVOL.

L’exécution de ce script est planifié dans une tâche planifiée distributé par GPO.

La GPO quant à elle n’est appliqué que sur le contrôleur de domaine possédant le rôle FSMO PDC. Ce filtrage est réalisé par WMI.

One thought on “Powershell – Notification d’expiration de mot de passe par email

  1. Top comme script, je vais l’adapter pour les comptes sans email mais avec manager de compte 😉

    Merci et Bonne fête !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *