logo rss

Vérifier l'expiration du mot de passe AD avec PowerShell

Logo PowerShell

Intro

Il peut être compliqué de changer le mot de passe des utilisateurs bureau à distance une fois que ces derniers ont expiré. J'ai donc travaillé sur la mise en place d'un script PowerShell qui vérifie l'expiration du mot de passe et envoi un e-mail aux utilisateurs pour les prévenir 30 jours avant expiration.

Je détaille ici chacun des principaux aspects du script PowerShell.

Récupérer les utilisateurs depuis un groupe Active Directory

La première chose à faire est d'obtenir la liste des utilisateurs AD. Ici je récupère les utilisateurs qui se trouvent dans le groupe RDS.

Capture d'écran de la boîte de dialogue Propriétés RDS montrant l'onglet Membres avec une liste d'utilisateurs Active Directory assignés au groupe RDS.
  • Ouvrir une console Windows PowerShell en tant qu'administrateur :
Capture d'écran d'une commande PowerShell permettant de vérifier la date d'expiration du mot de passe d'un utilisateur à l'aide de la propriété msDS-UserPasswordExpiryTimeComputed.
  • Entrer la commande suivante pour récupèrer la liste des utilisateurs présents dans le groupe RDS :
PS C:\ > (Get-ADGroupMember -Identity 'RDS').SamAccountName
  • Démonstration :
Capture d'écran d'une commande PowerShell listant les SamAccountName des membres du groupe RDS Active Directory à l'aide de Get-ADGroupMember.
  • Ajouter «where objectClass -eq 'user' » pour ne récupérer que les comptes utilisateurs (pas les groupes) :
PS C:\ > (Get-ADGroupMember -Identity 'RDS' | where objectClass -eq 'user').SamAccountName

Récupérer l'expiration du mot de passe Active Directory

  • Pour récupérer l'expiration du mot de passe nous avons besoin de récupérer la propriété msDS-UserPasswordExpiryTimeComputed :
PS C:\ > $user = "e.cartman" PS C:\ > Get-ADUser "$user" -Properties msDS-UserPasswordExpiryTimeComputed
  • Démonstration :
Capture d'écran de la sortie d'une commande PowerShell montrant les propriétés détaillées d'Active Directory pour un utilisateur, y compris l'attribut msDS-UserPasswordExpiryTimeComputed.
  • Comme nous pouvons le voir, nous ne pouvons pas utiliser les informations brutes qui nous sont retournées. Nous utilisons donc [DateTime]::FromFileTime pour le convertir dans un format exploitable :
PS C:\ > $ADUser=(Get-ADUser "$user" -Properties msDS-UserPasswordExpiryTimeComputed) PS C:\ > [DateTime]::FromFileTime($ADUser.'msDS-UserPasswordExpiryTimeComputed')
  • Démonstration :
Capture d'écran d'une commande PowerShell permettant de vérifier la date d'expiration du mot de passe d'un utilisateur à l'aide de la propriété msDS-UserPasswordExpiryTimeComputed.

Vérifier si le paramètre le «mot de passe n'expire jamais» est activé

Il n'est pas possible de récupérer l'expiration du mot de passe si le paramètre le mot de passe n'expire jamais est activé.

Donc nous devons désactiver ce paramètre le temps de récupérer l'expiration du mot de passe, puis le réactiver de nouveau pour ne pas bloquer l'utilisateur.

  • Vérifier si le paramètre PasswordNeverExpires est activé :
PS C:\ > if ( $($ADUser.PasswordNeverExpires) ) {
  • Désactiver PasswordNeverExpires :
PS C:\ > Set-ADUser $user -PasswordNeverExpires $false

Vérifier si le compte est activé

  • On ne s'occupe uniquement que des comptes activés :
PS C:\ > if ((Get-ADUser "$user").Enabled)

Paramétrer l'adresse mail

J'utilise le champ E-mail d'Active Directory comme adresse de destination des utilisateurs.

Si ce champ est absent il sera complété automatiquement avec les informations présentes dans Prénom et Nom.

Capture d'écran de comparaison montrant la mise à jour d'un champ d'adresse électronique dans un profil d'utilisateur Active Directory, mettant en évidence la modification apportée au compte d'Eric Cartman.
  • Définir le champ EmailAddress :
PS C:\ > $user = "e.cartman" PS C:\ > Set-ADUser $user -EmailAddress $((Get-ADUser $user).GivenName.substring(0,1).ToLower() + (Get-ADUser $user).Surname.tolower() + "@shebangthedolphins.net") Capture d'écran d'une commande PowerShell générant une adresse électronique en concaténant l'initiale du prénom, le nom de famille et le domaine d'un utilisateur dans Active Directory.

Script PowerShell

########################### # author : shebangthedolphins.net # version : 1.0 # date : 2021.02 # role : Check AD password expiration # other : Tested on Windows 2019 Server # updates : # - 1.0 (2021/02) : Première Version # - 1.1 (2021/02) : Gestion des comptes activés et récupération des utilisateurs seulement Function Mail { param ([string]$emailbody, [string]$sujet, [string]$mail) $encoding = [System.Text.Encoding]::UTF8 Send-MailMessage -Encoding $encoding -To $mail -Subject $sujet -From $mail -smtpserver mx.shebangthedolphins.net -Body $emailbody } #get RDS users group foreach ($user in $(Get-ADGroupMember -Identity 'RDS' | where objectClass -eq 'user').SamAccountName) { if ((Get-ADUser "$user").Enabled) { #vérifier que le compte est activé #get AD users with PasswordNeverExpires, msDS-UserPasswordExpiryTimeComputed and mail parameters $ADUser=Get-ADUser "$user" -Properties PasswordNeverExpires, msDS-UserPasswordExpiryTimeComputed, mail #flag to know if password never expires parameter has been modified $Pne_Flag=$false #if current user has "PasswordNeverExpires" enabled if ( $($ADUser.PasswordNeverExpires) ) { Set-ADUser $user -PasswordNeverExpires $false #disable PasswordNeverExpires $Pne_Flag=$true #set flag to true } #if current user doesn't have mail parameter set if ( !($ADUser.mail) ) { Write-Host $user "doesn't have email set" #set email field Set-ADUser $user -EmailAddress $((Get-ADUser $user).GivenName.substring(0,1).ToLower() + (Get-ADUser $user).Surname.tolower() + "@shebangthedolphins.net") } $ADUser=Get-ADUser "$user" -Properties PasswordNeverExpires, msDS-UserPasswordExpiryTimeComputed, mail $ExpDate=[DateTime]::FromFileTime($ADUser.'msDS-UserPasswordExpiryTimeComputed') #get last modification date $DiffDays=$(New-TimeSpan -Start $(Get-Date) -End $($ExpDate)).Days #substract last modification date to current date if ( $DiffDays -lt 30 ) { #if less than 30 days Write-Host "User $user with e-mail :" $ADUser.mail "will have his password expired in" $DiffDays "days, the" $(get-date($ExpDate) -Format "yyyy.MM.dd") Mail ("Hello,`n`nYour password is going to expire in less than 30 days.`nAfter this date you will not be able to connect with your password.`nPlease consider to change it.`n`nThank you") "[ShebangTheDolphins] : Your remote desktop password is going to expire soon" $ADUser.mail if ($Pne_Flag) { #if the "PasswordNeverExpires" parameter has been modified Set-ADUser $user -PasswordNeverExpires $true #we enable PasswordNeverExpires } } else { Write-Host "User $user with e-mail :" $ADUser.mail "doesn't have to change his password, it expires in" $DiffDays "days, the" $(get-date($ExpDate) -Format "yyyy.MM.dd") } } }
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

adresse mail de contact