TP – PowerShell : utilisateurs AD en masse et IPv6
BTS SIO SISR 1re année – Bloc 2 – S14
Note
But. Situation : Trente nouveaux comptes à créer avant lundi : comment les créer en une minute plutôt qu'en une journée ?
Comment ce TP fonctionne. Avant de manipuler, tu écris ce que tu anticipes (« J'anticipe »). Puis tu testes et tu notes ce que tu constates. Tu comprends ce que fait chaque commande (« Je comprends »). Un bilan de compétences clôt la séance. Les parties de services (Linux, Windows Server) se font sur des machines virtuelles réelles ; le simulateur réseau ou Packet Tracer servent aux manipulations d'équipements réseau.
Contexte
SimIO SARL finalise la fusion avec Nexio. Vous devez automatiser la création de 10 comptes AD depuis un fichier CSV, puis vérifier le résultat. En fin de séance, vous travaillerez sur la notation IPv6 pour préparer la migration réseau future.
PARTIE A — Prise en Main de PowerShell
A1 — Exploration des Cmdlets
Ouvrir PowerShell ISE (en tant qu'Administrateur) et exécuter les commandes suivantes une par une. Pour chaque commande, noter ce qu'elle retourne dans le tableau ci-dessous.
# Commandes à exécuter
Get-Process | Select-Object -First 5 -Property Name, Id, CPU
Get-Service | Where-Object { $_.Status -eq "Running" } | Measure-Object
Get-ChildItem C:\ | Sort-Object -Property LastWriteTime -Descending | Select-Object -First 3
Get-ComputerInfo | Select-Object CsName, WindowsVersion, OsArchitecture
| Commande | Ce que retourne |
|---|---|
Get-Process ... First 5 |
|
Get-Service ... Measure-Object |
|
Get-ChildItem ... Last Write |
|
Get-ComputerInfo ... |
Capturer les résultats : Capture A1.
A2 — Explorer les Objets avec Get-Member
# Découvrir toutes les propriétés d'un objet Process
Get-Process | Get-Member
# Accéder à une propriété spécifique
$Processus = Get-Process | Sort-Object CPU -Descending | Select-Object -First 1
Write-Host "Processus le plus gourmand : $($Processus.Name) — CPU : $($Processus.CPU)"
# Explorer les propriétés d'un utilisateur AD
Import-Module ActiveDirectory
Get-ADUser -Identity "Administrateur" -Properties * | Get-Member
A3 — Pipeline en Pratique
Construire les commandes PowerShell répondant aux questions suivantes :
| Question | Commande PowerShell à écrire |
|---|---|
| Combien de services sont arrêtés sur ce serveur ? | |
| Quel est le processus consommant le plus de RAM ? | |
| Lister les utilisateurs AD dont le compte est désactivé |
J'anticipe. Que renvoie Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 ? Quel est l'avantage sur une commande qui renverrait du texte ? ______________________
Éléments de réponse
Les 5 processus qui ont consommé le plus de processeur. PowerShell transmet des objets (avec leurs propriétés) d'une commande à l'autre : on trie ou filtre sur une propriété, sans découper du texte.
PARTIE B — Script de Création d'Utilisateurs AD en Masse depuis CSV
B1 — Préparer l'Environnement
Vérifier que le module AD est disponible :
Import-Module ActiveDirectory
Get-Command -Module ActiveDirectory | Measure-Object
# → Doit retourner plusieurs dizaines de cmdlets
Créer les OUs nécessaires (si elles n'existent pas) :
$Domaine = "DC=siosarl,DC=local"
$OUs = @("RH", "Informatique", "Comptabilite", "Direction", "Commercial")
foreach ($OU in $OUs) {
try {
New-ADOrganizationalUnit -Name $OU -Path $Domaine -ErrorAction Stop
Write-Host "[OK] OU créée : $OU"
}
catch {
Write-Host "[ATTENTION] OU '$OU' existe déjà — ignoré."
}
}
Capturer la liste des OUs dans la console ADUC : Capture B1.
B2 — Créer le Fichier CSV
Créer le fichier C:\Scripts\nouveaux_employes.csv avec le contenu suivant :
Prenom,Nom,Service,Login,Email,Titre
Alice,Martin,RH,a.martin,a.martin@siosarl.local,Chargée RH
Bob,Dupont,Informatique,b.dupont,b.dupont@siosarl.local,Technicien SI
Claire,Durand,Direction,c.durand,c.durand@siosarl.local,Directrice
David,Lemaire,Informatique,d.lemaire,d.lemaire@siosarl.local,Administrateur Réseau
Emma,Bernard,RH,e.bernard,e.bernard@siosarl.local,Assistante RH
Francois,Moreau,Comptabilite,f.moreau,f.moreau@siosarl.local,Comptable
Genevieve,Simon,Direction,g.simon,g.simon@siosarl.local,Assistante Direction
Hugo,Laurent,Commercial,h.laurent,h.laurent@siosarl.local,Commercial
Isabelle,Thomas,Comptabilite,i.thomas,i.thomas@siosarl.local,Responsable Compta
Julien,Robert,Commercial,j.robert,j.robert@siosarl.local,Commercial Senior
# Vérifier que le CSV est bien lisible
$Test = Import-Csv "C:\Scripts\nouveaux_employes.csv"
Write-Host "Nombre d'entrées dans le CSV : $($Test.Count)"
$Test | Format-Table -AutoSize
Capturer l'affichage du tableau CSV : Capture B2.
B3 — Écrire le Script de Création en Masse
Créer C:\Scripts\creer_utilisateurs_ad.ps1 :
# ═══════════════════════════════════════════════════════════════════════
# Script : creer_utilisateurs_ad.ps1
# Auteur : [Votre nom]
# Date : [Date]
# Version : 1.0
# Rôle : Création en masse d'utilisateurs Active Directory
# depuis un fichier CSV — SimIO SARL (fusion Nexio)
# Usage : preuve pour une fiche de réalisation (E6) – B2.2, B2.3
# ═══════════════════════════════════════════════════════════════════════
# ─── CONFIGURATION ──────────────────────────────────────────────────────
$FichierCSV = "C:\Scripts\nouveaux_employes.csv"
$Domaine = "DC=siosarl,DC=local"
$MotDePasseDefaut = "Nexio!2024"
$FichierLog = "C:\Scripts\log_creation_ad.txt"
$Compteurs = @{
Succes = 0
Echecs = 0
Ignores = 0
}
# ─── FONCTIONS ──────────────────────────────────────────────────────────
function Ecrire-Log {
param([string]$Message)
$Horodatage = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$Ligne = "[$Horodatage] $Message"
Write-Host $Ligne
Add-Content -Path $FichierLog -Value $Ligne
}
# ─── VÉRIFICATIONS INITIALES ────────────────────────────────────────────
# Vérifier que le module AD est disponible
if (-not (Get-Module -Name ActiveDirectory -ListAvailable)) {
Write-Host "[ERREUR] Module ActiveDirectory non disponible. Exécutez ce script sur un contrôleur de domaine ou un poste avec RSAT." -ForegroundColor Red
exit 1
}
Import-Module ActiveDirectory
# Vérifier que le fichier CSV existe
if (-not (Test-Path $FichierCSV)) {
Write-Host "[ERREUR] Fichier CSV introuvable : $FichierCSV" -ForegroundColor Red
exit 1
}
# ─── DÉBUT DU TRAITEMENT ────────────────────────────────────────────────
Ecrire-Log "========================================================"
Ecrire-Log " DÉBUT DE CRÉATION — Fusion SimIO / Nexio"
Ecrire-Log " Fichier source : $FichierCSV"
Ecrire-Log "========================================================"
# ─── CONVERSION DU MOT DE PASSE EN SECURSTRING ──────────────────────────
$MotDePasseSecurise = ConvertTo-SecureString $MotDePasseDefaut -AsPlainText -Force
# ─── LECTURE ET TRAITEMENT DU CSV ───────────────────────────────────────
$Employes = Import-Csv -Path $FichierCSV -Delimiter ","
foreach ($Employe in $Employes) {
$NomComplet = "$($Employe.Prenom) $($Employe.Nom)"
$Login = $Employe.Login
$Service = $Employe.Service
$OuPath = "OU=$Service,$Domaine"
$UPN = $Employe.Email
Ecrire-Log "─────────────────────────────────────────────────────"
Ecrire-Log "Traitement : $NomComplet ($Login) — Service : $Service"
# ─── Vérifier si l'utilisateur existe déjà ──────────────────────────
$UtilisateurExistant = Get-ADUser -Filter { SamAccountName -eq $Login } -ErrorAction SilentlyContinue
if ($UtilisateurExistant) {
Ecrire-Log "[ATTENTION] Ignoré : L'utilisateur '$Login' existe déjà dans l'AD."
$Compteurs.Ignores++
continue
}
# ─── Vérifier que l'OU existe ───────────────────────────────────────
try {
Get-ADOrganizationalUnit -Filter { Name -eq $Service } -ErrorAction Stop | Out-Null
}
catch {
Ecrire-Log "[ATTENTION] OU '$Service' introuvable. Création automatique..."
try {
New-ADOrganizationalUnit -Name $Service -Path $Domaine -ErrorAction Stop
Ecrire-Log "[OK] OU '$Service' créée."
}
catch {
Ecrire-Log "[ERREUR] Impossible de créer l'OU '$Service' : $($_.Exception.Message)"
$Compteurs.Echecs++
continue
}
}
# ─── Créer l'utilisateur ────────────────────────────────────────────
try {
New-ADUser `
-Name $NomComplet `
-GivenName $Employe.Prenom `
-Surname $Employe.Nom `
-SamAccountName $Login `
-UserPrincipalName $UPN `
-EmailAddress $Employe.Email `
-Title $Employe.Titre `
-Department $Service `
-Path $OuPath `
-AccountPassword $MotDePasseSecurise `
-ChangePasswordAtLogon $true `
-Enabled $true `
-Description "Arrivée fusion Nexio — $(Get-Date -Format 'MM/yyyy')" `
-ErrorAction Stop
Ecrire-Log "[OK] Utilisateur créé : $NomComplet ($Login) dans OU=$Service"
$Compteurs.Succes++
}
catch {
Ecrire-Log "[ERREUR] Échec de création pour '$Login' : $($_.Exception.Message)"
$Compteurs.Echecs++
}
}
# ─── RAPPORT FINAL ──────────────────────────────────────────────────────
Ecrire-Log "========================================================"
Ecrire-Log " RAPPORT FINAL DE CRÉATION"
Ecrire-Log "[OK] Créations réussies : $($Compteurs.Succes)"
Ecrire-Log "[ATTENTION] Doublons ignorés : $($Compteurs.Ignores)"
Ecrire-Log "[ERREUR] Échecs : $($Compteurs.Echecs)"
Ecrire-Log " Total traité : $($Employes.Count)"
Ecrire-Log " Log complet : $FichierLog"
Ecrire-Log "========================================================"
B4 — Exécuter et Vérifier
# Exécuter le script
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
& "C:\Scripts\creer_utilisateurs_ad.ps1"
# Vérifier les utilisateurs créés
Get-ADUser -Filter * -SearchBase "DC=siosarl,DC=local" -Properties Department |
Select-Object Name, SamAccountName, Department, Enabled |
Sort-Object Department |
Format-Table -AutoSize
# Lire le log de création
Get-Content C:\Scripts\log_creation_ad.txt
Capturer la liste des utilisateurs dans ADUC (console graphique) : Capture B3. Capturer le log de création : Capture B4.
B5 — Tester les Doublons
# Relancer le script sans modifier le CSV
# → Tous les utilisateurs doivent être marqués "Ignorés" (doublons)
& "C:\Scripts\creer_utilisateurs_ad.ps1"
Capturer le rapport final indiquant N doublons ignorés : Capture B5.
Je comprends. Pourquoi enrober New-ADUser dans un try { } catch { } quand on crée 30 comptes depuis un fichier CSV ? ______________________
Éléments de réponse
Une erreur sur un compte (doublon, mot de passe refusé) ne doit pas arrêter les 29 suivants ni passer inaperçue : le catch la journalise et le script continue.
PARTIE C — Exercices IPv6 : Notation et Types d'Adresses
C1 — Décompression d'Adresses
Écrire la forme complète (non abrégée) des adresses suivantes :
| Adresse compressée | Adresse complète (128 bits, 8 groupes de 4 hex) |
|---|---|
::1 |
|
FE80::1 |
|
2001:db8::1 |
|
2001:db8:0:1:: |
|
FF02::1 |
Correction C1
Chaque groupe est complété à 4 chiffres hexadécimaux ; :: représente une suite de groupes à zéro.
| Adresse compressée | Adresse complète |
|---|---|
::1 |
0000:0000:0000:0000:0000:0000:0000:0001 |
FE80::1 |
FE80:0000:0000:0000:0000:0000:0000:0001 |
2001:db8::1 |
2001:0db8:0000:0000:0000:0000:0000:0001 |
2001:db8:0:1:: |
2001:0db8:0000:0001:0000:0000:0000:0000 |
FF02::1 |
FF02:0000:0000:0000:0000:0000:0000:0001 |
C2 — Compression d'Adresses
Écrire la forme la plus courte possible des adresses suivantes :
| Adresse complète | Adresse compressée |
|---|---|
2001:0DB8:0000:0000:0000:0000:0000:0001 |
|
FE80:0000:0000:0000:0204:61FF:FE9D:F156 |
|
0000:0000:0000:0000:0000:0000:0000:0001 |
|
2001:0DB8:ABCD:0012:0000:0000:0000:0001 |
|
FF02:0000:0000:0000:0000:0000:0000:0001 |
Correction C2
Règles : on supprime les zéros de tête de chaque groupe, puis on remplace par :: la plus longue suite de groupes à zéro (une seule fois par adresse).
| Adresse complète | Adresse compressée |
|---|---|
2001:0DB8:0000:0000:0000:0000:0000:0001 |
2001:db8::1 |
FE80:0000:0000:0000:0204:61FF:FE9D:F156 |
fe80::204:61ff:fe9d:f156 |
0000:0000:0000:0000:0000:0000:0000:0001 |
::1 |
2001:0DB8:ABCD:0012:0000:0000:0000:0001 |
2001:db8:abcd:12::1 |
FF02:0000:0000:0000:0000:0000:0000:0001 |
ff02::1 |
C3 — Identification des Types d'Adresses
Identifier le type de chaque adresse et indiquer si elle est routable sur Internet :
| Adresse | Type | Routable sur Internet ? |
|---|---|---|
FE80::1 |
||
::1 |
||
2001:db8::1234 |
||
FC00::1 |
||
FF02::1 |
||
:: |
Correction C3
| Adresse | Type | Routable sur Internet ? |
|---|---|---|
FE80::1 |
Link-local (FE80::/10) |
Non : limitée au lien local |
::1 |
Bouclage (loopback) | Non : la machine elle-même |
2001:db8::1234 |
Unicast global, mais dans le préfixe 2001:db8::/32 réservé à la documentation |
Normalement oui pour une adresse globale ; ce préfixe-ci n'est jamais routé |
FC00::1 |
Unique local (FC00::/7), l'équivalent des adresses privées IPv4 |
Non : usage interne |
FF02::1 |
Multicast, « tous les nœuds du lien » | Non : portée limitée au lien |
:: |
Adresse non spécifiée (aucune adresse) | Non : sert de source avant d'avoir une adresse |
C4 — SLAAC : Calculer une Adresse Link-Local
Pour une interface avec l'adresse MAC 00:50:56:AB:CD:EF, calculer l'adresse link-local IPv6 générée par EUI-64 :
Étape 1 : Découper la MAC en deux blocs de 3 octets : 00:50:56 et AB:CD:EF
Étape 2 : Insérer FF:FE entre les deux blocs : 00:50:56:FF:FE:AB:CD:EF
Étape 3 : Regrouper en hextets : 0050:56FF:FEAB:CDEF
Étape 4 : Inverser le bit universel/local (7e bit du 1er octet) :
- Premier octet : 00 en binaire = 0000 0000
- Bit 7 (0-indexé) = le bit U/L = 0 → inverser à 1
- 0000 0010 = 02
- Premier hextet devient : 0250
Adresse link-local : FE80:: + 0250:56FF:FEAB:CDEF = ________________
C5 — Configurer une Adresse IPv6 sur Windows Server (optionnel)
# Afficher les interfaces réseau et leurs adresses IPv6
Get-NetIPAddress -AddressFamily IPv6 | Format-Table InterfaceAlias, IPAddress, PrefixLength
# Afficher les adresses link-local générées automatiquement
Get-NetIPAddress -AddressFamily IPv6 | Where-Object { $_.IPAddress -like "FE80*" }
Capturer les adresses IPv6 présentes sur le serveur : Capture C1.
Bilan de la séance
Remplis ce bilan seul, honnêtement : il sert à décider ce qu'il faut reprendre. Niveau : Non maîtrisé, Maîtrise partielle, Bonne maîtrise ou Excellente maîtrise (le vocabulaire des grilles nationales d'évaluation) ; Non évalué si tu n'as pas travaillé la compétence aujourd'hui.
| Compétence du référentiel | Ce que j'ai fait dans cette séance | Niveau |
|---|---|---|
| B2.2 – Installer, tester et déployer une solution d'infrastructure réseau | ||
| B2.3 – Exploiter, dépanner et superviser une solution d'infrastructure réseau | ||
| B3.3 – Sécuriser les équipements et les usages des utilisateurs |
Note
Les codes sont ceux du référentiel (l'arrêté numérote des activités : les codes « B… » sont un usage courant).
Je sais faire, sans aide :
- Utiliser les cmdlets fondamentales et le pipeline PowerShell ;
- Manipuler des objets (
Select-Object,Where-Object) ; - Importer un CSV et créer des utilisateurs AD en masse avec
New-ADUser; - Gérer les erreurs avec
Try/Catch; - Décrire une adresse IPv6, ses types (lien local, globale) et SLAAC.
Ce que je dois reprendre : ______________________
Ma question à poser à l'enseignant : ______________________