Module 2: Survie Tickets - Les 10 Commandes Qui Sauvent des Carrières
Durée: 2h00 | Prérequis: Module 1 complété
🎯 Objectif de ce Module
À la fin: Vous maîtriserez les 10 commandes PowerShell AD qui résolvent 90% des tickets de niveau 1 et 2.
🚨 Philosophie de Survie
Règle d'Or du Support
Le temps passe... on ne peut pas s'endormir!
Les 3 Types de Commandes
- 🔍 DIAGNOSTIC (Qu'est-ce qui ne va pas ?)
- 🔧 ACTION SÉCURISÉE (Réparer sans casser)
- 📋 VÉRIFICATION (Confirmer que c'est réparé)
🥇 Commande #1: "L'utilisateur ne peut pas se connecter"
Ticket le plus fréquent - Maîtrisez-le parfaitement
✅ VERSION SÉCURISÉE
# DIAGNOSTIC complet utilisateur
Get-ADUser -Identity Richard -Properties * | Select-Object `
Name, SamAccountName, Enabled, LockedOut,
PasswordExpired, PasswordNeverExpires,
LastLogonDate, BadPwdCount, AccountExpirationDate
# Résultat attendu maxtec.be:
Name : Richard
SamAccountName : Richard
Enabled : True
LockedOut : False
PasswordExpired : False
PasswordNeverExpires : True
LastLogonDate : 28/09/2025 14:30:15
BadPwdCount : 0
AccountExpirationDate :
⚠️ VERSION AVEC PRÉCAUTION
# Plus d'infos mais plus lent
Get-ADUser -Identity Richard -Properties *
# Récupère TOUTES les propriétés - lourd sur gros AD
🔴 VERSION DANGEREUSE - JAMAIS
# ☠️ JAMAIS faire ça
Get-ADUser -Filter * -Properties *
# Charge TOUS les utilisateurs avec TOUTES les propriétés = crash serveur
💡 TIPS DE SURVIE
- Toujours commencer par vérifier
EnabledetLockedOut - Si LockedOut = True:
Unlock-ADAccount -Identity Richard -WhatIf - Si Enabled = False: Chercher pourquoi avant de réactiver
🎯 EXERCICE PRATIQUE 2.1
Mission: Diagnostiquer pourquoi Valeria ne peut pas se connecter
# Votre commande ici:
# Réponse attendue:
Get-ADUser -Identity Valeria -Properties Enabled, LockedOut, PasswordExpired, LastLogonDate
🥈 Commande #2: "Trouver utilisateur par nom partiel"
"Je cherche l'utilisateur qui s'appelle quelque chose comme Valerie ou Valeria"
✅ VERSION SÉCURISÉE
# Recherche par prénom approximatif dans maxtec.be
Get-ADUser -Filter {GivenName -like "Val*"} -SearchBase "OU=EU,DC=maxtec,DC=be" |
Select-Object Name, SamAccountName, Department, Enabled
# Résultat maxtec.be:
Name SamAccountName Department Enabled
---- -------------- ---------- -------
Valentin Valentin Ventes True
Valeria Valeria Ventes True
⚠️ VERSION AVEC PRÉCAUTION
# Recherche dans Name (nom complet) - peut être lent
Get-ADUser -Filter {Name -like "*Val*"} -Properties Department
🔴 VERSION DANGEREUSE - JAMAIS
# ☠️ JAMAIS - regex sur tous les utilisateurs: ça implique chercher par un pattern sur tous les utilisateurs
Get-ADUser -Filter * | Where-Object {$_.Name -match ".*Val.*"}
💡 TIPS DE SURVIE
- Utilisez
-SearchBasepour limiter la portée - Préférez
GivenNameetSurnameàName - Wildcard
*fonctionne avec-like
🎯 EXERCICE PRATIQUE 2.2
Mission: Trouvez tous les utilisateurs dont le nom commence par "Ch"
# Votre solution:
Get-ADUser -Filter {Surname -like "Ch*"} -SearchBase "OU=EU,DC=maxtec,DC=be"
🥉 Commande #3: "Ajouter utilisateur à un groupe"
"Le nouvel employé a besoin d'accès au système comptabilité"
✅ VERSION SÉCURISÉE
# TOUJOURS -WhatIf d'abord !
Add-ADGroupMember -Identity "GG-EU-Compta-Users" -Members Charles -WhatIf
# Vérifier AVANT:
Write-Host "Membres actuels du groupe:"
Get-ADGroupMember -Identity "GG-EU-Compta-Users" | Select-Object Name
# Puis exécuter sans -WhatIf si OK:
Add-ADGroupMember -Identity "GG-EU-Compta-Users" -Members Charles
⚠️ VERSION AVEC PRÉCAUTION
# Ajout multiple - vérifier chaque utilisateur existe
$utilisateurs = @("Charles", "Cindy", "Charlotte")
$utilisateurs | ForEach-Object {
Add-ADGroupMember -Identity "GG-EU-Compta-Users" -Members $_ -WhatIf
}
🔴 VERSION DANGEREUSE - JAMAIS
# ☠️ Sans validation ni -WhatIf
Add-ADGroupMember -Identity "Admins du domaine" -Members Charles
# Peut donner des droits admin à tort !
💡 TIPS DE SURVIE
- Vérifiez le groupe de destination avant d'ajouter
- -WhatIf est obligatoire pour changements de droits
- Confirmez après ajout avec
Get-ADGroupMember
🎯 EXERCICE PRATIQUE 2.3
Mission: Ajouter Rebecca au groupe RH-Admins (avec toutes les sécurités)
# 1. Vérifier le groupe existe:
Get-ADGroup -Identity "GG-EU-RH-Admins"
# 2. Voir membres actuels:
Get-ADGroupMember -Identity "GG-EU-RH-Admins"
# 3. Ajouter avec -WhatIf:
Add-ADGroupMember -Identity "GG-EU-RH-Admins" -Members Rebecca -WhatIf
# 4. Si OK, exécuter:
Add-ADGroupMember -Identity "GG-EU-RH-Admins" -Members Rebecca
🏅 Commande #4: "Voir les groupes d'un utilisateur"
"Quels sont les droits de cet utilisateur ?"
✅ VERSION SÉCURISÉE
# Voir tous les groupes de Richard avec noms lisibles
Get-ADPrincipalGroupMembership -Identity Richard |
Select-Object Name, GroupScope, GroupCategory |
Sort-Object Name
# Résultat maxtec.be:
Name GroupScope GroupCategory
---- ---------- -------------
Domain Users Global Security
GG-EU-RH-Admins Global Security
GG-EU-RH-Users Global Security
⚠️ VERSION AVEC PRÉCAUTION
# Plus d'infos mais plus complexe à lire
Get-ADUser -Identity Richard -Properties MemberOf |
Select-Object -ExpandProperty MemberOf
# Affiche les DN complets (difficiles à lire)
🔴 VERSION DANGEREUSE - JAMAIS
# ☠️ Récursif sur tous les groupes - très lent
Get-ADGroup -Filter * | ForEach-Object {
Get-ADGroupMember -Identity $_ -Recursive
}
💡 TIPS DE SURVIE
- Get-ADPrincipalGroupMembership plus lisible que MemberOf
- Triez par nom pour faciliter lecture
- Documentez les droits critiques trouvés
🎯 EXERCICE PRATIQUE 2.4
Mission: Comparez les droits entre Ivan et Irene (tous deux IT)
# Droits Ivan:
Write-Host "=== GROUPES IVAN ===" -ForegroundColor Cyan
Get-ADPrincipalGroupMembership -Identity Ivan | Select-Object Name | Sort-Object Name
# Droits Irene:
Write-Host "=== GROUPES IRENE ===" -ForegroundColor Yellow
Get-ADPrincipalGroupMembership -Identity Irene | Select-Object Name | Sort-Object Name
🏆 Commande #5: "Désactiver compte utilisateur (départ)"
"Marie quitte la société vendredi, désactiver son compte"
✅ VERSION SÉCURISÉE
# TOUJOURS -WhatIf d'abord + documentation
$utilisateur = "Marie"
$raisonDepart = "Fin de contrat - $(Get-Date -Format 'dd/MM/yyyy')"
# 1. Vérifier l'utilisateur existe et est actif
Get-ADUser -Identity $utilisateur | Select-Object Name, Enabled, LastLogonDate
# 2. Désactiver avec -WhatIf
Set-ADUser -Identity $utilisateur -Enabled $false -Description $raisonDepart -WhatIf
# 3. Si OK, exécuter sans -WhatIf
Set-ADUser -Identity $utilisateur -Enabled $false -Description $raisonDepart
# 4. Vérifier résultat
Get-ADUser -Identity $utilisateur | Select-Object Name, Enabled, Description
⚠️ VERSION AVEC PRÉCAUTION
# Désactivation + retrait de tous les groupes (sauf Domain Users)
$groupes = Get-ADPrincipalGroupMembership -Identity $utilisateur |
Where-Object {$_.Name -ne "Domain Users"}
$groupes | ForEach-Object {
Remove-ADGroupMember -Identity $_.Name -Members $utilisateur -WhatIf
}
🔴 VERSION DANGEREUSE - JAMAIS
# ☠️ Supprimer directement sans désactiver d'abord
Remove-ADUser -Identity Marie -Confirm:$false
# Perte définitive de données + problèmes d'audit !
💡 TIPS DE SURVIE
- Désactiver ≠ Supprimer (désactivez d'abord)
- Documentez la raison dans Description
- Attendez 90 jours avant suppression définitive
🎖️ Commande #6: "Réinitialiser mot de passe"
"L'utilisateur a oublié son mot de passe"
✅ VERSION SÉCURISÉE
# Génération mot de passe temporaire sécurisé
$motDePasseTemp = "TempPass$(Get-Random -Minimum 1000 -Maximum 9999)!"
# 1. Vérifier l'utilisateur
Get-ADUser -Identity Charles | Select-Object Name, Enabled
# 2. Reset avec obligation de changer au prochain logon
Set-ADAccountPassword -Identity Charles -Reset -NewPassword (ConvertTo-SecureString $motDePasseTemp -AsPlainText -Force)
Set-ADUser -Identity Charles -ChangePasswordAtLogon $true
# 3. Documenter et communiquer de façon sécurisée
Write-Host "Mot de passe temporaire généré pour Charles" -ForegroundColor Green
Write-Host "Communiquer par canal sécurisé (pas email/chat)" -ForegroundColor Yellow
⚠️ VERSION AVEC PRÉCAUTION
# Permettre mots de passe utilisateur (moins sécurisé)
$nouveauMDP = Read-Host "Nouveau mot de passe" -AsSecureString
Set-ADAccountPassword -Identity Charles -Reset -NewPassword $nouveauMDP
🔴 VERSION DANGEREUSE - JAMAIS
# ☠️ Mot de passe en clair dans le script
Set-ADAccountPassword -Identity Charles -NewPassword "Password123"
# Visible dans historique PowerShell !
💡 TIPS DE SURVIE
- Toujours forcer changement au prochain logon
- Jamais de mots de passe en clair dans scripts
- Communiquer par canal sécurisé (téléphone, en personne)
🏵️ Commande #7: "Trouver comptes verrouillés"
"Plusieurs utilisateurs disent qu'ils ne peuvent pas se connecter"
✅ VERSION SÉCURISÉE
# Chercher tous les comptes verrouillés dans maxtec.be
Get-ADUser -Filter {LockedOut -eq $true} -SearchBase "OU=EU,DC=maxtec,DC=be" -Properties LockedOut, LastBadPasswordAttempt, BadPwdCount |
Select-Object Name, SamAccountName, LastBadPasswordAttempt, BadPwdCount |
Format-Table -AutoSize
# Si des comptes trouvés, déverrouiller avec -WhatIf d'abord
Get-ADUser -Filter {LockedOut -eq $true} -SearchBase "OU=EU,DC=maxtec,DC=be" |
Unlock-ADAccount -WhatIf
⚠️ VERSION AVEC PRÉCAUTION
# Inclure informations de sécurité avancées
Search-ADAccount -LockedOut -SearchBase "OU=EU,DC=maxtec,DC=be" |
Get-ADUser -Properties LastBadPasswordAttempt, BadPwdCount, LastLogonDate
🔴 VERSION DANGEREUSE - JAMAIS
# ☠️ Déverrouillage massif sans vérification
Get-ADUser -Filter {LockedOut -eq $true} | Unlock-ADAccount
# Peut masquer des tentatives d'intrusion !
💡 TIPS DE SURVIE
- Vérifiez la cause avant de déverrouiller
- Cherchez des patterns (même heure, même IP)
- Alertez la sécurité si nombreux comptes affectés
🎗️ Commande #8: "Créer nouvel utilisateur (onboarding)"
"Nouveau collaborateur lundi, préparer son compte"
✅ VERSION SÉCURISÉE
# Template création utilisateur maxtec.be
$prenom = "Marie"
$nom = "Dubois"
$department = "Ventes"
$motDePasseTemp = "Welcome$(Get-Random -Minimum 100 -Maximum 999)!"
# Construire les propriétés
$samAccountName = "$prenom.$nom".ToLower()
$userPrincipalName = "$samAccountName@maxtec.be"
$displayName = "$prenom $nom"
$ouPath = "OU=Users,OU=$department,OU=EU,DC=maxtec,DC=be"
# Vérifier que l'OU existe
try {
Get-ADOrganizationalUnit -Identity $ouPath -ErrorAction Stop
Write-Host "OU trouvée: $ouPath" -ForegroundColor Green
} catch {
Write-Error "OU non trouvée: $ouPath"
break
}
# Créer avec -WhatIf d'abord
$parametres = @{
Name = $displayName
SamAccountName = $samAccountName
UserPrincipalName = $userPrincipalName
GivenName = $prenom
Surname = $nom
DisplayName = $displayName
Department = $department
Path = $ouPath
AccountPassword = (ConvertTo-SecureString $motDePasseTemp -AsPlainText -Force)
ChangePasswordAtLogon = $true
Enabled = $true
}
New-ADUser @parametres -WhatIf
🎯 EXERCICE PRATIQUE 2.8
Mission: Créer l'utilisateur "Sophie Martin" pour le département IT
# Adaptez le script ci-dessus pour Sophie Martin, département IT
🥇 Commande #9: "Vérifier services et réplication AD"
"Les changements ne se propagent pas entre serveurs"
✅ VERSION SÉCURISÉE
# Vérifier santé de base du domaine
Get-ADDomain | Select-Object DNSRoot, DomainMode, PDCEmulator
# Vérifier les contrôleurs de domaine
Get-ADDomainController -Filter * | Select-Object Name, IPv4Address, OperatingSystem
# Test simple de réplication (création objet test)
$testOU = "OU=Test-Replication,DC=maxtec,DC=be"
New-ADOrganizationalUnit -Name "Test-Replication" -Path "DC=maxtec,DC=be" -WhatIf
💡 TIPS DE SURVIE
- Testez avant de blâmer la réplication
- Vérifiez les services AD sur le DC
- Attendez 15 minutes avant de paniquer
🏆 Commande #10: "Audit rapide des droits administrateurs"
"Qui a les droits admin dans notre domaine ?"
✅ VERSION SÉCURISÉE
# Vérifier membres des groupes privilégiés
$groupesPrivileges = @(
"Admins du domaine",
"Enterprise Admins",
"Schema Admins",
"Account Operators",
"Server Operators"
)
foreach ($groupe in $groupesPrivileges) {
try {
Write-Host "=== $groupe ===" -ForegroundColor Cyan
Get-ADGroupMember -Identity $groupe -ErrorAction Stop |
Select-Object Name, SamAccountName, ObjectClass |
Format-Table -AutoSize
} catch {
Write-Host "Groupe $groupe non trouvé ou inaccessible" -ForegroundColor Yellow
}
}
📋 Récapitulatif: Votre Kit de Survie
Les 10 Commandes Essentielles
- Diagnostic utilisateur:
Get-ADUser -Identity X -Properties * - Recherche partielle:
Get-ADUser -Filter {Name -like "*X*"} - Ajouter au groupe:
Add-ADGroupMember -Identity Y -Members X -WhatIf - Voir groupes:
Get-ADPrincipalGroupMembership -Identity X - Désactiver compte:
Set-ADUser -Identity X -Enabled $false -WhatIf - Reset password:
Set-ADAccountPassword -Identity X -Reset - Comptes verrouillés:
Get-ADUser -Filter {LockedOut -eq $true} - Créer utilisateur:
New-ADUser @parametres -WhatIf - Vérifier domaine:
Get-ADDomain - Audit admins:
Get-ADGroupMember -Identity "Admins du domaine"
🎯 Mémorisation: La Règle des 3
Pour chaque commande, retenez: 1. Diagnostic (que se passe-t-il ?) 2. Action (que faire ?) 3. Vérification (c'est réparé ?)
✅ Quiz de Survie (10 min)
Situation: Lundi 8h, 5 tickets urgents arrivent:
- "Charles ne peut plus se connecter depuis vendredi"
- "Nouvelle stagiaire Sophie doit accéder aux dossiers Ventes"
- "Liste des utilisateurs qui n'ont jamais changé leur mot de passe"
- "Marie part aujourd'hui, désactiver son compte"
- "Vérifier qui a les droits Domain Admin"
Mission: Écrivez LA commande PowerShell pour chaque ticket (1 ligne par ticket)
Réponses:
1. Get-ADUser -Identity Charles -Properties Enabled, LockedOut, LastLogonDate
2. Add-ADGroupMember -Identity "GG-EU-Ventes-Users" -Members Sophie -WhatIf
3. Get-ADUser -Filter * -Properties PasswordLastSet | Where-Object {$_.PasswordLastSet -eq $null}
4. Set-ADUser -Identity Marie -Enabled $false -WhatIf
5. Get-ADGroupMember -Identity "Admins du domaine"
🍽️ PAUSE DÉJEUNER OBLIGATOIRE 45 minutes - Digérer les commandes
🎯 Prochaine étape: Module 3 - L'IA comme Copilote (Prompts Sécurisés + Validation Critique)