Vérifier l'expiration du mot de passe AD avec 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.

Windows | utilisateurs du groupe RDS PowerShell | Ouvrir une console PowerShell en tant qu'administrateur
PS C:\ > (Get-ADGroupMember -Identity 'RDS').SamAccountName
PowerShell | commande Get-ADGroupMember

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

PS C:\ > $user = "e.cartman"
PS C:\ > Get-ADUser "$user" -Properties msDS-UserPasswordExpiryTimeComputed
PowerShell | Get-ADUser avec la propriété msDS-UserPasswordExpiryTimeComputed
PS C:\ > $ADUser=(Get-ADUser "$user" -Properties msDS-UserPasswordExpiryTimeComputed)
PS C:\ > [DateTime]::FromFileTime($ADUser.'msDS-UserPasswordExpiryTimeComputed')
PowerShell | Get-ADUser, récupérer l'expiration du mot de passe

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.

PS C:\ > if ( $($ADUser.PasswordNeverExpires) ) {
PS C:\ > Set-ADUser $user -PasswordNeverExpires $false

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.

Active Directory | définir l'adresse mail
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")
PowerShell | Format Email address

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) : First Version

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').SamAccountName) {
    #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 :