#SysAdmin #NetAdmin

AD – Gestion utilisateurs inactifs

A

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
par Nathan
#SysAdmin #NetAdmin