Module 5: -WhatIf Religieux - Pourquoi -WhatIf est Sacré
Durée: 1h30 | Prérequis: Modules 1-4 complétés
🎯 Objectif de ce Module
À la fin: -WhatIf sera gravé dans votre ADN d'administrateur. Vous ne pourrez plus physiquement exécuter une commande destructive sans -WhatIf d'abord.
🛐 La Religion -WhatIf
Les 10 Commandements de -WhatIf
- Tu utiliseras -WhatIf avant toute commande destructive
- Tu ne feras pas confiance même à tes propres scripts
- Tu vérifieras la portée de tes actions avant exécution
- Tu documenteras ce que -WhatIf te montre
- Tu n'exécuteras jamais un Remove-* sans -WhatIf d'abord
- Tu garderas ton sang-froid même sous pression
- Tu évangéliseras -WhatIf à tes collègues
- Tu n'auras pas honte de double-vérifier
- Tu considéreras -WhatIf comme sauveur de carrière
- Tu te souviendras que vendredi 17h = moment le plus dangereux
💀 Hall of Fame des Désastres Sans -WhatIf
🏆 Podium des Catastrophes Légendaires
🥇 1ère Place: L'Effaceur d'Exchange (2019)
# Ce qui était prévu:
Get-Mailbox -ResultSize 10 | Remove-Mailbox
# Ce qui fut exécuté:
Get-Mailbox -ResultSize Unlimited | Remove-Mailbox
🥈 2ème Place: Le Videur d'OU (2021)
# Intention: nettoyer OU test
Remove-ADOrganizationalUnit -Identity "OU=Test,DC=company,DC=com" -Recursive
# Réalité: Variable mal définie pointait vers OU=Users
Remove-ADOrganizationalUnit -Identity $ouToDelete -Recursive
# $ouToDelete contenait "OU=Users,DC=company,DC=com" ☠️
🥉 3ème Place: Le Déménageur Fou (2022)
# Script de migration développeurs → nouvelle OU
Get-ADUser -Filter {Department -eq "Dev"} | Move-ADObject -TargetPath $newOU
# Problème: $newOU était vide (string null)
# Résultat: Tous les devs déplacés vers racine du domaine
🎪 Simulacre en Direct: "Vendredi 16h58 - Le Piège"
Scenario
L'instructeur joue le rôle de l'admin sous pression
📧 Email urgent reçu à 16h55:
De: directeur.general@maxtec.be
À: admin@maxtec.be
Sujet: URGENT - Réunion lundi 8h avec clients japonais
Salut,
Peux-tu créer rapidement le groupe "GG-EU-Clients-Japon" et y ajouter
toute l'équipe commerciale ? Réunion critique lundi matin.
Merci !
DG
🧠 Monologue interne de l'admin: "16h58... le boss attend... script simple... pas besoin de -WhatIf pour une création de groupe..."
Le Script "Rapide"
# Script ultra-rapide - juste avant le weekend
New-ADGroup -Name "GG-EU-Clients-Japon" -GroupScope Global -GroupCategory Security -Path "OU=Groups,OU=Ventes,OU=EU,DC=maxtec,DC=be"
# Ajouter toute l'équipe Ventes
Get-ADUser -Filter {Department -eq "Ventes"} | ForEach-Object {
Add-ADGroupMember -Identity "GG-EU-Clients-Japon" -Members $_.SamAccountName
}
Write-Host "✅ Groupe créé et membres ajoutés!" -ForegroundColor Green
L'Exécution "Sans Problème"
PS C:\> .\create-japan-group.ps1
New-ADGroup : The specified group already exists
Add-ADGroupMember : Cannot find an object with identity: 'GG-EU-Clients-Japon'
Add-ADGroupMember : Cannot find an object with identity: 'GG-EU-Clients-Japon'
Add-ADGroupMember : Cannot find an object with identity: 'GG-EU-Clients-Japon'
✅ Groupe créé et membres ajoutés!
🤔 Réaction de l'admin: "Quelques erreurs mais le message final est vert... ça a marché !"
Le Réveil Brutal - Lundi 8h15
☎️ Appel DG: "PERSONNE de l'équipe Ventes ne peut accéder au dossier clients !"
☎️ Appel Responsable IT: "Les groupes Ventes ont disparu !"
☎️ Appel Sécurité: "Tentatives de connexion échouées en masse !"
L'Enquête Forensique
# Que s'est-il VRAIMENT passé ?
Get-ADGroup -Filter {Name -like "*Japon*"}
# Résultat: Aucun groupe trouvé
# Chercher dans les logs d'événements
Get-WinEvent -LogName Security | Where-Object {$_.Id -eq 4728}
# Découverte: Le groupe existait déjà... et a été SUPPRIMÉ par erreur
La Vérité Cachée
Le script avait un bug caché:
1. Groupe existait déjà → New-ADGroup a échoué
2. Variable $groupe mal initialisée dans une version antérieure
3. Add-ADGroupMember a tenté d'ajouter à un groupe inexistant
4. MAIS: Une autre partie du script contenait Remove-ADGroup (ligne cachée)
5. Résultat: Suppression accidentelle du groupe existant + données
Ce Que -WhatIf Aurait Révélé
New-ADGroup -Name "GG-EU-Clients-Japon" -WhatIf
# WhatIf: Le groupe 'GG-EU-Clients-Japon' existe déjà et sera IGNORÉ
Get-ADUser -Filter {Department -eq "Ventes"} | ForEach-Object {
Add-ADGroupMember -Identity "GG-EU-Clients-Japon" -Members $_.SamAccountName -WhatIf
}
# WhatIf: Ajout de 'Victor' au groupe 'GG-EU-Clients-Japon'
# WhatIf: Ajout de 'Vanessa' au groupe 'GG-EU-Clients-Japon'
# WhatIf: ERREUR - Groupe 'GG-EU-Clients-Japon' non trouvé
💡 Révélation: -WhatIf aurait immédiatement montré que le groupe n'existait plus !
🧪 Lab Pratique: Apprivoiser -WhatIf
Exercice 5.1: Maîtriser les Nuances de -WhatIf
Commandes qui Supportent -WhatIf
# Test sur maxtec.be - TOUS avec -WhatIf
Set-ADUser -Identity Richard -Title "Chef RH" -WhatIf
Add-ADGroupMember -Identity "GG-EU-RH-Users" -Members Ines -WhatIf
Remove-ADUser -Identity TestUser -WhatIf
Move-ADObject -Identity "CN=Charles,OU=Users,OU=Compta,OU=EU,DC=maxtec,DC=be" -TargetPath "OU=Users,OU=IT,OU=EU,DC=maxtec,DC=be" -WhatIf
Commandes qui ne Supportent PAS -WhatIf
# Ces commandes sont "read-only" par nature
Get-ADUser -Identity Richard # Pas de -WhatIf possible
Get-ADGroup -Filter {Name -like "GG-*"} # Lecture seule
Le Piège des Commandes Hybrides
# ⚠️ ATTENTION: Get avec actions cachées
Get-ADUser -Filter * | Set-ADUser -Department "Test" -WhatIf
# ↑ ↑
# Pas de -WhatIf Avec -WhatIf
# ☠️ DANGER: Si on oublie -WhatIf sur Set-ADUser
Get-ADUser -Filter * | Set-ADUser -Department "Test"
# Tous les utilisateurs changent de département !
Exercice 5.2: Interpréter les Outputs -WhatIf
Output Normal vs WhatIf
# Sans -WhatIf (DANGEREUX - ne pas exécuter)
Remove-ADUser -Identity "CN=TestUser,OU=Users,OU=IT,OU=EU,DC=maxtec,DC=be"
# Output: (rien, utilisateur supprimé silencieusement)
# Avec -WhatIf (SÉCURISÉ)
Remove-ADUser -Identity "CN=TestUser,OU=Users,OU=IT,OU=EU,DC=maxtec,DC=be" -WhatIf
# Output: "What if: Performing the operation "Remove" on target "CN=TestUser,OU=Users,OU=IT,OU=EU,DC=maxtec,DC=be""
Décryptage des Messages WhatIf
# Message type 1: Action simple
Set-ADUser -Identity Richard -Title "Manager" -WhatIf
# "What if: Performing operation "Set" on target "CN=Richard,OU=Users,OU=RH,OU=EU,DC=maxtec,DC=be""
# Message type 2: Action avec détails
Add-ADGroupMember -Identity "GG-EU-IT-Users" -Members @("Ivan", "Ines") -WhatIf
# "What if: Performing operation "Add" on target "CN=GG-EU-IT-Users,OU=Groups,OU=IT,OU=EU,DC=maxtec,DC=be" to add member "CN=Ivan,OU=Users,OU=IT,OU=EU,DC=maxtec,DC=be""
🔥 Situations d'Urgence: Quand la Pression Monte
Scenario 1: Le Boss Impatient
👔 Boss: "C'est urgent ! Pas le temps pour tes vérifications !"
🧑💻 Vous: "Monsieur, -WhatIf prend 3 secondes et peut sauver 3 jours de récupération"
👔 Boss: "Bon... mais vite !"
🎯 Technique de Survie: Exécuter -WhatIf pendant que vous expliquez
# Pendant que vous parlez: "Je vais juste vérifier que..."
Get-ADUser -Filter {Department -eq "Stagiaires"} | Remove-ADUser -WhatIf
# Résultat immédiat visible:
# "What if: Remove CN=Alexandre.Martin,OU=Users,OU=Direction..." ← ☠️ STOP !
Scenario 2: L'Équipe qui Attend
💬 Équipe: "On attend tous pour partir, dépêche-toi !"
🎯 Pression: Maximum
⚡ Tentation: Skip -WhatIf "juste cette fois"
🛡️ Mantra de Survie: "Un -WhatIf de 5 secondes > Un weekend de 48h à récupérer"
Scenario 3: Le Script "Testé Mille Fois"
🧑💻 Vous: "J'ai exécuté ce script 100 fois en dev"
🧠 Cerveau: "Pas besoin de -WhatIf"
🚨 Réalité: Environnement prod ≠ dev
⚖️ Règle Absolue: Peu importe combien de fois testé, -WhatIf obligatoire en prod
🎮 Jeu Sérieux: "WhatIf ou Catastrophe"
Règles du Jeu
L'instructeur présente des scenarios. Classe vote: -WhatIf nécessaire ou pas ?
Scenario A
Get-ADUser -Identity Richard -Properties Department
Scenario B
Set-ADUser -Identity Richard -Department "Direction"
Scenario C ⚡
Get-ADUser -Filter {Name -like "Test*"} | Remove-ADUser
Scenario D 🎭
# Script "sûr" du collègue de confiance
.\clean-old-accounts.ps1
🏆 Certification -WhatIf: Test Final
Test de Réflexes (30 secondes par question)
Question 1
Vous devez désactiver le compte de Marie qui part demain. Première action ?
- A) Set-ADUser -Identity Marie -Enabled $false
- B) Set-ADUser -Identity Marie -Enabled $false -WhatIf
- C) Demander confirmation au manager d'abord
Réponse: B (vérifier d'abord, confirmer ensuite)
Question 2
Script trouvé sur Stack Overflow avec 200 upvotes. Première exécution ? - A) Exécuter directement (200 upvotes = fiable) - B) Modifier pour votre environnement puis exécuter - C) Ajouter -WhatIf partout et analyser output
Réponse: C (popularité ≠ sécurité pour votre environnement)
Question 3
Vendredi 17h45, script "urgent" du DG. Que faites-vous ? - A) Exécuter rapidement avant de partir - B) -WhatIf d'abord, même sous pression - C) Remettre à lundi pour être sûr
Réponse: B (pression ≠ excuse pour ignorer sécurité)
🛠️ Votre Nouveau Workflow -WhatIf
Étapes Obligatoires (à Mémoriser)
1. 🤔 Lire et comprendre commande
2. 🔍 Identifier impact potentiel
3. ⚡ Ajouter -WhatIf à TOUTE commande destructive
4. 👁️ Analyser output -WhatIf ligne par ligne
5. 🎯 Vérifier que scope correspond à intention
6. ✅ Si OK, relancer sans -WhatIf
7. 📋 Documenter ce qui a été fait
Exceptions à la Règle -WhatIf
⚠️ AUCUNE EXCEPTION
⚠️ "Testé en dev" ≠ exception
⚠️ "Script simple" ≠ exception
⚠️ "Urgence" ≠ exception
⚠️ "Confiance collègue" ≠ exception
⚠️ "Pression hiérarchique" ≠ exception
🎯 Récapitulatif: Votre Nouvelle Religion
🛐 Les Articles de Foi -WhatIf
- Je crois que -WhatIf sauve des carrières
- Je jure de ne jamais skip -WhatIf sous pression
- Je promets d'évangéliser -WhatIf à mes collègues
- Je m'engage à préférer 5 secondes de -WhatIf à 5 jours de récupération
- Je reconnaîs que même mes propres scripts nécessitent -WhatIf
🎖️ Votre Badge d'Honneur
À partir d'aujourd'hui, vous êtes un "WhatIf Warrior" certifié
Motto: "Mieux vaut un -WhatIf de trop qu'un désastre de trop peu"
☕ PAUSE OBLIGATOIRE 10 minutes - Intégrer la religion -WhatIf
🎯 Prochaine étape: Module 6 - Kit d'Urgence (Procédures de Panique "Break Glass")