Il est important au sein d’un active directory de ne pas laisser des comptes utilisateurs dormants pour des questions de sécurité. En effet, un compte utilisateur qui est encore accessible alors que la personne n’est plus présente laisse une surface d’attaque supplémentaire. Pour simplifier la surveillance il est possible d’automatiser la détection avec un script PowerShell.
Descriptif
- On définit la période à partir de laquelle on estime qu’un compte doit être considéré comme inactif (180 jours ici).
- On lance une recherche sur les comptes utilisateurs qui sont activés, qui ne contiennent pas un certain terme, et qui ne se sont pas connectés depuis la période d’inactivité ou qui ne se sont même jamais connectés.
- On génère un fichier avec la date du jour, mais on garde le fichier du mois précédent tout en supprimant celui du mois passé.
- On envoie un email avec le total de compte, et deux liens pour accéder aux fichiers sur le réseau.
Script
# MODULES Install-Module -Name ActiveDirectory Install-Module -Name ImportExcel # VARIABLES $LastActiveDay = (Get-Date).AddDays(-180) $PastMonth = (Get-Date).AddMonths(-2) | Get-Date -UFormat "%Y-%m-%d" $LastMonth = (Get-Date).AddMonths(-1) | Get-Date -UFormat "%Y-%m-%d" $CurrentDate = Get-Date -UFormat "%Y-%m-%d" $SMTPSettings = @{ To = "adresse@email.tld" From = "adresse@email.tld" Subject = "[$($env:COMPUTERNAME)] - Gestion des utilisateurs AD inactifs" SMTPServer = "sub.domain.tld or @ip" Encoding = 'UTF8' } $LogFile = "$PSScriptRoot\AD-Inactive-Users.txt" $PastFile = "$PSScriptRoot\AD-inactive-user-$PastMonth.xlsx" $LastFile = "$PSScriptRoot\AD-inactive-users-$LastMonth.xlsx" -replace "C:","\\$env:COMPUTERNAME\c$" $CurrentFile = "$PSScriptRoot\AD-inactive-users-$CurrentDate.xlsx" -replace "C:","\\$env:COMPUTERNAME\c$" # SCRIPT Clear-Host Start-Transcript -Path $LogFile $InactiveUsers = Get-ADUser -Filter { Enabled -eq $true -and SamAccountName -notlike "TERME_NON_DETECTE" -and (LastLogonDate -lt $LastActiveDay -or -not(LastLogonDate -like "*")) } -Properties LastLogonDate, UserPrincipalName -SearchBase "OU=Utilisateurs,DC=csnd,DC=fr" | ForEach-Object { [PSCustomObject]@{ OrganizationalUnit = $_.DistinguishedName DaysSinceLastSignIn = if ($_.LastLogonDate) { ((Get-Date) - $_.LastLogonDate).Days } else { "N/A" } LastLogonDate = if ($_.LastLogonDate) { $_.LastLogonDate } else { "Never signed in" } UserPrincipalName = $_.UserPrincipalName Name = $_.Name } } | Sort-Object -Property Name $InactiveUsers | Export-Excel -Path "$CurrentFile" -AutoSize Send-MailMessage @SMTPSettings -BodyAsHtml " <p>$($InactiveUsers.Count) utilisateur(s) inactif(s). <br><br>Fichier du mois en cours: <a href='$CurrentFile'>$CurrentFile</a> <br><br>Fichier du mois précédent: <a href='$LastFile'>$LastFile</a></p>" if (Test-Path -Path $PastFile) { Remove-Item $PastFile -Force } Stop-Transcript
Éxecution
On peut par exemple placer le script dans un dossier « AdminTools » à la racine du disque C, et il ne reste plus qu’à créer une tâche planifiée sur le serveur AD pour procéder à l’exécution du script de manière automatique tous les lundis à 8h00 toutes les 2 semaines :
# TRIGGER $TriggerParams = @{ At = "08:00" Weekly = $true WeeksInterval = 2 DaysOfWeek = "Monday" } $Trigger = New-ScheduledTaskTrigger @TriggerParams # ACTION $ActionParams = @{ Execute = "powershell.exe" Argument = '-NoProfile -ExecutionPolicy Bypass -File ".\AD-Inactive-Users.ps1"' WorkingDirectory = 'C:\AdminTools\AD-Inactive-Users' } $Action = New-ScheduledTaskAction @ActionParams # SETTINGS $SettingsParams = @{ Compatibility = "Win8" RestartInterval = "00:10:00" RestartCount = "3" ExecutionTimeLimit = "00:30:00" StartWhenAvailable = $true WakeToRun = $true AllowStartIfOnBatteries = $true DontStopIfGoingOnBatteries = $true } $Settings = New-ScheduledTaskSettingsSet @SettingsParams # TASK $TaskParams = @{ TaskName = "AD-Inactive-Users" User = "NT AUTHORITY\SYSTEM" Trigger = $Trigger Action = $Action Settings = $Settings RunLevel = "Highest" } Register-ScheduledTask @TaskParams