Module 5 â -WhatIf, pourquoi c'est non nĂ©gociable
Durée: 1h30 | Prérequis: Modules 1-4 complétés
Objectif
Ă la fin de ce module, -WhatIf doit ĂȘtre un rĂ©flexe avant toute commande destructive â y compris sous pression, y compris sur vos propres scripts.
La rĂšgle
-WhatIf simule l'exécution d'une commande sans rien modifier. Il affiche ce qui serait fait. C'est gratuit, ça prend quelques secondes, et ça évite la plupart des incidents AD.
Dix points à intégrer comme réflexes :
-WhatIfavant toute commande destructive.- Ne pas faire confiance mĂȘme Ă ses propres scripts.
- Vérifier la portée d'une action avant exécution.
- Documenter ce que
-WhatIfmontre quand c'est utile. - Jamais de
Remove-*sans-WhatIfd'abord. - Garder son sang-froid sous pression.
- Partager le réflexe avec les collÚgues.
- Pas honte de double-vérifier.
-WhatIfest un gain de temps net, pas une perte.- Vendredi 17h est le moment statistiquement le plus risqué.
Trois incidents typiques évitables
Cas 1 â Suppression en masse non intentionnelle
# Intention:
Get-Mailbox -ResultSize 10 | Remove-Mailbox
# Exécuté en réalité (oubli de filtre):
Get-Mailbox -ResultSize Unlimited | Remove-Mailbox
Résultat : milliers de boßtes mail supprimées. Restauration : plusieurs jours.
Ce que -WhatIf aurait montré :
What if: Performing operation "Remove" on target "user1@..."
What if: Performing operation "Remove" on target "user2@..."
... (plusieurs milliers de lignes)
Le scroll seul aurait alerté l'admin.
Cas 2 â Variable mal initialisĂ©e
# Intention: nettoyer une OU de test
Remove-ADOrganizationalUnit -Identity "OU=Test,DC=company,DC=com" -Recursive
# Réalité: $ouToDelete pointait vers OU=Users
Remove-ADOrganizationalUnit -Identity $ouToDelete -Recursive
Résultat : suppression de la production. -WhatIf aurait affiché le vrai contenu de la variable.
Cas 3 â TargetPath vide
Get-ADUser -Filter {Department -eq "Dev"} | Move-ADObject -TargetPath $newOU
# $newOU Ă©tait null â tous les devs dĂ©placĂ©s vers la racine du domaine
Permissions cassées, applications down. -WhatIf aurait affiché TargetPath: DC=company,DC=com immédiatement.
Mise en situation â vendredi 16h58
L'instructeur joue le rĂŽle de l'admin sous pression.
Email 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
Réflexe à éviter : "Script simple, je saute le -WhatIf cette fois."
Le script "rapide"
New-ADGroup -Name "GG-EU-Clients-Japon" -GroupScope Global -GroupCategory Security -Path "OU=Groups,OU=Ventes,OU=EU,DC=maxtec,DC=be"
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
Exécution
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
Le message final est vert, l'admin part en weekend.
Lundi matin
- Personne de l'équipe Ventes ne peut accéder aux dossiers clients
- Les groupes Ventes ont disparu
- Tentatives de connexion échouées en masse
Ce que -WhatIf aurait montré
New-ADGroup -Name "GG-EU-Clients-Japon" -WhatIf
# What if: Le groupe 'GG-EU-Clients-Japon' existe déjà et serait ignoré
Get-ADUser -Filter {Department -eq "Ventes"} | ForEach-Object {
Add-ADGroupMember -Identity "GG-EU-Clients-Japon" -Members $_.SamAccountName -WhatIf
}
# What if: Ajout de 'Victor' au groupe 'GG-EU-Clients-Japon'
# What if: Ajout de 'Vanessa' au groupe 'GG-EU-Clients-Japon'
# What if: ERREUR - Groupe 'GG-EU-Clients-Japon' non trouvé
L'incohérence (le groupe existe mais on ne peut pas y ajouter de membres) saute aux yeux. L'admin aurait creusé avant d'exécuter.
Lab â comprendre -WhatIf
Commandes qui supportent -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 le supportent pas
Les cmdlets de lecture seule (Get-*, Search-*) n'ont pas -WhatIf parce qu'elles ne modifient rien.
Get-ADUser -Identity Richard
Get-ADGroup -Filter {Name -like "GG-*"}
PiĂšge des commandes hybrides
# Get-ADUser n'a pas besoin de -WhatIf, mais Set-ADUser oui
Get-ADUser -Filter * | Set-ADUser -Department "Test" -WhatIf
# Sans le -WhatIf à la fin : tous les utilisateurs du domaine changent de département
Get-ADUser -Filter * | Set-ADUser -Department "Test"
Le -WhatIf se place sur la commande qui modifie, pas sur celle qui lit.
Lire un output -WhatIf
Sans -WhatIf (Ă ne pas faire pour tester) :
Remove-ADUser -Identity "CN=TestUser,OU=Users,OU=IT,OU=EU,DC=maxtec,DC=be"
# Aucun output, l'utilisateur est supprimé
Avec -WhatIf :
Remove-ADUser -Identity "CN=TestUser,OU=Users,OU=IT,OU=EU,DC=maxtec,DC=be" -WhatIf
# What if: Performing the operation "Remove" on target "CN=TestUser,OU=Users,OU=IT,OU=EU,DC=maxtec,DC=be"
Cas 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,..." to add member "CN=Ivan,..."
# What if: Performing operation "Add" on target "CN=GG-EU-IT-Users,..." to add member "CN=Ines,..."
Situations oĂč la pression monte
Le boss impatient
Réponse : "Trois secondes pour -WhatIf peuvent éviter trois jours de récupération." En général, ça passe.
Pendant que vous expliquez, exécutez le -WhatIf :
Get-ADUser -Filter {Department -eq "Stagiaires"} | Remove-ADUser -WhatIf
# What if: Remove CN=Alexandre.Martin,OU=Users,OU=Direction... â STOP
Une mauvaise sortie justifie immédiatement le délai.
"Je l'ai testé 100 fois en dev"
L'environnement de dev n'est pas l'environnement de prod. Filtres différents, données différentes, OUs différentes. -WhatIf obligatoire en production peu importe le nombre de runs précédents.
Le script du collĂšgue de confiance
Confiance â validation. Un script reçu sans avoir Ă©tĂ© lu ligne par ligne, c'est un script inconnu. Toujours -WhatIf.
Quiz â -WhatIf ou pas ?
A.
Get-ADUser -Identity Richard -Properties Department
Pas nĂ©cessaire â lecture seule.
B.
Set-ADUser -Identity Richard -Department "Direction"
NĂ©cessaire â modification.
C.
Get-ADUser -Filter {Name -like "Test*"} | Remove-ADUser
Obligatoire â suppression avec filtre = danger maximal.
D.
.\clean-old-accounts.ps1
Obligatoire â vous ne savez pas ce que le script contient tant que vous ne l'avez pas lu.
Test final
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, puis C avant exécution réelle.
Question 2
Script trouvé sur Stack Overflow avec 200 upvotes. PremiÚre exécution ?
- A) Exécuter directement
- B) Modifier pour votre environnement puis exécuter
- C) Ajouter
-WhatIfpartout et analyser l'output
Réponse : C. La popularité n'est pas un gage de sécurité pour votre environnement.
Question 3
Vendredi 17h45, script "urgent" du DG. Que faites-vous ?
- A) Exécuter rapidement
- B)
-WhatIfd'abord - C) Remettre Ă lundi
Réponse : B. La pression n'est pas une excuse pour ignorer la validation.
Workflow
1. Lire et comprendre la commande
2. Identifier l'impact potentiel
3. Ajouter -WhatIf sur toute commande destructive
4. Analyser l'output ligne par ligne
5. Vérifier que le scope correspond à l'intention
6. Si OK, relancer sans -WhatIf
7. Documenter ce qui a été fait
Exceptions Ă la rĂšgle
Aucune. Ni "testé en dev", ni "script simple", ni "urgence", ni "confiance collÚgue", ni "pression hiérarchique".
Récapitulatif
-WhatIf est un investissement, pas un coût :
- Quelques secondes par commande.
- Ăvite la majoritĂ© des incidents AD.
- Permet de relire l'intention avant l'action.
- Marche y compris sur vos propres scripts.
à retenir : mieux vaut un -WhatIf de trop qu'un désastre de trop peu.
Suite : Module 6 â GĂ©rer un incident AD (procĂ©dures break-glass).