Active Directory : notification par e-mail pour l’expiration de mot de passe
Sommaire
I. Présentation
Dans ce tutoriel, je vous propose de mettre en place un script PowerShell qui va envoyer une notification par e-mail aux utilisateurs X jours avant l'expiration de leur mot de passe Active Directory, afin de les inviter à changer le mot de passe avant la date butoir.
Selon les environnements, et sous réserve qu'il y ait une politique de mots de passe en place (ce qui, malheureusement, n'es pas si évident que ça), l'expiration du mot de passe sur un compte utilisateur peut poser des problèmes de connexion sur des services basés sur l'authentification Active Directory. D'ailleurs, j'ai abordé cette problématique plus en détail dans mon article "Active Directory et la mise en cache des identifiants".
L'une des "solutions" consiste à notifier les utilisateurs que leur mot de passe va expirer, quelques jours avant le jour J où ils devront impérativement changer le mot de passe. C'est ce que nous allons voir aujourd'hui, en passant par PowerShell.
II. Récupérer la date d'expiration du mot de passe avec PowerShell
Au sein de l'Active Directory, et plus particulièrement des comptes utilisateurs, chaque objet dispose d'un attribut qui contient la date et l'heure d'expiration du mot de passe. Cette valeur est calculée selon la politique de mots de passe appliquée sur l'utilisateur. Voici le nom de l'attribut auquel je fais référence :
msDS-UserPasswordExpiryTimeComputed
Cette valeur est visible avec l'interface graphique, avec la console "Utilisateurs et ordinateurs Active Directory" via l'onglet "Editeur d'attributs", ou via PowerShell. Voici un exemple :
La valeur de cet attribut n'est pas directement modifiable, car il s'agit d'un attribut construit dont la valeur a la particularité d'être calculée à partir d'autres attributs (pwdLastSet) et objets. Tous les détails de cet attribut sont disponibles dans la documentation de Microsoft :
Cette information est également visible avec la commande historique "net user", en précisant un nom d'utilisateur, puis en regardant le champ "Le mot de passe expire". Voici un exemple avec l'utilisateur "guy.mauve" :
net user guy.mauve /domain
Toutefois, je trouve que la valeur de l'attribut Active Directory est plus fiable que celle renvoyée par cette commande.
Avec PowerShell, on peut afficher la date d'expiration des mots de passe pour un ensemble d'utilisateurs avec cette commande :
Get-ADUser -Filter { (Enabled -eq $True) -and (PasswordNeverExpires -eq $False)} –Properties "DisplayName", "mail", "msDS-UserPasswordExpiryTimeComputed" | Select-Object -Property "Displayname","mail",@{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}
Cette commande retourne l'information pour tous les utilisateurs activés et dont le mot de passe a une date d'expiration. Voici un exemple de sortie :
III. Expiration du mot de passe : notification par e-mail
L'e-mail est un canal de communication privilégié et efficace en entreprise, même s'il y a également d'autres solutions de communication comme Microsoft Teams. Le fait d'envoyer une notification par e-mail à l'utilisateur quelques jours avant l'expiration de son mot de passe va vous permettre de communiquer en direct avec lui, de façon automatique.
Désormais, intéressons-nous au script PowerShell, qui est disponible sur mon GitHub : vous pouvez le réutiliser en l'état ou l'adapter à votre guise. Pour utiliser ce script nommé "Send-ADPasswordExpirationNotifications.ps1", vous avez seulement besoin de modifier ces quelques variables :
# Nombre de jours avant l'expiration pour envoyer la notification $DateThreshold = 7 # Serveur SMTP - Nom du serveur $SMTPServer = "smtp.domaine.fr" # Serveur SMTP - Numéro de port $SMTPPort = 25 # Serveur SMTP - Adresse e-mail de l'expéditeur $SMTPSender = "[email protected]" # Serveur SMTP - Encodage Email $SMTPEncoding =[System.Text.Encoding]::UTF8 # Envoyer une synthèse aux administrateurs [boolean]$SendReportAdmin = $true # Adresse e-mail du destinataire pour la synthèse $SendReportAdminEmail = "[email protected]"
Vous pouvez adapter le script pour la prise en charge du SSL et/ou des Credentials dans les commandes Send-MailMessage (pour envoyer les e-mails) selon votre environnement. Vous pouvez aussi ajouter l'option "-Cc" avec votre adresse e-mail, si vous souhaitez recevoir une copie de l'e-mail envoyé à chaque utilisateur.
Lorsque ce script tourne, il va récupérer la date d'expiration du mot de passe pour tous les utilisateurs activés et dont l'option "Le mot de passe n'expire jamais" n'est pas cochée. Ensuite :
- Dans le cas où le seuil de notification est définit à "7", un e-mail sera émis à l'utilisateur si son mot de passe expire dans 7 jours ou moins de 7 jours.
- Dans le cas où le mot de passe est déjà expiré, la notification n'est pas envoyée.
Chaque utilisateur recevra une notification similaire à celle-ci :
Le service informatique recevra une synthèse par e-mail avec la liste des utilisateurs dont le mot de passe expire bientôt. Cet e-mail est envoyé uniquement si "$SendReportAdmin = $true" donc vous pouvez activer ou non ce rapport supplémentaire.
Le script est disponible ici :
Pour que ces notifications soient envoyées automatiquement, il convient d'exécuter ce script dans une tâche planifiée. Sur le contrôleur de domaine avec les rôles FSMO, ce sera très bien à mon sens. Quant au compte utilisé pour l'exécution de la tâche planifiée, un gMSA est conseillé.
L'action à lancer ressemblera à ceci :
powershell.exe -File "C:\Scripts\Send-ADPasswordExpirationNotifications.ps1"
Comme ceci :
Si vous n'êtes pas très à l'aise avec cette partie de la configuration, consultez ces deux articles :
IV. Conclusion
Grâce à la mise en place de ce script, vos utilisateurs seront notifiés que leur mot de passe expire prochainement et pourront procéder à la réinitialisation de celui-ci avant l'échéance précisée dans l'e-mail.
Si vous avez des suggestions pour améliorer le script "Send-ADPasswordExpirationNotifications.ps1", n'hésitez pas à m'en faire part.
Bonjour Florian,
j’ai utilisé votre script qui va me rendre un très gros service, merci encore.
Cependant, j’ai l’erreur suivante pour chaque utilisateur ors de l’envoi du mail :
Send-MailMessage : Échec de l’authentification, car le site distant a fermé le flux de transport.
Je reçois pourtant bien le message de synthèse sur ma boîte mail. Auriez vous une piste ?
Bonjour,
Il semble que les serveur Exchange ne permettent pas l’envoi d’emails depuis des comptes gMSA. Comment peut-on contourner cette restriction ?
Bonjour Alex,
C’est une problématique connue, malheureusement le compte gmsa ne possède pas des attributs nécessaires pour gérer les identifiants requis pour l’envoi d’e-mails.
tout d’abord je vous recommande de déplacer la tache planifié sur une serveur autre que le DC.
ensuite tu devras passer par un script intermédiaire genre ta tache passera des arguments ou écrira un fichier ensuite elle déclenchera une autre tache exécutée avec un utilsiateur standard pour envoyer un mail.
Autre solution sera de saisir les identifiants d’un compte ou les récupérer à partir d’un fichier qu’il soit chiffré avec un certif ou pas en sein du script.