Module 2 : Active Directory & GPO - L'Identité au Cœur
Objectif : Maîtriser Active Directory et les Group Policy Objects pour automatiser la gestion des identités et des configurations en entreprise.
Introduction : Arrêtez de Cliquer "New User"
Le Problème
┌─────────────────────────────────────────────────────────────┐
│ GESTION IDENTITÉS : LE CERCLE VICIEUX │
├─────────────────────────────────────────────────────────────┤
│ │
│ Lundi 9h : 5 nouveaux employés arrivent │
│ ──────────────────────────────────── │
│ 1. Ouvrir "Active Directory Users and Computers" │
│ 2. Right-click → New → User │
│ 3. Remplir 12 champs manuellement │
│ 4. Cliquer sur 5 onglets │
│ 5. Ajouter aux groupes un par un │
│ 6. Répéter x5 │
│ 7. Temps total : 45 minutes │
│ 8. Risque d'erreurs : 80% │
│ │
│ Résultat : Frustration, erreurs, incohérence │
│ │
└─────────────────────────────────────────────────────────────┘
La Solution : Automatisation PowerShell
Avec PowerShell :
# 5 nouveaux employés en 30 secondes
Import-Csv new_hires.csv | ForEach-Object {
New-ADUser -Name "$($_.Prenom) $($_.Nom)" `
-SamAccountName $_.Login `
-Path "OU=Users,OU=$($_.Site),DC=corp,DC=local" `
-AccountPassword (ConvertTo-SecureString "TempPass123!" -AsPlainText -Force) `
-Enabled $true -ChangePasswordAtLogon $true
Add-ADGroupMember -Identity "G_$($_.Site)_Users" -Members $_.Login
}
Résultat : - ✅ 30 secondes au lieu de 45 minutes - ✅ 0% d'erreurs (script validé une fois) - ✅ 100% consistant (même OU, mêmes groupes, mêmes conventions) - ✅ Auditable (le script est versionné dans Git)
Ce Que Vous Allez Apprendre
Dans ce module, vous allez :
- ✅ Comprendre l'architecture AD : Forest, Domain, OU, Sites
- ✅ Maîtriser le traitement des GPO : LSDOU (Local, Site, Domain, OU)
- ✅ Automatiser avec PowerShell : CRUD utilisateurs, groupes, GPO
- ✅ Créer un script d'onboarding : CSV → AD en une commande
Durée estimée : 4-5 heures
Section 1 : Architecture Active Directory
Vue d'Ensemble : Forest, Domain, OU
Active Directory organise les objets en hiérarchie logique.
graph TD
Forest["🌲 Forest: corp.com<br/>(Limite de sécurité ultime)"]
Forest --> Domain1["🏢 Domain: corp.com<br/>(Domaine racine)"]
Forest --> Domain2["🏢 Domain: paris.corp.com<br/>(Domaine enfant)"]
Domain1 --> OU_Root["📁 Organizational Units"]
OU_Root --> OU_Paris["📂 Paris"]
OU_Root --> OU_London["📂 London"]
OU_Root --> OU_Servers["📂 Servers"]
OU_Paris --> OU_Paris_Users["👥 Users<br/>(jdupont, mmartin)"]
OU_Paris --> OU_Paris_Computers["💻 Computers<br/>(PC-PARIS-01)"]
OU_Paris --> OU_Paris_Groups["👫 Groups<br/>(G_Paris_Users)"]
OU_London --> OU_London_Users["👥 Users<br/>(jsmith)"]
OU_London --> OU_London_Computers["💻 Computers<br/>(PC-LONDON-01)"]
OU_London --> OU_London_Groups["👫 Groups<br/>(G_London_Users)"]
OU_Servers --> OU_Servers_DC["🖥️ Domain Controllers"]
OU_Servers --> OU_Servers_App["🖥️ App Servers"]
style Forest fill:#4CAF50,stroke:#0e6b0e,color:#fff
style Domain1 fill:#2196F3,stroke:#005a9e,color:#fff
style Domain2 fill:#2196F3,stroke:#005a9e,color:#fff
style OU_Paris fill:#FF9800800800,stroke:#FF9800800,color:#fff
style OU_London fill:#FF9800800800,stroke:#FF9800800,color:#fff
style OU_Servers fill:#f44336,stroke:#a52a2a,color:#fff
Les Composants Expliqués
| Composant | Description | Analogie |
|---|---|---|
| Forest 🌲 | Limite de sécurité ultime. Ensemble de domaines partageant le même schéma AD. | Entreprise multi-nationales (Renault France + Renault UK = même forest) |
| Domain 🏢 | Unité d'administration. Contient users, computers, groups. Chaque domaine a ses propres DC. | Filiale d'une entreprise (corp.com, paris.corp.com) |
| Organizational Unit (OU) 📁 | Conteneur logique pour organiser les objets. Cible des GPO. | Dossiers dans un filesystem |
| Site 🌍 | Groupement physique basé sur la topologie réseau (réplication AD optimisée). | Bureau physique (Paris, London, New York) |
| Domain Controller (DC) 🖥️ | Serveur hébergeant la base AD. Authentifie via Kerberos. | Serveur d'identité |
Design d'OU : Géographie vs Fonction
Question : Comment organiser vos OU ?
Option 1 : Par Géographie (Recommandé pour multi-sites)
corp.com
├── Paris
│ ├── Users
│ ├── Computers
│ └── Groups
├── London
│ ├── Users
│ ├── Computers
│ └── Groups
└── Servers
├── Domain Controllers
└── App Servers
Avantages : - ✅ GPO par site (exemple : proxy Paris vs London) - ✅ Délégation par pays/région - ✅ Alignement avec la structure de l'entreprise
Option 2 : Par Fonction (Recommandé pour mono-site)
corp.com
├── IT
│ ├── Admins
│ └── Helpdesk
├── Finance
│ └── Users
├── HR
│ └── Users
└── Computers
├── Workstations
└── Servers
Avantages : - ✅ GPO par département (exemple : Finance = verrouillage USB) - ✅ Délégation par métier - ✅ Simplicité pour une seule localisation
Best Practice Microsoft
Ne créez pas plus de 5 niveaux d'OU.
Section 2 : GPO Processing - L'Ordre LSDOU
Qu'est-ce qu'une GPO ?
Group Policy Object (GPO) = Configuration as Code natif Windows.
Une GPO peut :
├── Configurer le fond d'écran corporate
├── Désactiver les ports USB
├── Mapper des lecteurs réseau (Z: → \\fileserver\share)
├── Installer des logiciels silencieusement
├── Configurer le proxy IE/Edge
├── Forcer le verrouillage écran après 5 min
├── Déployer des scripts au login/logoff
└── Appliquer des politiques de mot de passe
L'Ordre de Traitement : LSDOU
Les GPO sont appliquées dans un ordre précis : Local → Site → Domain → OU.
flowchart TD
Start[💻 PC démarre<br/>User se connecte] --> L[1️⃣ Local GPO<br/>C:\Windows\System32\GroupPolicy]
L --> S[2️⃣ Site GPO<br/>Exemple: Site Paris]
S --> D[3️⃣ Domain GPO<br/>Exemple: corp.com]
D --> O1[4️⃣ OU Parent<br/>Exemple: OU=Paris]
O1 --> O2[5️⃣ OU Enfant<br/>Exemple: OU=Users,OU=Paris]
O2 --> Conflict{Conflit ?}
Conflict -->|Non| Apply[✅ Toutes les GPO<br/>appliquées cumulativement]
Conflict -->|Oui| LastWins[⚠️ Last Writer Wins<br/>OU enfant gagne]
Apply --> Result[💻 Configuration finale]
LastWins --> Result
style Start fill:#2196F3,stroke:#005a9e,color:#fff
style L fill:#9C27B0,stroke:#495057,color:#fff
style S fill:#FF9800800800,stroke:#FF9800800,color:#fff
style D fill:#4CAF50,stroke:#0e6b0e,color:#fff
style O1 fill:#f44336,stroke:#a52a2a,color:#fff
style O2 fill:#f44336,stroke:#a52a2a,color:#fff
style Result fill:#FF9800800800,stroke:#b8860b,color:#000
Règles de Priorité & Héritage
| Ordre | Niveau | Priorité | Exemple |
|---|---|---|---|
| 1 | Local | Plus faible | GPO locale sur le PC (rarement utilisée) |
| 2 | Site | Faible | GPO pour "Site Paris" (proxy spécifique) |
| 3 | Domain | Moyenne | GPO pour "corp.com" (config générale) |
| 4 | OU Parent | Forte | GPO pour "OU=Paris" |
| 5 | OU Enfant | Plus forte | GPO pour "OU=Users,OU=Paris" ← GAGNE |
Cas Pratique : Conflit de GPO
Scénario :
- GPO Domain : Fond d'écran = Logo Entreprise
- GPO OU=Paris : Fond d'écran = Skyline Paris
Question : Quel fond d'écran aura un utilisateur dans OU=Users,OU=Paris ?
Réponse : Skyline Paris (OU Parent gagne sur Domain).
Options Avancées
1. Enforced (Appliqué) :
GPO Domain = "No USB" [Enforced]
GPO OU=IT = "Allow USB"
Résultat : USB bloqué (Enforced ignore LSDOU)
2. Block Inheritance :
Attention : Enforced vs Block Inheritance
- Enforced : Force une GPO à s'appliquer (ignore Block Inheritance)
- Block Inheritance : Bloque toutes les GPO parentes (sauf Enforced)
Enforced gagne TOUJOURS.
Section 3 : Pratique PowerShell Active Directory
Prérequis : Module ActiveDirectory
# Installer RSAT (si Windows 10/11)
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
# Importer le module
Import-Module ActiveDirectory
# Vérifier la connexion au domaine
Get-ADDomain
# Output attendu :
# DistinguishedName : DC=corp,DC=local
# DNSRoot : corp.local
# Name : corp
CRUD Utilisateurs
Créer un Utilisateur (Create)
# Création basique
New-ADUser -Name "Jean Dupont" -SamAccountName "jdupont" -Enabled $true
# Création complète et sécurisée
$password = ConvertTo-SecureString "TempPass123!" -AsPlainText -Force
New-ADUser `
-Name "Jean Dupont" `
-GivenName "Jean" `
-Surname "Dupont" `
-SamAccountName "jdupont" `
-UserPrincipalName "jdupont@corp.local" `
-Path "OU=Users,OU=Paris,DC=corp,DC=local" `
-AccountPassword $password `
-Enabled $true `
-ChangePasswordAtLogon $true `
-Department "IT" `
-Title "SysAdmin" `
-EmailAddress "jdupont@corp.local"
# Vérifier la création
Get-ADUser -Identity jdupont -Properties Department, Title, EmailAddress |
Select-Object Name, Department, Title, EmailAddress
Modifier un Utilisateur (Update)
# Modifier des attributs
Set-ADUser -Identity jdupont -Department "Security" -Title "Security Engineer"
# Modifier plusieurs attributs
Set-ADUser -Identity jdupont -Replace @{
telephoneNumber = "+33 1 23 45 67 89"
physicalDeliveryOfficeName = "Paris - Floor 3"
mobile = "+33 6 12 34 56 78"
}
# Désactiver un compte
Disable-ADAccount -Identity jdupont
# Activer un compte
Enable-ADAccount -Identity jdupont
# Réinitialiser le mot de passe
$newPassword = ConvertTo-SecureString "NewPass456!" -AsPlainText -Force
Set-ADAccountPassword -Identity jdupont -Reset -NewPassword $newPassword
# Forcer le changement de mot de passe à la prochaine connexion
Set-ADUser -Identity jdupont -ChangePasswordAtLogon $true
Rechercher des Utilisateurs (Read)
# ATTENTION : Performance critique !
# ❌ MAUVAIS (charge TOUS les users puis filtre)
Get-ADUser -Filter * | Where-Object { $_.Department -eq "IT" }
# ✅ BON (filtre côté serveur AD)
Get-ADUser -Filter 'Department -eq "IT"'
# Exemples de filtres
Get-ADUser -Filter 'Name -like "Jean*"'
Get-ADUser -Filter 'Enabled -eq $false'
Get-ADUser -Filter 'Department -eq "IT" -and Enabled -eq $true'
# Avec propriétés supplémentaires (par défaut, seules les propriétés de base sont retournées)
Get-ADUser -Identity jdupont -Properties *
Get-ADUser -Filter * -Properties Department, Title, LastLogonDate |
Select-Object Name, Department, Title, LastLogonDate
# Recherche dans une OU spécifique
Get-ADUser -Filter * -SearchBase "OU=Users,OU=Paris,DC=corp,DC=local"
# Utilisateurs créés cette semaine
$date = (Get-Date).AddDays(-7)
Get-ADUser -Filter * -Properties Created |
Where-Object { $_.Created -gt $date } |
Select-Object Name, SamAccountName, Created
Performance : Filtrer Côté Serveur
Supprimer un Utilisateur (Delete)
# Supprimer un utilisateur (avec confirmation)
Remove-ADUser -Identity jdupont
# Supprimer sans confirmation
Remove-ADUser -Identity jdupont -Confirm:$false
# Supprimer avec vérification préalable
Get-ADUser -Identity jdupont
Remove-ADUser -Identity jdupont -Confirm:$false
Gestion des Groupes
Créer et Gérer des Groupes
# Créer un groupe de sécurité Global
New-ADGroup -Name "G_Paris_Users" `
-GroupScope Global `
-GroupCategory Security `
-Path "OU=Groups,OU=Paris,DC=corp,DC=local" `
-Description "Tous les utilisateurs du site Paris"
# Types de groupes
# -GroupScope : DomainLocal, Global, Universal
# -GroupCategory : Security (droits d'accès), Distribution (email uniquement)
| GroupScope | Portée | Usage |
|---|---|---|
| DomainLocal | Domaine local uniquement | Droits sur des ressources locales (partages, imprimantes) |
| Global | Tout le forest | Organiser des utilisateurs par fonction/site |
| Universal | Tout le forest | Groupes cross-domain (coûteux en réplication) |
Ajouter / Retirer des Membres
# Ajouter un membre
Add-ADGroupMember -Identity "G_Paris_Users" -Members jdupont
# Ajouter plusieurs membres
Add-ADGroupMember -Identity "G_Paris_Users" -Members jdupont, mmartin, pdurand
# Retirer un membre
Remove-ADGroupMember -Identity "G_Paris_Users" -Members jdupont -Confirm:$false
# Ajouter tous les users d'une OU au groupe
Get-ADUser -Filter * -SearchBase "OU=Users,OU=Paris,DC=corp,DC=local" |
ForEach-Object {
Add-ADGroupMember -Identity "G_Paris_Users" -Members $_.SamAccountName
}
Lister les Membres
# Membres directs
Get-ADGroupMember -Identity "G_Paris_Users" |
Select-Object Name, SamAccountName, objectClass
# Membres récursifs (inclut les groupes imbriqués)
Get-ADGroupMember -Identity "G_Paris_Users" -Recursive |
Select-Object Name, SamAccountName, objectClass
# Compter les membres
$count = (Get-ADGroupMember -Identity "G_Paris_Users" -Recursive).Count
Write-Host "G_Paris_Users contient $count membres"
Groupes d'un Utilisateur
# Groupes directs d'un utilisateur
Get-ADPrincipalGroupMembership -Identity jdupont |
Select-Object Name, GroupScope, GroupCategory
# Avec le DN complet (utile pour scripts)
Get-ADUser -Identity jdupont -Properties MemberOf |
Select-Object -ExpandProperty MemberOf
Gestion des GPO avec PowerShell
Module GroupPolicy
# Installer RSAT GPO Management (si Windows 10/11)
Add-WindowsCapability -Online -Name Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0
# Importer le module
Import-Module GroupPolicy
# Lister toutes les GPO
Get-GPO -All | Select-Object DisplayName, CreationTime, ModificationTime
Créer une GPO
# Créer une GPO
New-GPO -Name "GPO_Paris_Wallpaper" -Comment "Déploie le fond d'écran Paris"
# Créer et lier à une OU en une commande
New-GPO -Name "GPO_Paris_Proxy" | New-GPLink -Target "OU=Paris,DC=corp,DC=local"
# Vérifier la création
Get-GPO -Name "GPO_Paris_Proxy"
Lier une GPO à une OU
# Lier une GPO existante
New-GPLink -Name "GPO_Paris_Wallpaper" -Target "OU=Users,OU=Paris,DC=corp,DC=local"
# Lier avec ordre de priorité (LinkOrder 1 = plus haute priorité)
New-GPLink -Name "GPO_Paris_Wallpaper" `
-Target "OU=Users,OU=Paris,DC=corp,DC=local" `
-LinkEnabled Yes `
-Order 1
# Lier avec Enforced
New-GPLink -Name "GPO_Security_NoUSB" `
-Target "OU=Users,DC=corp,DC=local" `
-Enforced Yes
Lister les GPO Liées à une OU
# GPO liées à une OU
Get-GPInheritance -Target "OU=Users,OU=Paris,DC=corp,DC=local"
# Output détaillé
(Get-GPInheritance -Target "OU=Users,OU=Paris,DC=corp,DC=local").GpoLinks |
Select-Object DisplayName, Enabled, Enforced, Order
Générer un Rapport GPO
# Rapport HTML d'une GPO
Get-GPOReport -Name "GPO_Paris_Proxy" -ReportType Html -Path "C:\Reports\GPO_Paris_Proxy.html"
# Rapport XML (parsable)
Get-GPOReport -Name "GPO_Paris_Proxy" -ReportType Xml -Path "C:\Reports\GPO_Paris_Proxy.xml"
# Rapport de toutes les GPO
Get-GPOReport -All -ReportType Html -Path "C:\Reports\All_GPO_Report.html"
Supprimer une GPO
# Supprimer une GPO (avec confirmation)
Remove-GPO -Name "GPO_Old_Policy"
# Supprimer sans confirmation
Remove-GPO -Name "GPO_Old_Policy" -Confirm:$false
Exercice Pratique : L'Onboarding Automatisé
Contexte
Vous êtes admin système chez TechCorp. Le département RH vous envoie un fichier CSV avec 5 nouveaux employés qui démarrent lundi.
Exigences :
- ✅ Créer les utilisateurs dans l'OU appropriée (
OU=Users,OU=<Site>) - ✅ Ajouter chaque user au groupe
G_<Site>_Users - ✅ Mot de passe temporaire :
Welcome2024! - ✅ Forcer le changement de mot de passe à la première connexion
- ✅ Activer le compte immédiatement
- ✅ Définir les attributs : Department, Title, EmailAddress
Fichier CSV Fourni : new_hires.csv
Prenom,Nom,Login,Site,Department,Title
Jean,Dupont,jdupont,Paris,IT,SysAdmin
Marie,Martin,mmartin,Paris,Finance,Analyst
Pierre,Durand,pdurand,London,IT,Network Engineer
Sophie,Bernard,sbernard,London,HR,HR Manager
Lucas,Petit,lpetit,Paris,Marketing,Marketing Manager
Mission
Écrire un script PowerShell Onboard-NewHires.ps1 qui :
- Lit le fichier
new_hires.csv - Pour chaque ligne :
- Crée l'utilisateur dans
OU=Users,OU=<Site>,DC=corp,DC=local - Définit le mot de passe temporaire
- Configure les attributs (Department, Title, EmailAddress)
- Active le compte
- Force le changement de mot de passe
- Ajoute l'utilisateur au groupe
G_<Site>_Users - Affiche un rapport de confirmation
Contraintes :
- Le script doit être idempotent (peut être exécuté plusieurs fois sans erreur)
- Le script doit gérer les erreurs (si user existe déjà, skip)
- Le script doit afficher un résumé final
Solution Complète
Fichier CSV : new_hires.csv
Créez ce fichier dans C:\Scripts\new_hires.csv :
Prenom,Nom,Login,Site,Department,Title
Jean,Dupont,jdupont,Paris,IT,SysAdmin
Marie,Martin,mmartin,Paris,Finance,Analyst
Pierre,Durand,pdurand,London,IT,Network Engineer
Sophie,Bernard,sbernard,London,HR,HR Manager
Lucas,Petit,lpetit,Paris,Marketing,Marketing Manager
Script PowerShell : Onboard-NewHires.ps1
# ============================================================
# Onboard-NewHires.ps1
# Automatisation de l'onboarding des nouveaux employés
# ============================================================
# Prérequis
Import-Module ActiveDirectory
# Configuration
$CSVPath = "C:\Scripts\new_hires.csv"
$DomainDN = "DC=corp,DC=local"
$TempPassword = "Welcome2024!"
$SecurePassword = ConvertTo-SecureString $TempPassword -AsPlainText -Force
# Compteurs pour le rapport
$successCount = 0
$skipCount = 0
$errorCount = 0
$errors = @()
Write-Host "`n=== Onboarding Nouveaux Employés ===" -ForegroundColor Cyan
Write-Host "Fichier CSV : $CSVPath" -ForegroundColor Gray
Write-Host "Domaine : $DomainDN`n" -ForegroundColor Gray
# Lecture du CSV
try {
$newHires = Import-Csv -Path $CSVPath -Encoding UTF8
} catch {
Write-Host "❌ ERREUR : Impossible de lire le fichier CSV" -ForegroundColor Red
Write-Host $_.Exception.Message -ForegroundColor Red
exit 1
}
# Traitement de chaque employé
foreach ($hire in $newHires) {
$displayName = "$($hire.Prenom) $($hire.Nom)"
$samAccountName = $hire.Login
$site = $hire.Site
$ouPath = "OU=Users,OU=$site,$DomainDN"
$groupName = "G_$($site)_Users"
$upn = "$samAccountName@corp.local"
$email = "$samAccountName@corp.local"
Write-Host "Traitement : $displayName ($samAccountName)..." -ForegroundColor Yellow
# Vérifier si l'utilisateur existe déjà
$existingUser = Get-ADUser -Filter "SamAccountName -eq '$samAccountName'" -ErrorAction SilentlyContinue
if ($existingUser) {
Write-Host " ⚠ User existe déjà, skip." -ForegroundColor DarkYellow
$skipCount++
continue
}
# Créer l'utilisateur
try {
New-ADUser `
-Name $displayName `
-GivenName $hire.Prenom `
-Surname $hire.Nom `
-SamAccountName $samAccountName `
-UserPrincipalName $upn `
-Path $ouPath `
-AccountPassword $SecurePassword `
-Enabled $true `
-ChangePasswordAtLogon $true `
-Department $hire.Department `
-Title $hire.Title `
-EmailAddress $email `
-ErrorAction Stop
Write-Host " ✓ User créé dans $ouPath" -ForegroundColor Green
# Ajouter au groupe
try {
Add-ADGroupMember -Identity $groupName -Members $samAccountName -ErrorAction Stop
Write-Host " ✓ Ajouté au groupe $groupName" -ForegroundColor Green
} catch {
Write-Host " ⚠ Groupe $groupName introuvable, skip." -ForegroundColor DarkYellow
}
$successCount++
} catch {
Write-Host " ❌ ERREUR lors de la création" -ForegroundColor Red
Write-Host " $($_.Exception.Message)" -ForegroundColor Red
$errorCount++
$errors += @{User=$displayName; Error=$_.Exception.Message}
}
}
# Rapport final
Write-Host "`n=== Rapport Final ===" -ForegroundColor Cyan
Write-Host "✓ Créés avec succès : $successCount" -ForegroundColor Green
Write-Host "⚠ Skippés (existants) : $skipCount" -ForegroundColor Yellow
Write-Host "❌ Erreurs : $errorCount" -ForegroundColor Red
if ($errorCount -gt 0) {
Write-Host "`nDétail des erreurs :" -ForegroundColor Red
foreach ($err in $errors) {
Write-Host " - $($err.User) : $($err.Error)" -ForegroundColor Red
}
}
Write-Host "`n=== Onboarding Terminé ===" -ForegroundColor Cyan
Prérequis : Créer les OU et Groupes
Avant d'exécuter le script, créez la structure AD :
# Créer les OU
New-ADOrganizationalUnit -Name "Paris" -Path "DC=corp,DC=local"
New-ADOrganizationalUnit -Name "London" -Path "DC=corp,DC=local"
New-ADOrganizationalUnit -Name "Users" -Path "OU=Paris,DC=corp,DC=local"
New-ADOrganizationalUnit -Name "Users" -Path "OU=London,DC=corp,DC=local"
New-ADOrganizationalUnit -Name "Groups" -Path "OU=Paris,DC=corp,DC=local"
New-ADOrganizationalUnit -Name "Groups" -Path "OU=London,DC=corp,DC=local"
# Créer les groupes
New-ADGroup -Name "G_Paris_Users" `
-GroupScope Global `
-GroupCategory Security `
-Path "OU=Groups,OU=Paris,DC=corp,DC=local"
New-ADGroup -Name "G_London_Users" `
-GroupScope Global `
-GroupCategory Security `
-Path "OU=Groups,OU=London,DC=corp,DC=local"
Exécution du Script
# Exécuter le script
Set-ExecutionPolicy Bypass -Scope Process -Force
C:\Scripts\Onboard-NewHires.ps1
Output attendu :
=== Onboarding Nouveaux Employés ===
Fichier CSV : C:\Scripts\new_hires.csv
Domaine : DC=corp,DC=local
Traitement : Jean Dupont (jdupont)...
✓ User créé dans OU=Users,OU=Paris,DC=corp,DC=local
✓ Ajouté au groupe G_Paris_Users
Traitement : Marie Martin (mmartin)...
✓ User créé dans OU=Users,OU=Paris,DC=corp,DC=local
✓ Ajouté au groupe G_Paris_Users
Traitement : Pierre Durand (pdurand)...
✓ User créé dans OU=Users,OU=London,DC=corp,DC=local
✓ Ajouté au groupe G_London_Users
Traitement : Sophie Bernard (sbernard)...
✓ User créé dans OU=Users,OU=London,DC=corp,DC=local
✓ Ajouté au groupe G_London_Users
Traitement : Lucas Petit (lpetit)...
✓ User créé dans OU=Users,OU=Paris,DC=corp,DC=local
✓ Ajouté au groupe G_Paris_Users
=== Rapport Final ===
✓ Créés avec succès : 5
⚠ Skippés (existants) : 0
❌ Erreurs : 0
=== Onboarding Terminé ===
Validation
# Vérifier les utilisateurs créés
Get-ADUser -Filter * -SearchBase "OU=Users,OU=Paris,DC=corp,DC=local" |
Select-Object Name, SamAccountName, Enabled, ChangePasswordAtLogon
# Vérifier les membres du groupe
Get-ADGroupMember -Identity "G_Paris_Users" |
Select-Object Name, SamAccountName
# Vérifier les propriétés d'un user
Get-ADUser -Identity jdupont -Properties * |
Select-Object Name, Department, Title, EmailAddress, ChangePasswordAtLogon
Résultat attendu :
Name : Jean Dupont
Department : IT
Title : SysAdmin
EmailAddress : jdupont@corp.local
ChangePasswordAtLogon : True
Améliorations Possibles
1. Logging dans un fichier :
$logFile = "C:\Scripts\Onboarding_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
Start-Transcript -Path $logFile
# ... script ...
Stop-Transcript
2. Notification Email :
Send-MailMessage -From "admin@corp.local" `
-To "rh@corp.local" `
-Subject "Onboarding : $successCount users créés" `
-Body "Détails : voir pièce jointe" `
-Attachments $logFile `
-SmtpServer "smtp.corp.local"
3. Intégration CI/CD (GitLab CI) :
Conclusion du Module 2
Ce Que Vous Avez Appris
Dans ce module, vous avez maîtrisé :
- ✅ Architecture AD : Forest, Domain, OU, Sites, design organisationnel
- ✅ GPO Processing : LSDOU (Local, Site, Domain, OU), Enforced, Block Inheritance
- ✅ PowerShell AD : CRUD utilisateurs, gestion des groupes, création de GPO
- ✅ Automatisation : Script d'onboarding CSV → AD en 30 secondes
Points Clés à Retenir
Les 5 Commandements de l'Admin AD
- Ne jamais créer un user manuellement (PowerShell + CSV = reproductible)
- Organiser les OU par Géographie OU Fonction (pas plus de 5 niveaux)
- Comprendre LSDOU (OU enfant gagne, sauf Enforced)
- Filtrer côté serveur (
Get-ADUser -Filter 'Dept -eq "IT"'pasWhere-Object) - Versionner vos scripts (Git pour les scripts AD et GPO)
Prochaine Étape
Vous êtes maintenant prêt à passer au Module 3 : Sécurité & Hardening AD où vous apprendrez à :
- Sécuriser AD contre Pass-the-Hash, Kerberoasting, DCSync
- Implémenter le Tiering Model (Tier 0/1/2)
- Déployer LAPS (Local Administrator Password Solution)
- Auditer AD avec des événements 4624, 4625, 4720, 4728
- Tester la sécurité avec BloodHound
Ressources Complémentaires
← Retour au Module 1 | Continuer vers Module 3 : Sécurité & Hardening →
Navigation
| ← Module 1 : Modern Admin - Le Serveur ... | Module 3 : Sécurité & Hardening - Déf... → |