Aller au contenu

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

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