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.

Les remédiations Intune permettent de détecter et corriger automatiquement un problème sur un parc entier, sans intervention humaine ni ticket. C’est probablement la fonction la plus sous-utilisée d’Intune, alors qu’elle supprime des catégories entières d’appels au support. Cet article couvre le mécanisme, le piège qui fait échouer la plupart des premiers essais, et trois paires de scripts prêtes à déployer.

Le principe

Une remédiation est un couple de scripts PowerShell : un script de détection qui vérifie une condition, et un script de remédiation qui corrige — ce dernier ne s’exécutant que si le premier a signalé un problème.

Script dedetectionProblemedetecte ?exit 1Script deremediationexit 0Rien ne se passe(poste conforme)Le flux d une remediation IntuneConvention inverse de celle des applications Win32
Dans une remediation, exit 1 signifie « probleme trouve ». C est l inverse des scripts de detection Win32.

Le piège numéro un : la convention de code de sortie

C’est ici que la majorité des premières tentatives échouent, et l’erreur est d’autant plus tenace qu’elle est contre-intuitive.

Dans un script de détection de remédiation :

  • exit 1 signifie « problème détecté » → le script de remédiation s’exécute
  • exit 0 signifie « tout va bien » → rien ne se passe

C’est l’inverse exact de la convention des applications Win32, où exit 0 accompagné d’une sortie signifie « application détectée ». Si vous avez d’abord travaillé sur le déploiement d’applications Win32, votre réflexe sera le mauvais.

Précision importante tirée de la documentation Microsoft : une sortie vide est interprétée comme « problème non trouvé ». Écrivez toujours quelque chose avec Write-Output avant de sortir.

Vérifiez vos licences avant de vous lancer

Point critique, souvent découvert après avoir écrit les scripts : les remédiations exigent une licence spécifique. Sont éligibles :

  • Windows Enterprise E3 ou E5 — incluse dans Microsoft 365 F3, E3 ou E5
  • Windows Education A3 ou A5
  • Windows Virtual Desktop Access (VDA) par utilisateur

Microsoft 365 Business Premium n’est pas dans cette liste. C’est une limitation réelle pour beaucoup de PME qui disposent pourtant d’Intune. Vérifiez vos licences avant d’investir du temps dans l’écriture de scripts.

Côté appareils : postes joints à Entra ID ou en jonction hybride, inscrits dans Intune, sous Windows Entreprise, Professionnel ou Éducation.

Trois remédiations utiles, prêtes à déployer

1. Nettoyer les fichiers temporaires quand le disque sature

Un disque système plein est une cause classique de lenteur et d’échec de mise à jour. Cette remédiation intervient seulement quand l’espace libre passe sous 15 %.

Détection :

$seuil = 15
$disque = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'"
$pctLibre = [math]::Round(($disque.FreeSpace / $disque.Size) * 100, 1)

if ($pctLibre -lt $seuil) {
    Write-Output "Espace libre : $pctLibre % - nettoyage requis"
    exit 1
}
Write-Output "Espace libre : $pctLibre % - conforme"
exit 0

Remédiation :

try {
    $cibles = @(
        "$env:WINDIR\Temp",
        "$env:TEMP",
        "$env:WINDIR\SoftwareDistribution\Download"
    )
    $libere = 0
    foreach ($dossier in $cibles) {
        if (Test-Path $dossier) {
            $avant = (Get-ChildItem $dossier -Recurse -Force -ErrorAction SilentlyContinue |
                      Measure-Object Length -Sum).Sum
            Get-ChildItem $dossier -Recurse -Force -ErrorAction SilentlyContinue |
                Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } |
                Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
            $apres = (Get-ChildItem $dossier -Recurse -Force -ErrorAction SilentlyContinue |
                      Measure-Object Length -Sum).Sum
            $libere += ($avant - $apres)
        }
    }
    Write-Output "Espace libere : $([math]::Round($libere/1GB,2)) Go"
    exit 0
}
catch {
    Write-Output "Echec : $($_.Exception.Message)"
    exit 1
}

Le filtre sur les fichiers de plus de sept jours évite de supprimer un fichier temporaire en cours d’utilisation.

2. Redémarrer le service de mise à jour bloqué

Un service Windows Update arrêté empêche silencieusement tout correctif de s’installer. Le poste apparaît alors non conforme sans raison apparente.

Détection :

$service = Get-Service -Name wuauserv -ErrorAction SilentlyContinue

if ($null -eq $service) {
    Write-Output "Service wuauserv introuvable"
    exit 1
}
if ($service.StartType -eq 'Disabled' -or $service.Status -eq 'Stopped') {
    Write-Output "Service wuauserv : $($service.Status) / $($service.StartType)"
    exit 1
}
Write-Output "Service wuauserv operationnel"
exit 0

Remédiation :

try {
    Set-Service -Name wuauserv -StartupType Manual -ErrorAction Stop
    Start-Service -Name wuauserv -ErrorAction Stop
    Write-Output "Service wuauserv redemarre"
    exit 0
}
catch {
    Write-Output "Echec : $($_.Exception.Message)"
    exit 1
}

3. Détecter les postes qui n’ont pas redémarré depuis trop longtemps

Un poste jamais redémarré accumule les mises à jour en attente et ralentit. Attention : la documentation Microsoft interdit formellement les commandes de redémarrage dans les scripts de remédiation. On se contente donc de notifier l’utilisateur.

Détection :

$seuilJours = 10
$demarrage = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
$jours = [math]::Round(((Get-Date) - $demarrage).TotalDays, 1)

if ($jours -gt $seuilJours) {
    Write-Output "Dernier redemarrage il y a $jours jours"
    exit 1
}
Write-Output "Dernier redemarrage il y a $jours jours - conforme"
exit 0

Remédiation — à exécuter dans le contexte de l’utilisateur connecté :

try {
    Add-Type -AssemblyName System.Windows.Forms
    $notif = New-Object System.Windows.Forms.NotifyIcon
    $notif.Icon = [System.Drawing.SystemIcons]::Information
    $notif.BalloonTipTitle = "Redemarrage recommande"
    $notif.BalloonTipText = "Votre poste n a pas redemarre depuis plus de 10 jours. Merci de le redemarrer."
    $notif.Visible = $true
    $notif.ShowBalloonTip(20000)
    Start-Sleep -Seconds 22
    $notif.Dispose()
    Write-Output "Notification affichee"
    exit 0
}
catch {
    Write-Output "Echec : $($_.Exception.Message)"
    exit 1
}

Déployer correctement

Dans le centre d’administration Intune : Appareils > Gérer les appareils > Scripts et remédiations. La fonction s’appelait auparavant « Remédiations proactives » — vous croiserez encore ce nom dans de nombreux articles.

Réglages recommandés par Microsoft :

Réglage Valeur Raison
Exécuter avec les identifiants de l’utilisateur connecté Selon le script Non pour le disque et les services, oui pour les notifications
Vérifier la signature du script Non Sinon la stratégie d’exécution du poste s’applique
Exécuter en PowerShell 64 bits Non Sauf besoin explicite

Chargez les fichiers .ps1 plutôt que de coller le code dans le navigateur. Les scripts doivent être encodés en UTF-8, et le téléversement garantit un encodage correct. Si la vérification de signature est activée, l’encodage doit être UTF-8 sans BOM.

Deux limites à connaître : la sortie est plafonnée à 2 048 caractères, et vous pouvez créer jusqu’à 200 paquets de scripts.

Fréquence d’exécution

Trois options : une seule fois, toutes les heures (intervalle inférieur à 24 h), ou quotidiennement. Pour un script consommateur de ressources, espacez : une exécution quotidienne suffit dans la plupart des cas, et Microsoft recommande explicitement de réduire la fréquence des scripts lourds.

Comprendre les délais de remontée

Les rapports ne sont pas instantanés, et cela déroute souvent :

  • Le client récupère les scripts toutes les 8 heures, après un redémarrage, ou à l’ouverture de session.
  • Pour les scripts récurrents, le client suit un cycle de remontée de 7 jours : durant les six premiers jours il ne remonte que s’il y a un changement, puis envoie un rapport complet le septième jour.

Ne concluez donc pas à un échec après deux heures sans résultat. Pour tester rapidement, utilisez l’action Exécuter la remédiation à la demande sur un appareil unique.

Méthode de mise en production

  1. Tester les deux scripts localement, dans une console PowerShell ouverte en tant que SYSTEM ou administrateur.
  2. Vérifier les codes de sortie avec echo $LASTEXITCODE après exécution.
  3. Déployer sur un groupe pilote de trois à cinq postes.
  4. Utiliser l’exécution à la demande pour valider immédiatement.
  5. Consulter l’état par appareil, exporter le CSV des sorties.
  6. Étendre progressivement.

Si un script ne semble jamais s’exécuter, la démarche de diagnostic est la même que pour toute stratégie Intune : voir notre article sur les stratégies qui ne s’appliquent pas.

En résumé

Les remédiations transforment le support de réactif en préventif, mais trois points conditionnent la réussite : la licence Windows Enterprise E3 minimum — que Business Premium n’inclut pas —, la convention exit 1 pour signaler un problème, et l’interdiction des commandes de redémarrage. Commencez par la remédiation d’espace disque : elle est sans risque, mesurable, et son effet est immédiatement visible dans les rapports. Pour l’ensemble de la plateforme, consultez notre guide complet de Microsoft Intune.

Sources : Use Remediations to detect and fix support issues et PowerShell scripts for Remediations, documentation Microsoft Intune.