Module 1 — Comment travaillent les admins en 2025
Durée: 2h00 | Prérequis: Chapitres 9.0-9.3 complétés
Objectif
À la fin de ce module, vous aurez une image réaliste de la façon dont les admins PowerShell travaillent au quotidien — par opposition à ce que les livres laissent entendre.
Le point de départ
Trois idées reçues à corriger avant d'aller plus loin :
- Les pros ne mémorisent pas toute la syntaxe. Ils savent valider et adapter rapidement.
- Utiliser Google ou une IA n'est pas tricher. Ne pas utiliser les outils disponibles, c'est juste être lent.
- On n'écrit pas tout from scratch. On lit, on adapte, on teste.
Ce module est construit autour de cette réalité.
Démo en direct — un lundi typique (30 min)
L'instructeur travaille en temps réel devant la classe.
Ticket #2847 — "Richard ne peut pas se connecter"
1. Je ne connais pas la syntaxe exacte par cœur.
# Recherche Google: "PowerShell check if AD user is locked out"
2. Je trouve un exemple et je l'adapte à maxtec.be :
Get-ADUser -Identity Richard -Properties LockedOut, LastBadPasswordAttempt, BadPwdCount
# Résultat:
DistinguishedName : CN=Richard,OU=Users,OU=RH,OU=EU,DC=maxtec,DC=be
Enabled : True
GivenName : Richard
LockedOut : False
BadPwdCount : 0
LastBadPasswordAttempt :
Name : Richard
SamAccountName : Richard
UserPrincipalName : Richard@maxtec.be
3. J'analyse.
# Compte actif et non verrouillé. Le problème est ailleurs.
Get-ADPrincipalGroupMembership -Identity Richard | Select-Object Name
Name
----
Domain Users
GG-EU-RH-Users
4. Je documente dans le ticket.
RÉSOLUTION TICKET #2847
- Compte Richard: actif, non verrouillé
- Membre de: Domain Users, GG-EU-RH-Users
- Cause probable: réseau ou poste client
- Escalade niveau 2 réseau
Ce qu'il faut retenir
On cherche, on adapte, on teste, on documente. Aucun admin ne retient 500 cmdlets. La valeur ajoutée, c'est de comprendre ce qu'on fait — pas de tout savoir par cœur.
Les compétences qui comptent vraiment
Lecture critique d'un script trouvé en ligne
Voici un script trouvé sur Reddit — "Nettoyer comptes inactifs" :
Get-ADUser -Filter * | Where-Object {
$_.LastLogonDate -lt (Get-Date).AddDays(-90) -and
$_.Enabled -eq $true
} | Disable-ADAccount
Write-Host "Comptes désactivés avec succès!"
Avant de toucher à ça, quatre questions :
- Portée — ça affecte tous les utilisateurs du domaine ?
- Sécurité — quels comptes critiques doivent être exclus ?
- Validation — comment je vérifie avant d'exécuter ?
- Rollback — comment j'annule si erreur ?
Version adaptée pour maxtec.be :
$dateLimit = (Get-Date).AddDays(-90)
$searchBase = "OU=EU,DC=maxtec,DC=be"
# 1. Voir d'abord ce qui serait affecté
Get-ADUser -Filter * -SearchBase $searchBase -Properties LastLogonDate |
Where-Object {
$_.LastLogonDate -lt $dateLimit -and
$_.Enabled -eq $true -and
$_.SamAccountName -notlike "*admin*"
} |
Select-Object Name, LastLogonDate, Department |
Format-Table -AutoSize
# 2. Ensuite, simuler avec -WhatIf
Get-ADUser -Filter * -SearchBase $searchBase -Properties LastLogonDate |
Where-Object {
$_.LastLogonDate -lt $dateLimit -and
$_.Enabled -eq $true -and
$_.SamAccountName -notlike "*admin*"
} |
Disable-ADAccount -WhatIf
Utilisation d'une IA comme assistant
Démo ChatGPT (ou Windsurf, Cursor, peu importe) en direct.
Prompt :
Crée un script PowerShell pour Active Directory qui:
- Trouve tous les utilisateurs du département "RH"
- Qui n'ont pas changé leur mot de passe depuis 6 mois
- Affiche leur nom et date de dernier changement
- Inclut validations de sécurité et -WhatIf
- Pour le domaine maxtec.be
Réponse type :
# Script généré par IA — à valider avant usage
Import-Module ActiveDirectory
$dateLimit = (Get-Date).AddDays(-180)
$searchBase = "OU=RH,OU=EU,DC=maxtec,DC=be"
try {
if (-not (Get-Module ActiveDirectory)) {
throw "Module ActiveDirectory non disponible"
}
$utilisateursRH = Get-ADUser -Filter {Department -eq "RH"} -SearchBase $searchBase `
-Properties PasswordLastSet, Department -ErrorAction Stop
$utilisateursMotDePasseAncien = $utilisateursRH | Where-Object {
$_.PasswordLastSet -lt $dateLimit -and $_.Enabled -eq $true
}
if ($utilisateursMotDePasseAncien.Count -eq 0) {
Write-Host "Aucun utilisateur RH avec mot de passe ancien trouvé." -ForegroundColor Green
} else {
Write-Host "Utilisateurs RH avec mot de passe > 6 mois:" -ForegroundColor Yellow
$utilisateursMotDePasseAncien | Select-Object Name, PasswordLastSet | Format-Table -AutoSize
}
}
catch {
Write-Error "Erreur lors de l'exécution: $($_.Exception.Message)"
}
Analyse critique :
- Bon : gestion d'erreurs, SearchBase ciblée, lecture seule.
- À surveiller : le filtre
Department -eq "RH"ne marche que si la propriétéDepartmentest renseignée. Vérifiez dans Utilisateurs et ordinateurs Active Directory. Si elle est vide sur votre lab, exécutezscripts/Patch-UserDepartments.ps1sur le DC. - À améliorer : ajouter exclusion des comptes de service.
Exercice 1.1 (15 min)
Mission : Trouver tous les utilisateurs du département IT de maxtec.be.
- Sans regarder vos notes, utilisez Google ou une IA pour trouver la syntaxe.
- Adaptez à l'infrastructure maxtec.be.
- Testez sur votre labo.
- Documentez le résultat.
Solutions possibles :
# Méthode 1: par SearchBase
Get-ADUser -Filter * -SearchBase "OU=IT,OU=EU,DC=maxtec,DC=be" |
Select-Object Name, SamAccountName, Enabled
# Méthode 2: par propriété Department
Get-ADUser -Filter {Department -eq "IT"} -Properties Department |
Select-Object Name, SamAccountName, Department, Enabled
# Comparer les deux résultats
Chercher efficacement (20 min)
Templates de recherche qui fonctionnent
"PowerShell Active Directory [action]"
"Get-ADUser [critère] example"
"PowerShell AD [object] properties"
"Set-ADUser [property] bulk"
Exemples concrets :
PowerShell Active Directory find users by departmentGet-ADUser locked out examplePowerShell AD group members bulk add
Sources fiables (par ordre)
- docs.microsoft.com — documentation officielle
- Stack Overflow — à valider avant utilisation
- Reddit r/PowerShell — cas réels, toujours à adapter
- TechNet / Spiceworks — à comprendre avant d'exécuter
Signaux d'alarme à éviter
- Scripts sans commentaires
Get-ADUser -Filter *sans limitationsRemove-*sans-WhatIf- Mots de passe en dur
- Scripts venant de sites douteux (archives
.zip,.rar)
Exercice — support niveau 1
Vous recevez ces 3 tickets simultanément lundi matin :
- Ticket #2851 — Valeria ne peut pas accéder au dossier Ventes.
- Ticket #2852 — Nouveau stagiaire Charles2 doit avoir les mêmes droits que Charles.
- Ticket #2853 — Liste des utilisateurs qui n'ont jamais changé leur mot de passe.
Mission
- Trouvez la syntaxe (Google ou IA autorisés).
- Testez sur maxtec.be.
- Documentez votre approche.
- Présentez vos solutions.
Solutions proposées
#2851 — Droits de Valeria
# Vérifier les groupes actuels
Get-ADPrincipalGroupMembership -Identity Valeria | Select-Object Name
# Vérifier qui est dans Ventes-Admins
Get-ADGroupMember -Identity "GG-EU-Ventes-Admins" | Select-Object Name
# Si nécessaire, ajouter (avec -WhatIf d'abord)
Add-ADGroupMember -Identity "GG-EU-Ventes-Admins" -Members Valeria -WhatIf
#2852 — Copier les droits de Charles vers Charles2
$groupesCharles = Get-ADPrincipalGroupMembership -Identity Charles |
Select-Object -ExpandProperty Name
try {
Get-ADUser -Identity Charles2 -ErrorAction Stop
Write-Host "Charles2 existe" -ForegroundColor Green
} catch {
Write-Host "Charles2 n'existe pas — créer d'abord" -ForegroundColor Red
}
$groupesCharles | Where-Object { $_ -ne "Domain Users" } | ForEach-Object {
Add-ADGroupMember -Identity $_ -Members Charles2 -WhatIf
}
#2853 — Utilisateurs sans changement de mot de passe
Get-ADUser -Filter * -SearchBase "OU=EU,DC=maxtec,DC=be" -Properties PasswordLastSet, PasswordNeverExpires |
Where-Object {
($_.PasswordLastSet -eq $null -or $_.PasswordLastSet -lt (Get-Date "2020-01-01")) -and
$_.Enabled -eq $true
} |
Select-Object Name, SamAccountName, PasswordLastSet, PasswordNeverExpires |
Format-Table -AutoSize
Récapitulatif — cinq points à retenir
- Google et IA sont des outils professionnels. Les utiliser n'est pas de la paresse ; ne pas valider ce qu'on en tire l'est.
- Lecture > écriture. En pratique, 80 % du temps c'est comprendre et adapter du code existant, 20 % seulement écrire du neuf.
-WhatIfavant toute commande destructive. Sans exception.- Documentation au fil de l'eau. Commentaires dans les scripts, tickets résolus, historique des actions.
- Adapter au contexte. Un script générique n'est pas un script de production. maxtec.be ≠ contoso.com ≠ votre vraie infrastructure.
Check de compréhension
Avant le Module 2, assurez-vous de pouvoir répondre :
- Où cherchez-vous la syntaxe d'une commande PowerShell que vous ne connaissez pas ?
- Comment vérifiez-vous qu'un script trouvé en ligne est sûr pour votre environnement ?
- Quelle est la première chose à faire avant d'exécuter une commande
Remove-*?
Suite : Module 2 — Les 10 commandes essentielles pour le support niveau 1 et 2.