Administrer Active Directory en ligne de commande
Les cmdlets *-AD* de cette séance ne fonctionnent que sur une machine membre d'un domaine Active Directory, disposant du module ActiveDirectory (fourni par RSAT). Si vous ne disposez pas de ce labo, le TP de cette séance se fait en lecture et en complétion de code : toutes les sorties de commandes nécessaires sont fournies directement dans l'énoncé, aucune exécution réelle n'est requise pour répondre.
Avec une VM Windows Server (voir le cours Virtualisation), promue en contrôleur de domaine via Install-ADDSForest -DomainName sio.lan, et une organisation unit (OU) Eleves créée dans la console dsa.msc, vous pouvez reproduire réellement l'exemple et le TP de cette séance.
Objectifs de la séance
- Comprendre le vocabulaire de base d'Active Directory (domaine, OU, DN)
- Installer et utiliser le module
ActiveDirectory - Lire, créer et gérer des comptes et des groupes dans l'annuaire
- Créer des comptes en masse à partir d'un fichier CSV
- Utiliser
-WhatIfavant toute commande destructive à l'échelle du domaine
Notions théoriques
Rappel Active Directory
Active Directory est l'annuaire central d'un réseau Windows d'entreprise : il centralise les comptes utilisateurs, les groupes et les machines de tout un domaine, alors qu'un compte local n'existe que sur une seule machine (séance 1).
Vocabulaire indispensable :
- un contrôleur de domaine est le serveur qui héberge l'annuaire ;
- une OU (Organizational Unit, unité d'organisation) est un dossier de l'annuaire, utilisé pour ranger comptes et machines de façon hiérarchique *(par exemple une OU par service, ou par classe) ;
- un DN (Distinguished Name) est le chemin complet d'un objet dans l'annuaire, par exemple
CN=Dupont,OU=Eleves,DC=sio,DC=lan; - le
SamAccountNameest le nom de connexion court (hérité de l'ancien système Windows NT), l'UserPrincipalNameest la forme moderne façon adresse mail (jdupont@sio.lan) ; - un groupe peut être de sécurité (pour attribuer des droits) ou de distribution (pour une liste de diffusion).
Le module ActiveDirectory
Ce module n'est pas installé par défaut sur un poste client : il fait partie des RSAT (Remote Server Administration Tools).
# Sur Windows 10/11
Add-WindowsCapability -Online -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0"
# Sur Windows Server
Install-WindowsFeature RSAT-AD-PowerShell
# Vérifier
Get-Module -ListAvailable ActiveDirectory
Lire l'annuaire
Get-ADUser -Identity jdupont -Properties *
Get-ADUser -Filter "Department -eq 'Compta'"
Get-ADUser -Filter * -SearchBase "OU=Eleves,DC=sio,DC=lan"
Le paramètre -Filter d'Get-ADUser a une syntaxe qui lui est propre, différente de Where-Object : -Filter "Department -eq 'Compta'" filtre directement côté serveur, ce qui est nettement plus performant que de rapatrier tous les comptes avec -Filter * pour les filtrer ensuite localement avec Where-Object.
Créer un compte
New-ADUser -Name "Jean Dupont" `
-GivenName "Jean" `
-Surname "Dupont" `
-SamAccountName "jdupont" `
-UserPrincipalName "jdupont@sio.lan" `
-Path "OU=Eleves,DC=sio,DC=lan" `
-AccountPassword (ConvertTo-SecureString "MotDePasse1!" -AsPlainText -Force) `
-Enabled $true `
-ChangePasswordAtLogon $true
Le paramètre -Path précise le DN de l'OU cible : sans lui, le compte est créé dans le conteneur Users par défaut de l'annuaire, rarement l'endroit souhaité.
Gérer les groupes
Get-ADGroup -Filter *
New-ADGroup -Name "GRP_Compta" -GroupScope Global -GroupCategory Security -Path "OU=Groupes,DC=sio,DC=lan"
Add-ADGroupMember -Identity "GRP_Compta" -Members "jdupont"
Get-ADGroupMember -Identity "GRP_Compta" -Recursive
Modifier, désactiver, débloquer
Set-ADUser -Identity "jdupont" -Department "Comptabilité"
Disable-ADAccount -Identity "jdupont"
Unlock-ADAccount -Identity "jdupont"
Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00
Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00 liste tous les comptes qui ne se sont pas connectés depuis 90 jours — un cas d'usage très courant pour repérer les comptes dormants à désactiver.
Création en masse depuis un CSV
Import-Csv -Path ".\utilisateurs.csv" -Delimiter ";" -Encoding UTF8
Le fichier utilisateurs.csv contient typiquement des colonnes Prenom;Nom;Login;Service, une ligne par compte à créer : combiné à une boucle foreach, cela permet de créer des dizaines de comptes en une seule exécution.
Du local au domaine
Cette séance reprend et élargit les cmdlets locales de la séance 1 :
| Action | Compte local | Compte de domaine |
|---|---|---|
| Créer | New-LocalUser | New-ADUser |
| Lire | Get-LocalUser | Get-ADUser |
| Ajouter à un groupe | Add-LocalGroupMember | Add-ADGroupMember |
-WhatIf, avant toute commande destructive
Une commande Active Directory s'applique à tout le domaine, pas à une seule machine : une erreur y a des conséquences bien plus larges qu'une erreur locale. Prenez l'habitude de tester d'abord avec -WhatIf, qui affiche ce que la commande ferait sans réellement l'exécuter, avant de la relancer sans ce paramètre — ou avec -Confirm pour valider chaque action une par une.
Remove-ADUser -Identity "jdupont" -WhatIf
Exemple pratique
# Script : New-UtilisateursAD.ps1
# Role : creer en masse les comptes eleves a partir d'un fichier CSV
# Prerequis : module ActiveDirectory (RSAT) et droits d'administration du domaine
Import-Module ActiveDirectory
$ouCible = "OU=Eleves,DC=sio,DC=lan"
$mdpInitial = ConvertTo-SecureString "Bts$IO2026!" -AsPlainText -Force
Import-Csv -Path ".\utilisateurs.csv" -Delimiter ";" -Encoding UTF8 | ForEach-Object {
$login = ($_.Prenom.Substring(0,1) + $_.Nom).ToLower()
if (Get-ADUser -Filter "SamAccountName -eq '$login'") {
Write-Warning "Le compte $login existe deja, il est ignore."
return
}
New-ADUser -Name "$($_.Prenom) $($_.Nom)" `
-GivenName $_.Prenom `
-Surname $_.Nom `
-SamAccountName $login `
-UserPrincipalName "$login@sio.lan" `
-Path $ouCible `
-AccountPassword $mdpInitial `
-ChangePasswordAtLogon $true `
-Enabled $true
Add-ADGroupMember -Identity "GRP_$($_.Service)" -Members $login
Write-Host "Compte $login cree dans $ouCible"
}
Utiliser un mot de passe identique pour tous les comptes créés n'est acceptable qu'en environnement de labo, et uniquement associé à -ChangePasswordAtLogon $true, qui force chaque utilisateur à le changer dès sa première connexion. En production, générez toujours un mot de passe distinct par compte.
Testez toujours ce type de script avec -WhatIf sur New-ADUser, ou sur un sous-ensemble réduit du CSV, avant de l'exécuter sur la totalité d'une promotion.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Ce TP se réalise en lecture et en complétion de code, sans exécution réelle. Le contexte ci-dessous vous suffit pour répondre à chaque question.
Contexte fourni. Le domaine est sio.lan, l'OU cible des comptes élèves est OU=Eleves,DC=sio,DC=lan. Le fichier utilisateurs.csv contient :
Prenom;Nom;Service
Marie;Curie;Compta
Ada;Lovelace;Info
La console d'administration Active Directory (dsa.msc) montre, après exécution du script complet, deux nouveaux comptes mcurie et alovelace dans l'OU Eleves. La commande Get-ADUser -Filter "SamAccountName -eq 'mcurie'" renvoie alors un objet avec Enabled : True et SamAccountName : mcurie.
Étape 1 — Lire le CSV et boucler sur chaque ligne
Un CSV exporté depuis un tableur en français utilise le point-virgule comme séparateur : pensez systématiquement à -Delimiter ";", sans quoi Import-Csv place tout le contenu d'une ligne dans une seule colonne.
Étape 2 — Construire le login à partir du prénom et du nom
Décidez d'une seule règle de construction des logins pour tout le parc, et documentez-la : c'est ce qui évite les collisions et les incohérences quand plusieurs personnes créent des comptes.
Étape 3 — Créer le compte dans la bonne OU
Sans -Path, un compte est créé dans le conteneur Users par défaut, rarement l'endroit prévu par l'organisation de votre annuaire — précisez systématiquement l'OU de destination.
Étape 4 — Rendre le script rejouable
Vérifier qu'un compte n'existe pas déjà avant de le créer permet de relancer le script sur un CSV mis à jour sans provoquer d'erreur sur les comptes déjà créés — le même principe que la séance 1, appliqué cette fois à l'échelle du domaine.
📌 Une solution
Exercices complémentaires
A — Version testable partout. Rejouez ce même script en remplaçant New-ADUser par New-LocalUser et Add-ADGroupMember par Add-LocalGroupMember, toujours à partir du même CSV. La logique (lire un CSV, boucler, construire un login, vérifier l'idempotence) reste identique, mais devient exécutable et testable sur un simple poste, sans domaine.
B — Comptes dormants. Écrivez la ligne qui liste les comptes Active Directory inactifs depuis plus de 90 jours avec Search-ADAccount, en vous appuyant sur les notions théoriques.