Powershell : Détection des comptes ayant un mot de passe expirant prochainement et envoi d'un rapport par mail

Aujourd'hui, je souhaitais me connecter à mes serveurs Windows dans mon nuage. Cela faisait quelques semaines que je ne m'étais pas connecté aux machines Windows, mais uniquement à ma machine de rebond qui me permet ensuite de prendre la main sur le réseau interne aux autres machines. Possédant deux comptes différents, j'ai été quelque peu pris au piège en m'apercevant que tous mes comptes, y compris celui d'administration, avaient leurs mots de passe expirés : impossible donc d'ouvrir une console AD ou une session sur l'AD directement avec mon compte pour y modifier mes mots de passe. Il a donc fallu que je me connecte sur l'ESX pour prendre la main directement en console sur l'AD et pouvoir accéder au prompt de login classique afin que Windows me propose naturellement de modifier mon mot de passe.

Changeant irrégulièrement mes mots de passe de mes trois comptes, le fait de changer le mot de passe d'un compte ne m'indique pas que les deux autres sont proches de l'expiration, et ne me connectant pas toujours sur les machines Windows de ma plateforme ni même l'AD, je n'ai pas les rappels habituels m'indiquant que j'arrive à la fin de la durée de vie pour mon mot de passe. Il est vrai que je pourrais tout simplement procéder au changement des trois password une fois pour toutes afin de partir sur un seul délai mais ce n'est pas ce qu'il y a de plus pratique.

Afin d'éviter d'avoir à refaire face à cette situation, j'ai écrit un script plutôt simple qui contrôle les comptes de l'AD et qui vérifie la date d'expiration des comptes dont le mot de passe n'est pas permanent, en envoyant un courriel avec un fichier contenant les noms des comptes dont il va falloir penser à s'occuper.

Import-Module ActiveDirectory

$From = "admin-win@localhost"
$To = "supervision@localhost"
$Smtp = "smtp.localdomain"
$SoonToExpireList = @()
$ReportFilePath = 'c:\temp\exp.log'
$ReportFile = New-Item -ItemType File -path c:\temp\exp.log
$Proc = $false

$AccountArray = Get-AdUser -Filter {PasswordNeverExpires -eq "false"} -Properties msDS-UserPasswordExpiryTimeComputed | select samAccountName,msDS-UserPasswordExpiryTimeComputed

foreach ($Account in $AccountArray)
    {
    $ExpDate = [datetime]::FromFileTime($Account.'msDS-UserPasswordExpiryTimeComputed')
    $NowDate = Get-Date
    $DiffDate = $ExpDate - $NowDate
    if ($DiffDate.Days -lt 15 -and $DiffDate.Days -gt 0)
        {
        $Proc = $true
        Add-Content -path $ReportFilePath -value ($Account.samAccountName)
        }
    }

if ($Proc -eq $true)
    {
    $MailString = "Bonjour, les mots de passe des comptes indiques dans le fichier en PJ expirent dans moins de 15 jours."
    Send-MailMessage -From $From -To $To -Subject "Comptes aux mots de passe expirant prochainement" -SmtpServer $Smtp -Body $MailString -Attachments $ReportFilePath
    }   

Remove-Item $ReportFilePath

Bien entendu, il est possible d'améliorer ce script, en programmant l'envoi de mail lorsqu'il reste 7 jours, puis 3 jours, par exemple. Dans mon cas, le script est en exécution hebdomadaire, ce qui me laisse deux courriels pour prendre quelques minutes et m'occuper de changer mes password avant que mes comptes soient inaptes à ouvrir une session TS.

Le script est téléchargeable avec ses commentaires et prêt à l'emploi sur mon miroir de téléchargement.

Lien pour marque-pages : Permaliens.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.