Avant de déployer ces scripts
Testez-les systématiquement sur un poste pilote avant toute mise en production. Certains modifient des services Windows ou suppriment des fichiers. Adaptez les seuils à votre contexte et vérifiez le comportement obtenu avant d’étendre à l’ensemble du parc.
« Mon PC rame. » C’est le ticket le plus fréquent et le plus mal traité, parce qu’on y répond presque toujours par des suppositions plutôt que par des mesures. Cet article propose une méthode ordonnée et un script PowerShell qui collecte en une exécution tout ce qui permet de trancher.
Mesurer avant de supposer
Le réflexe habituel — vider les fichiers temporaires, désinstaller un logiciel au hasard, redémarrer — soigne parfois le symptôme sans jamais identifier la cause. Résultat : le ticket revient trois semaines plus tard.
1. Le disque : la cause dominante
L’espace libre
Sous 15 % d’espace libre, Windows peine à gérer son fichier d’échange et ses mises à jour. Sous 5 %, tout se dégrade.
Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" |
Select-Object DeviceID,
@{n='Total_Go';e={[math]::Round($_.Size/1GB,1)}},
@{n='Libre_Go';e={[math]::Round($_.FreeSpace/1GB,1)}},
@{n='Libre_Pct';e={[math]::Round(($_.FreeSpace/$_.Size)*100,1)}}
Le type de disque
Un disque mécanique sur un Windows 11 moderne est une cause de lenteur structurelle qu’aucun nettoyage ne corrigera.
Get-PhysicalDisk | Select-Object FriendlyName, MediaType, HealthStatus,
@{n='Taille_Go';e={[math]::Round($_.Size/1GB,0)}}
Si MediaType retourne HDD, le diagnostic s’arrête là : le remplacement par un SSD est la seule réponse utile. Surveillez aussi HealthStatus — un disque en état Warning ralentit avant de tomber en panne.
2. La mémoire
Le manque de RAM se traduit par une pagination intensive : le système écrit sur le disque ce qu’il ne peut garder en mémoire, et tout devient lent.
$os = Get-CimInstance Win32_OperatingSystem
$totalGo = [math]::Round($os.TotalVisibleMemorySize/1MB,1)
$libreGo = [math]::Round($os.FreePhysicalMemory/1MB,1)
$utilisePct = [math]::Round((($totalGo-$libreGo)/$totalGo)*100,1)
Write-Output "RAM : $utilisePct % utilises sur $totalGo Go"
Repère : au-delà de 85 % d’utilisation en usage courant, la machine est sous-dimensionnée. En 2026, 8 Go constituent un plancher inconfortable pour un poste bureautique avec navigateur et Teams.
3. Le démarrage
Windows mesure lui-même son temps de démarrage et le consigne dans un journal dédié. L’information est fiable et rarement exploitée.
Au-delà de 60 secondes, cherchez les programmes lancés automatiquement :
Get-CimInstance Win32_StartupCommand |
Select-Object Name, Command, Location | Format-Table -AutoSize
4. Les processus
Un relevé instantané de la consommation processeur est trompeur : il faut deux mesures espacées. Pour la mémoire en revanche, le classement direct suffit :
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10 |
Select-Object ProcessName,
@{n='RAM_Mo';e={[math]::Round($_.WorkingSet64/1MB,0)}}
5. Les mises à jour en attente
Un redémarrage repoussé depuis des semaines laisse des installations en suspens qui consomment des ressources en arrière-plan.
$demarrage = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
$jours = [math]::Round(((Get-Date) - $demarrage).TotalDays,1)
Write-Output "Dernier redemarrage : il y a $jours jours"
$cle = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired"
Write-Output "Redemarrage en attente : $(Test-Path $cle)"
Le script d’audit complet
Voici l’ensemble condensé en un script unique, à faire exécuter sur le poste concerné. Il produit un rapport lisible en une trentaine de secondes.
Write-Output "=== AUDIT DE PERFORMANCE - $env:COMPUTERNAME ==="
Write-Output "--- DISQUE ---"
Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" | ForEach-Object {
$pct = [math]::Round(($_.FreeSpace/$_.Size)*100,1)
$etat = if ($pct -lt 10) { "CRITIQUE" } elseif ($pct -lt 20) { "ATTENTION" } else { "OK" }
Write-Output "$($_.DeviceID) $([math]::Round($_.FreeSpace/1GB,1)) Go libres / $([math]::Round($_.Size/1GB,1)) Go ($pct %) - $etat"
}
Get-PhysicalDisk | ForEach-Object {
Write-Output "Support : $($_.MediaType) - Sante : $($_.HealthStatus)"
}
Write-Output "--- MEMOIRE ---"
$os = Get-CimInstance Win32_OperatingSystem
$tot = [math]::Round($os.TotalVisibleMemorySize/1MB,1)
$lib = [math]::Round($os.FreePhysicalMemory/1MB,1)
Write-Output "$([math]::Round((($tot-$lib)/$tot)*100,1)) % utilises sur $tot Go"
Write-Output "--- DEMARRAGE ---"
try {
Get-WinEvent -FilterHashtable @{
LogName="Microsoft-Windows-Diagnostics-Performance/Operational"; Id=100
} -MaxEvents 3 -ErrorAction Stop | ForEach-Object {
$x = [xml]$_.ToXml()
$ms = ($x.Event.EventData.Data | Where-Object Name -eq "BootTime")."#text"
Write-Output "$($_.TimeCreated.ToString('dd/MM HH:mm')) : $([math]::Round($ms/1000,1)) s"
}
} catch { Write-Output "Journal de performance indisponible" }
Write-Output "--- TOP 5 MEMOIRE ---"
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 5 | ForEach-Object {
Write-Output "$($_.ProcessName) : $([math]::Round($_.WorkingSet64/1MB,0)) Mo"
}
Write-Output "--- SYSTEME ---"
$boot = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
Write-Output "Dernier redemarrage : il y a $([math]::Round(((Get-Date)-$boot).TotalDays,1)) jours"
Write-Output "Programmes au demarrage : $((Get-CimInstance Win32_StartupCommand).Count)"
Industrialiser avec Intune
Ce script prend tout son intérêt déployé sur l’ensemble du parc plutôt qu’exécuté poste par poste. Transformé en script de détection de remédiation, il permet d’identifier à l’avance les postes qui vont poser problème.
Rappel de la contrainte : la sortie d’une remédiation est plafonnée à 2 048 caractères. Réduisez donc le rapport aux seules valeurs critiques. La méthode complète est décrite dans notre article sur les scripts de remédiation Intune.
En résumé
Un poste lent se diagnostique par mesures successives, pas par intuition : disque d’abord, mémoire ensuite, puis démarrage, processus et mises à jour. Deux constats suffisent à trancher la moitié des cas — un disque mécanique ou moins de 15 % d’espace libre. Déployé via Intune, le même script transforme le support de réactif en préventif. Pour le contexte de gestion de parc, voyez notre guide complet de Microsoft Intune.
