Automatisation Active Directory avec PowerShell

PowerShell est l’outil indispensable de tout administrateur Windows pour gérer Active Directory à grande échelle. Le module Active Directory fournit des centaines de cmdlets pour automatiser le provisionnement des utilisateurs, la gestion des groupes, les audits de sécurité et les opérations de maintenance. Ce guide présente les scripts essentiels et les bonnes pratiques pour une administration AD efficace.

Installation et Configuration du Module

Avant de commencer, installez le module Active Directory PowerShell et vérifiez la connexion au domaine :

# Sur Windows Server
Install-WindowsFeature RSAT-AD-PowerShell

# Sur Windows 10/11
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0

# Vérifier l'installation
Get-Module -ListAvailable ActiveDirectory
Import-Module ActiveDirectory

# Informations sur le domaine
Get-ADDomain
Get-ADForest
Get-ADDomainController -Filter *

Confirmez que vous pouvez interroger le domaine avec Get-ADUser -Filter * -ResultSetSize 5 pour récupérer les cinq premiers utilisateurs. Si la commande réussit, le module est correctement configuré et connecté au contrôleur de domaine.

Provisionnement des Utilisateurs

La création d’utilisateurs individuels et en masse est l’une des tâches les plus courantes. PowerShell simplifie considérablement ce processus par rapport à l’interface graphique :

# Créer un utilisateur individuel
New-ADUser -Name "Marie Dupont" `
    -GivenName "Marie" `
    -Surname "Dupont" `
    -SamAccountName "mdupont" `
    -UserPrincipalName "mdupont@domaine.local" `
    -Path "OU=Utilisateurs,OU=Paris,DC=domaine,DC=local" `
    -AccountPassword (ConvertTo-SecureString "MotDePasse123!" -AsPlainText -Force) `
    -Enabled $true `
    -ChangePasswordAtLogon $true `
    -Department "Informatique" `
    -Title "Ingénieur Système"

# Création en masse depuis un fichier CSV
$users = Import-Csv -Path "C:\Scripts\nouveaux_utilisateurs.csv" -Delimiter ";"
foreach ($user in $users) {
    $password = ConvertTo-SecureString $user.Password -AsPlainText -Force
    New-ADUser -Name "$($user.Prenom) $($user.Nom)" `
        -GivenName $user.Prenom `
        -Surname $user.Nom `
        -SamAccountName $user.Login `
        -UserPrincipalName "$($user.Login)@domaine.local" `
        -Path $user.OU `
        -AccountPassword $password `
        -Enabled $true `
        -Department $user.Departement `
        -Title $user.Fonction
    Write-Host "Utilisateur $($user.Login) créé avec succès" -ForegroundColor Green
}

Pour les désactivations de comptes lors des départs, créez un script qui désactive le compte, retire les groupes et déplace l’objet vers une OU d’archivage :

function Disable-DepartingUser {
    param([string]$SamAccountName)

    $user = Get-ADUser -Identity $SamAccountName -Properties MemberOf
    Disable-ADAccount -Identity $SamAccountName

    # Retirer tous les groupes sauf "Domain Users"
    $user.MemberOf | ForEach-Object {
        Remove-ADGroupMember -Identity $_ -Members $SamAccountName -Confirm:$false
    }

    # Déplacer vers l'OU d'archivage
    Move-ADObject -Identity $user.DistinguishedName `
        -TargetPath "OU=Comptes_Desactives,DC=domaine,DC=local"

    Set-ADUser -Identity $SamAccountName -Description "Désactivé le $(Get-Date -Format 'yyyy-MM-dd')"
}

Gestion des Groupes et Appartenances

La gestion des groupes de sécurité et de distribution est essentielle pour le contrôle d’accès. Automatisez l’attribution des groupes en fonction des attributs organisationnels :

# Créer un groupe de sécurité
New-ADGroup -Name "SG_Paris_IT" `
    -GroupScope Global `
    -GroupCategory Security `
    -Path "OU=Groupes,DC=domaine,DC=local" `
    -Description "Groupe sécurité - Équipe IT Paris"

# Ajouter tous les utilisateurs IT de Paris au groupe
Get-ADUser -Filter {Department -eq "Informatique" -and Office -eq "Paris"} |
    ForEach-Object { Add-ADGroupMember -Identity "SG_Paris_IT" -Members $_ }

# Comparer les membres de deux groupes
$groupe1 = Get-ADGroupMember -Identity "SG_Paris_IT" | Select-Object -ExpandProperty SamAccountName
$groupe2 = Get-ADGroupMember -Identity "SG_Lyon_IT" | Select-Object -ExpandProperty SamAccountName
Compare-Object $groupe1 $groupe2

# Trouver les groupes vides
Get-ADGroup -Filter * -Properties Members |
    Where-Object { $_.Members.Count -eq 0 } |
    Select-Object Name, GroupScope, GroupCategory

Rapports et Audits de Sécurité

Les rapports réguliers sont indispensables pour maintenir la sécurité et la conformité de l’annuaire. Voici les scripts d’audit les plus utiles :

# Comptes inactifs depuis plus de 90 jours
$inactiveDate = (Get-Date).AddDays(-90)
Get-ADUser -Filter {LastLogonDate -lt $inactiveDate -and Enabled -eq $true} `
    -Properties LastLogonDate, Department |
    Select-Object Name, SamAccountName, LastLogonDate, Department |
    Export-Csv -Path "C:\Rapports\comptes_inactifs.csv" -NoTypeInformation -Encoding UTF8

# Comptes avec mot de passe n'expirant jamais
Get-ADUser -Filter {PasswordNeverExpires -eq $true -and Enabled -eq $true} |
    Select-Object Name, SamAccountName |
    Export-Csv -Path "C:\Rapports\mdp_permanent.csv" -NoTypeInformation

# Rapport HTML complet
$html = Get-ADUser -Filter {Enabled -eq $true} -Properties Department, Title, LastLogonDate |
    Select-Object Name, SamAccountName, Department, Title, LastLogonDate |
    ConvertTo-Html -Title "Rapport Utilisateurs Active Directory" `
        -PreContent "<h1>Rapport AD - $(Get-Date -Format 'dd/MM/yyyy')</h1>"
$html | Out-File "C:\Rapports\rapport_ad.html" -Encoding UTF8

Planifiez ces rapports avec le Planificateur de tâches Windows pour un suivi automatisé. Combinez les résultats avec Send-MailMessage pour envoyer les rapports par email aux responsables de la sécurité chaque semaine.

Articles Connexes