Aller au contenu principal

Administrer Active Directory en ligne de commande

Un environnement de domaine est nécessaire

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.

Si vous disposez du labo

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 -WhatIf avant 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 SamAccountName est le nom de connexion court (hérité de l'ancien système Windows NT), l'UserPrincipalName est 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"
attention

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 :

ActionCompte localCompte de domaine
CréerNew-LocalUserNew-ADUser
LireGet-LocalUserGet-ADUser
Ajouter à un groupeAdd-LocalGroupMemberAdd-ADGroupMember

-WhatIf, avant toute commande destructive

danger

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"
}
attention

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.

info

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


Que faut-il installer pour disposer de Get-ADUser sur un poste client Windows ?


Quelle est la différence entre Get-ADUser -Filter "Department -eq 'Compta'" et Get-ADUser -Filter * | Where-Object Department -eq 'Compta' ?


Que fait -Path "OU=Eleves,DC=sio,DC=lan" dans New-ADUser ?


TP pour réfléchir et résoudre des problèmes

attention

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


Bonne pratique - Le point-virgule des CSV français

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


Bonne pratique - Une règle de nommage unique et documentée

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


Bonne pratique - Toujours préciser l'OU cible

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


Bonne pratique - Idempotence, même dans l'annuaire

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.