Aller au contenu

🖥️ FICHE TP ÉLÈVE⚓︎

TP S16 — PowerShell AD • Exercices IPv6⚓︎

Durée : ~2h30 — En binôme — VM Windows Server avec AD DS


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.

PowerShell
# 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⚓︎

PowerShell
# 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é

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 :

PowerShell
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) :

PowerShell
$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 "✅ OU créée : $OU"
    }
    catch {
        Write-Host "⚠️  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 :

📋 Texte
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
PowerShell
# 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 :

PowerShell
# ═══════════════════════════════════════════════════════════════════════
# 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)
# Epreuve : Portfolio BTS SIO SISR — Compétences B2.4 et 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 "❌ 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 "❌ 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 "  ⚠️  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 "  ⚠️  OU '$Service' introuvable. Création automatique..."
        try {
            New-ADOrganizationalUnit -Name $Service -Path $Domaine -ErrorAction Stop
            Ecrire-Log "  ✅ OU '$Service' créée."
        }
        catch {
            Ecrire-Log "  ❌ 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 "  ✅ Utilisateur créé : $NomComplet ($Login) dans OU=$Service"
        $Compteurs.Succes++
    }
    catch {
        Ecrire-Log "  ❌ Échec de création pour '$Login' : $($_.Exception.Message)"
        $Compteurs.Echecs++
    }
}

# ─── RAPPORT FINAL ──────────────────────────────────────────────────────
Ecrire-Log "========================================================"
Ecrire-Log " RAPPORT FINAL DE CRÉATION"
Ecrire-Log "  ✅ Créations réussies  : $($Compteurs.Succes)"
Ecrire-Log "  ⚠️  Doublons ignorés   : $($Compteurs.Ignores)"
Ecrire-Log "  ❌ Échecs              : $($Compteurs.Echecs)"
Ecrire-Log "  Total traité          : $($Employes.Count)"
Ecrire-Log " Log complet            : $FichierLog"
Ecrire-Log "========================================================"

B4 — Exécuter et Vérifier⚓︎

PowerShell
# 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⚓︎

PowerShell
# 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.


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

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

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
::

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)⚓︎

PowerShell
# 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.