Diagnostic de panne
Il lit le journal d’incidents de Windows (arrêts brutaux, écrans bleus, erreurs de disque, pilotes en échec), dépose un rapport complet sur votre Bureau, et ouvre une première orientation de la panne.
Ce qui part sur Internet : Seulement des codes courts et agrégés (par exemple kp41:4 = tel incident, quatre fois). Le détail reste sur votre machine.
🔒 Vérifier que le fichier n’a pas été modifié
Ce programme n’est pas signé électroniquement — aucun certificat gratuit ne le permet pour une entreprise. En revanche vous pouvez vérifier vous-même qu’il est bien celui que je publie.
Dans PowerShell, sur le fichier téléchargé :
Get-FileHash .\diagnostic-panne.exe
Vous devez obtenir exactement :
19E76D5CD94ED01ADA43996EFFA159843E90EBD186C66E3BB06407DC0FCE4B90
78 336 octets · version du 25/07/2026. Si l’empreinte diffère, ne l’exécutez pas et prévenez-moi.
🔓 Voir le code source (diagnostic-panne.ps1, PowerShell — lisible)
# =============================================================================
# LE BON CONTACT — Premier diagnostic de panne
# https://le-bon.contact/diagnostic.php
# =============================================================================
#
# CE QUE FAIT CE PROGRAMME, EXACTEMENT :
# 1. il lit les caractéristiques de cet ordinateur ;
# 2. il lit le JOURNAL DE WINDOWS — le carnet où Windows note lui-même ses
# incidents : arrêts brutaux, écrans bleus, erreurs de disque, pilotes qui
# refusent de se charger ;
# 3. il dépose un RAPPORT COMPLET sur votre Bureau, que vous gardez ;
# 4. il ouvre dans le navigateur une PREMIÈRE ORIENTATION de la panne.
#
# CE QUI PART SUR INTERNET, ET RIEN D'AUTRE :
# des codes courts, du genre « disk7:1,kp41:4 » — c'est-à-dire « tel type
# d'incident, tel nombre de fois ». Le DÉTAIL (noms de périphériques, messages
# d'erreur) reste sur VOTRE machine, dans le fichier du Bureau. Personne n'a
# besoin d'envoyer son journal Windows à un site pour savoir que son disque
# fatigue.
#
# CE QU'IL NE FAIT PAS, ET NE FERA JAMAIS :
# - il ne lit AUCUN fichier personnel, aucun mot de passe, aucun document ;
# - il ne modifie RIEN sur la machine, sauf le rapport déposé sur le Bureau ;
# - il n'a pas besoin des droits administrateur ;
# - il ne teste rien : il LIT ce que Windows a déjà noté. Un journal vide ne
# veut donc pas dire « tout va bien », mais « rien de connu n'a été
# enregistré » — c'est déjà une information, ce n'est pas un diagnostic.
#
# Ce fichier est en texte clair : lisez-le avant de l'exécuter. C'est un bon
# réflexe, pour ce programme comme pour n'importe quel autre.
#
# POUR L'EXÉCUTER : clic droit sur le fichier > « Exécuter avec PowerShell ».
# Si Windows refuse, ouvrez PowerShell et tapez :
# powershell -ExecutionPolicy Bypass -File .\diagnostic-panne.ps1
# =============================================================================
$ErrorActionPreference = 'SilentlyContinue'
# URL CANONIQUE, sans extension (23/07/2026). Viser /xxx.php fonctionnait
# encore — la redirection conserve les parametres — mais un saut de moins,
# c'est un endroit de moins ou le releve peut se perdre en route.
$SiteUrl = 'https://le-bon.contact/diagnostic'
# ── LA FENÊTRE (Kévin, 22/07/2026) ───────────────────────────────────────────
# « design l'attente au lieu que ça ressemble à du PowerShell, plutôt une petite
# fenêtre avec le logo de la société et Analyse en cours... »
# Une console noire fait peur à un particulier : elle ressemble à ce qu'un
# escroc affiche pour impressionner. Une fenêtre sobre aux couleurs de la marque
# inspire exactement l'inverse — et c'est le même programme dessous.
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
[System.Windows.Forms.Application]::EnableVisualStyles()
$Or = [System.Drawing.Color]::FromArgb(205, 156, 31)
$Sombre = [System.Drawing.Color]::FromArgb(24, 26, 30)
$Gris = [System.Drawing.Color]::FromArgb(150, 155, 165)
$Blanc = [System.Drawing.Color]::FromArgb(240, 240, 242)
$form = New-Object System.Windows.Forms.Form
$form.Text = 'Le Bon Contact — diagnostic de panne'
$form.Size = New-Object System.Drawing.Size(640, 500)
$form.StartPosition = 'CenterScreen'
$form.FormBorderStyle = 'FixedDialog'
$form.MaximizeBox = $false
$form.MinimizeBox = $false
$form.BackColor = $Sombre
$form.TopMost = $true
# Logo embarqué dans le programme : aucun téléchargement, il s'affiche même
# sans connexion Internet.
$logo64 = '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'
try {
$flux = New-Object System.IO.MemoryStream(,[Convert]::FromBase64String($logo64))
$img = [System.Drawing.Image]::FromStream($flux)
$pb = New-Object System.Windows.Forms.PictureBox
$pb.Image = $img
$pb.SizeMode = 'Zoom'
$pb.Size = New-Object System.Drawing.Size(88, 88)
$pb.Location = New-Object System.Drawing.Point(268, 26)
$pb.BackColor = [System.Drawing.Color]::Transparent
$form.Controls.Add($pb)
$form.Icon = [System.Drawing.Icon]::FromHandle(([System.Drawing.Bitmap]$img).GetHicon())
} catch {}
$titre = New-Object System.Windows.Forms.Label
$titre.Text = 'LE BON CONTACT'
$titre.Font = New-Object System.Drawing.Font('Segoe UI', 17, [System.Drawing.FontStyle]::Bold)
$titre.ForeColor = $Or
$titre.TextAlign = 'MiddleCenter'
$titre.Location = New-Object System.Drawing.Point(24, 128)
$titre.Size = New-Object System.Drawing.Size(576, 38)
$form.Controls.Add($titre)
$etat = New-Object System.Windows.Forms.Label
$etat.Text = 'Analyse en cours…'
$etat.Font = New-Object System.Drawing.Font('Segoe UI', 12)
$etat.ForeColor = $Blanc
$etat.TextAlign = 'MiddleCenter'
$etat.Location = New-Object System.Drawing.Point(24, 172)
$etat.Size = New-Object System.Drawing.Size(576, 30)
$form.Controls.Add($etat)
$barre = New-Object System.Windows.Forms.ProgressBar
$barre.Style = 'Marquee'
$barre.MarqueeAnimationSpeed = 28
$barre.Location = New-Object System.Drawing.Point(90, 214)
$barre.Size = New-Object System.Drawing.Size(444, 10)
$form.Controls.Add($barre)
$detail = New-Object System.Windows.Forms.Label
$detail.Text = ''
$detail.Font = New-Object System.Drawing.Font('Segoe UI', 10)
$detail.ForeColor = $Gris
$detail.TextAlign = 'TopCenter'
$detail.Location = New-Object System.Drawing.Point(28, 240)
$detail.Size = New-Object System.Drawing.Size(568, 166)
$form.Controls.Add($detail)
$pied = New-Object System.Windows.Forms.Label
$pied.Text = 'Aucune donnée personnelle n''est lue. Rien n''est modifié sur cet ordinateur.'
$pied.Font = New-Object System.Drawing.Font('Segoe UI', 9)
$pied.ForeColor = $Gris
$pied.TextAlign = 'MiddleCenter'
$pied.Location = New-Object System.Drawing.Point(24, 418)
$pied.Size = New-Object System.Drawing.Size(576, 22)
$form.Controls.Add($pied)
function Etape($texte) {
$script:etat.Text = $texte
[System.Windows.Forms.Application]::DoEvents()
}
$form.Show()
[System.Windows.Forms.Application]::DoEvents()
Start-Sleep -Milliseconds 250
Etape 'Analyse en cours…'
# ---------------------------------------------------------------- La machine
$cs = Get-CimInstance Win32_ComputerSystem
$os = Get-CimInstance Win32_OperatingSystem
$cpu = Get-CimInstance Win32_Processor | Select-Object -First 1
$estPortable = $false
foreach ($c in (Get-CimInstance Win32_SystemEnclosure).ChassisTypes) {
if ($c -in 8,9,10,11,12,14,18,21,30,31,32) { $estPortable = $true }
}
$ramGo = [math]::Round($cs.TotalPhysicalMemory / 1GB)
$marque = "$($cs.Manufacturer) $($cs.Model)".Trim()
# Disque système et carte graphique — utiles au technicien avant de se déplacer
# (SSD ou disque mécanique change tout, la carte graphique dit si c'est une
# machine de jeu). Best-effort : une machine sans certaines infos ne doit pas
# faire échouer le relevé, d'où le try/catch silencieux.
$disqueInfo = ''
try {
$dd = Get-CimInstance Win32_DiskDrive | Select-Object -First 1
if ($dd) {
$typeD = if ("$($dd.Model)" -match 'SSD|NVME|M\.2') { 'SSD' } else { 'disque mécanique' }
$disqueInfo = ("$typeD $([math]::Round($dd.Size/1GB)) Go — $($dd.Model)").Trim()
}
} catch {}
$gpuInfo = ''
try {
$gpuInfo = ((Get-CimInstance Win32_VideoController | Where-Object { $_.Name } |
ForEach-Object { $_.Name }) -join ', ').Trim()
} catch {}
# ── LA LISTE BLANCHE ─────────────────────────────────────────────────────────
# ⚠️ Doit rester le MIROIR de inc/JournalPanne.php::SIGNAUX. Si vous ajoutez un
# signal d'un côté, ajoutez-le de l'autre : le site ignore en silence tout code
# qu'il ne connaît pas (c'est voulu — un programme plus récent que le site ne
# doit jamais produire une page en erreur), donc l'oubli ne se voit PAS.
#
# ⚠️⚠️ UN EVENT ID N'EST PAS UNIQUE. Il ne l'est que par SOURCE. Mesuré sur le
# poste de développement : l'ID 55 filtré seul remonte 1536 messages
# « Kernel-Processor-Power » parfaitement anodins qu'on prendrait pour de la
# corruption NTFS, et l'ID 7 remonte des cartes réseau virtuelles qui démarrent
# normalement, qu'on annoncerait comme des blocs défectueux. D'où le filtrage
# sur le COUPLE (source, id), jamais sur l'id seul.
$blanche = @(
@{ code = 'disk7'; source = 'disk'; id = 7; titre = 'Bloc défectueux sur un disque' }
@{ code = 'disk11'; source = 'disk'; id = 11; titre = 'Erreur de contrôleur de disque' }
@{ code = 'disk153'; source = 'disk'; id = 153; titre = 'Lecture reprise après échec' }
@{ code = 'ahci129'; source = 'storahci'; id = 129; titre = 'Contrôleur de disque réinitialisé' }
@{ code = 'nvme129'; source = 'stornvme'; id = 129; titre = 'SSD NVMe réinitialisé' }
@{ code = 'ntfs55'; source = 'Ntfs'; id = 55; titre = 'Système de fichiers endommagé' }
@{ code = 'ntfs55'; source = 'Microsoft-Windows-Ntfs'; id = 55; titre = 'Système de fichiers endommagé' }
@{ code = 'kp41'; source = 'Microsoft-Windows-Kernel-Power'; id = 41; titre = 'Arrêt brutal, sans extinction propre' }
@{ code = 'evt6008'; source = 'EventLog'; id = 6008; titre = 'Arrêt inattendu (confirmation)' }
@{ code = 'bsod'; source = 'Microsoft-Windows-WER-SystemErrorReporting'; id = 1001; titre = 'Écran bleu' }
@{ code = 'volmgr162'; source = 'volmgr'; id = 162; titre = 'Vidage mémoire après plantage' }
@{ code = 'pnp219'; source = 'Microsoft-Windows-Kernel-PnP'; id = 219; titre = 'Pilote qui refuse de se charger' }
)
# ── JOURNAL « APPLICATIONS » (Kévin, 24/07/2026) ─────────────────────────────
# Le journal Système dit ce que fait la MACHINE ; celui-ci dit ce que font les
# LOGICIELS. Une machine « lente » au journal Système vide mais qui plante Outlook
# trois fois par jour n'a pas un problème matériel — et on ne pouvait pas le voir.
# MÊME DISCIPLINE : liste blanche stricte. Ce journal est encore plus bruyant que
# l'autre (chaque logiciel y écrit ce qu'il veut). Doit rester le MIROIR de
# inc/JournalPanne.php::SIGNAUX.
$blancheApp = @(
@{ code = 'app1000'; source = 'Application Error'; id = 1000; titre = 'Un logiciel plante à répétition' }
@{ code = 'app1002'; source = 'Application Hang'; id = 1002; titre = 'Un logiciel se fige' }
@{ code = 'net1026'; source = '.NET Runtime'; id = 1026; titre = 'Plantage d''une application .NET' }
@{ code = 'maj20'; source = 'Microsoft-Windows-WindowsUpdateClient'; id = 20; titre = 'Mises à jour Windows en échec' }
@{ code = 'esent490'; source = 'ESENT'; id = 490; titre = 'Base interne de Windows illisible' }
@{ code = 'profil1542'; source = 'Microsoft-Windows-User Profiles Service'; id = 1542; titre = 'Profil utilisateur endommagé' }
)
Etape 'Lecture du journal de Windows…'
# ── STRATÉGIE DE LECTURE : LARGE CÔTÉ SERVICE, EXACTE CÔTÉ CLIENT ────────────
# Mesuré : lire les 90 derniers jours du journal Système sans filtre = 29 809
# événements en 19,3 s — beaucoup trop long pour une fenêtre d'attente. Le même
# relevé, en laissant le service Windows filtrer sur les sources ET les
# identifiants, tombe à 46 événements en 0,6 s. Le filtre du service accepte
# n'importe quelle source AVEC n'importe quel identifiant de la liste (c'est un
# produit croisé), donc on repasse derrière pour ne garder que les vrais couples.
$depuis = (Get-Date).AddDays(-90)
$sources = ($blanche | ForEach-Object { $_.source } | Sort-Object -Unique)
$ids = ($blanche | ForEach-Object { $_.id } | Sort-Object -Unique)
$brut = Get-WinEvent -FilterHashtable @{
LogName = 'System'; ProviderName = $sources; Id = $ids; StartTime = $depuis
} -ErrorAction SilentlyContinue
# WHEA à part : on ne retient PAS un identifiant précis (voir JournalPanne.php,
# le classement corrigé/fatal n'a pas pu être vérifié faute de machine témoin).
$whea = Get-WinEvent -FilterHashtable @{
LogName = 'System'; ProviderName = 'Microsoft-Windows-WHEA-Logger'; StartTime = $depuis
} -ErrorAction SilentlyContinue
# Le journal des LOGICIELS, lu avec le même filtre côté service : sans lui,
# on lirait des dizaines de milliers de lignes pour en garder trois.
$sourcesApp = ($blancheApp | ForEach-Object { $_.source } | Sort-Object -Unique)
$idsApp = ($blancheApp | ForEach-Object { $_.id } | Sort-Object -Unique)
$brutApp = Get-WinEvent -FilterHashtable @{
LogName = 'Application'; ProviderName = $sourcesApp; Id = $idsApp; StartTime = $depuis
} -ErrorAction SilentlyContinue
# ── L'ANTIVIRUS : un TROISIÈME journal, et c'est pour ça qu'il manquait ───────
# Le site connaît le signal « defender » depuis l'origine, mais le programme ne
# l'a jamais envoyé : les détections de Windows Defender ne sont ni dans Système
# ni dans Applications, elles ont leur propre journal opérationnel. L'écart ne se
# voyait pas — le site ignore en silence tout code qu'il ne reçoit pas.
$brutDef = Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-Windows Defender/Operational'; Id = 1116; StartTime = $depuis
} -ErrorAction SilentlyContinue
if ($brutDef -and $brutDef.Count -gt 0) {
$compte['defender'] = $brutDef.Count
$dernier['defender'] = ($brutDef | Select-Object -First 1).TimeCreated
}
Etape 'Analyse des événements…'
$compte = @{} # code -> nombre
$dernier = @{} # code -> date la plus récente
$retenus = @() # les événements gardés, pour le rapport
foreach ($ev in $brut) {
$trouve = $blanche | Where-Object { $_.source -eq $ev.ProviderName -and $_.id -eq $ev.Id } | Select-Object -First 1
if (-not $trouve) { continue } # bon identifiant, mauvaise source : c'est du bruit
$c = $trouve.code
$compte[$c] = 1 + [int]$compte[$c]
if (-not $dernier.ContainsKey($c) -or $ev.TimeCreated -gt $dernier[$c]) { $dernier[$c] = $ev.TimeCreated }
$retenus += $ev
}
if ($whea -and $whea.Count -gt 0) {
$compte['whea'] = $whea.Count
$dernier['whea'] = ($whea | Select-Object -First 1).TimeCreated
$retenus += $whea
}
# Journal des logiciels : même traitement, même prudence sur le couple (source, id).
foreach ($ev in $brutApp) {
$trouve = $blancheApp | Where-Object { $_.source -eq $ev.ProviderName -and $_.id -eq $ev.Id } | Select-Object -First 1
if (-not $trouve) { continue }
$c = $trouve.code
$compte[$c] = 1 + [int]$compte[$c]
if (-not $dernier.ContainsKey($c) -or $ev.TimeCreated -gt $dernier[$c]) { $dernier[$c] = $ev.TimeCreated }
$retenus += $ev
}
# ── LES CODES D'ARRÊT : l'information la plus utile du journal ───────────────
# Le message dit « La vérification d'erreur était : 0x000000d1 (…) » en français,
# « The bugcheck was: 0x000000d1 (…) » en anglais. On prend le premier motif
# 0x + 8 chiffres hexadécimaux, ce qui marche dans les deux langues.
$arrets = @()
foreach ($ev in ($retenus | Where-Object { $_.Id -eq 1001 })) {
if ($ev.Message -match '0x([0-9a-fA-F]{8})') {
$code = $Matches[1].TrimStart('0')
if ($code -and ($arrets -notcontains $code)) { $arrets += $code }
}
}
Etape 'Vérification des disques…'
# ── ESPACE LIBRE sur le disque de Windows ───────────────────────────────────
# La cause de lenteur la plus fréquente, et la plus facile à corriger.
$sys = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='$($env:SystemDrive)'"
$espace = $null
if ($sys -and $sys.Size -gt 0) { $espace = [math]::Round(100 * $sys.FreeSpace / $sys.Size) }
# ── SMART ────────────────────────────────────────────────────────────────────
# À prendre pour ce qu'il vaut : sur le poste témoin, SMART répondait « Healthy »
# alors que le journal avait enregistré un bloc défectueux et deux écrans bleus
# d'erreur de lecture le même jour. Un SMART qui se plaint est un signal fort ;
# un SMART content ne prouve rien.
$smart = 'ok'
$disquesTxt = @()
foreach ($d in (Get-PhysicalDisk -ErrorAction SilentlyContinue)) {
if ($d.HealthStatus -and $d.HealthStatus -ne 'Healthy') { $smart = 'warn' }
$genre = switch ("$($d.MediaType)") {
'SSD' { 'SSD' }
'HDD' { 'disque mécanique' }
default { 'type non communiqué par le disque' }
}
$disquesTxt += " $($d.FriendlyName) — $genre, $([math]::Round($d.Size/1GB)) Go — santé : $($d.HealthStatus)"
}
if ($disquesTxt.Count -eq 0) { $disquesTxt += ' (aucun disque interrogeable)' }
# ── BATTERIE ─────────────────────────────────────────────────────────────────
# Même méthode que le relevé de rachat : capacité de conception contre capacité
# réelle à pleine charge. Non renseigné par certains constructeurs → on n'envoie
# rien plutôt qu'un chiffre inventé.
$sante = $null
if ($estPortable) {
try {
$concue = (Get-CimInstance -Namespace 'root\WMI' -ClassName 'BatteryStaticData' -ErrorAction Stop |
Select-Object -First 1).DesignedCapacity
$pleine = (Get-CimInstance -Namespace 'root\WMI' -ClassName 'BatteryFullChargedCapacity' -ErrorAction Stop |
Select-Object -First 1).FullChargedCapacity
if ($concue -gt 0 -and $pleine -gt 0) { $sante = [math]::Round(100 * $pleine / $concue) }
} catch { $sante = $null }
}
Etape 'Rédaction de votre rapport…'
# ── LE RAPPORT SUR LE BUREAU (Kévin, 22/07/2026) ─────────────────────────────
# « Il récupère ces infos sur son bureau pour pouvoir l'utiliser après via une
# IA, si besoin il pourra donc l'utiliser ou me la transférer par mail. »
# C'est le bon partage : le DÉTAIL reste chez la personne, sur sa machine, sous
# son contrôle ; seuls des CODES partent sur le web pour la première
# orientation. Personne n'a besoin d'envoyer son journal Windows à un site pour
# savoir que son disque fatigue.
$L = @()
$L += '================================================================'
$L += " RAPPORT DE DIAGNOSTIC — $(Get-Date -Format 'dd/MM/yyyy à HH:mm')"
$L += ' Le Bon Contact — 07 56 86 34 75 — contact@le-bon.contact'
$L += '================================================================'
$L += ''
$L += 'À QUOI SERT CE FICHIER'
$L += ' - Vous pouvez le garder : il date précisément ce qui a été constaté.'
$L += ' - Vous pouvez me l''envoyer par mail : je saurai quoi regarder avant'
$L += ' même de voir la machine, et ça raccourcit l''intervention.'
$L += ' - Vous pouvez le coller dans une intelligence artificielle pour vous'
$L += ' le faire expliquer autrement. Il ne contient AUCUN fichier'
$L += ' personnel, aucun mot de passe, aucun document.'
$L += ''
$L += '--- LA MACHINE -------------------------------------------------'
$L += " $(if ($estPortable) {'Ordinateur portable'} else {'Ordinateur fixe'}) — $marque"
$L += " $($cpu.Name)"
$L += " $ramGo Go de mémoire"
$L += " $($os.Caption) — version $($os.Version)"
$L += " Allumé sans interruption depuis le $($os.LastBootUpTime.ToString('dd/MM/yyyy à HH:mm'))"
if ($null -ne $sante) { $L += " Batterie : $sante % de sa capacité d'origine" }
elseif ($estPortable) { $L += ' Batterie : la machine ne communique pas sa capacité' }
$L += ''
$L += '--- LES DISQUES ------------------------------------------------'
$L += $disquesTxt
if ($null -ne $espace) { $L += " Espace libre sur $($env:SystemDrive) : $espace %" }
$L += ''
$L += '--- CE QUI A ÉTÉ RELEVÉ (90 derniers jours) --------------------'
if ($compte.Count -eq 0) {
$L += ' Aucun incident connu. Le journal de Windows ne montre rien'
$L += ' d''anormal parmi ce que cet outil sait reconnaître.'
$L += ' C''est une information utile : elle écarte une grande partie'
$L += ' des pannes matérielles.'
} else {
foreach ($k in ($compte.Keys | Sort-Object)) {
$nom = ($blanche | Where-Object { $_.code -eq $k } | Select-Object -First 1).titre
if (-not $nom) { $nom = 'Erreur matérielle signalée par le processeur' }
$L += " $nom"
$L += " $($compte[$k]) fois — le plus récent le $($dernier[$k].ToString('dd/MM/yyyy')) — code $k"
}
}
if ($arrets.Count -gt 0) { $L += ''; $L += " Codes d'arrêt des écrans bleus : $($arrets -join ', ')" }
$L += ''
$L += '--- LE DÉTAIL, POUR ALLER PLUS LOIN ----------------------------'
$L += ' (les 25 événements les plus récents parmi ceux retenus)'
$L += ''
foreach ($ev in ($retenus | Sort-Object TimeCreated -Descending | Select-Object -First 25)) {
$msg = ($ev.Message -replace '\s+', ' ')
if ($msg.Length -gt 200) { $msg = $msg.Substring(0, 200) + '…' }
$L += " [$($ev.TimeCreated.ToString('dd/MM/yyyy HH:mm'))] $($ev.ProviderName) / $($ev.Id)"
$L += " $msg"
}
$L += ''
$L += '--- CE QUE CET OUTIL NE SAIT PAS -------------------------------'
$L += ' Il lit un journal, il ne teste rien. Une mémoire défaillante, une'
$L += ' surchauffe ou une alimentation qui faiblit ne laissent pas toujours'
$L += ' de trace. Un journal vide ne veut donc pas dire « tout va bien » :'
$L += ' il veut dire « rien de connu n''a été enregistré ».'
$L += ''
$L += '================================================================'
$bureau = [Environment]::GetFolderPath('Desktop')
$fichier = Join-Path $bureau "Diagnostic-LeBonContact-$(Get-Date -Format 'yyyy-MM-dd-HHmm').txt"
$ecrit = $false
try {
# UTF8 avec BOM : sans lui, le Bloc-notes des anciennes versions de Windows
# affiche les accents en charabia — et un rapport illisible ne sert à rien.
[System.IO.File]::WriteAllLines($fichier, $L, (New-Object System.Text.UTF8Encoding $true))
$ecrit = $true
} catch {
$ecrit = $false
}
# ---------------------------------------------------------------- L'affichage
$resume = @()
$resume += "$(if ($estPortable) {'Ordinateur portable'} else {'Ordinateur fixe'}) — $marque"
$resume += "$($cpu.Name)"
if ($compte.Count -eq 0) {
$resume += 'Journal Windows : rien d''anormal sur 90 jours'
} else {
$resume += "Journal Windows : $($compte.Count) type(s) d'incident relevé(s)"
}
if ($arrets.Count -gt 0) { $resume += "Écrans bleus : $($arrets.Count) code(s) d'arrêt identifié(s)" }
if ($null -ne $espace) { $resume += "Espace libre sur $($env:SystemDrive) : $espace %" }
if ($ecrit) { $resume += 'Rapport déposé sur votre Bureau' }
$detail.Text = ($resume -join [Environment]::NewLine)
[System.Windows.Forms.Application]::DoEvents()
Etape 'Préparation de votre diagnostic…'
Start-Sleep -Milliseconds 400
# ---------------------------------------------------------------- L'adresse
Add-Type -AssemblyName System.Web
$sig = (($compte.Keys | Sort-Object | ForEach-Object { "$_`:$($compte[$_])" }) -join ',')
# ── LA FICHE DE LA MACHINE (Kévin, 24/07/2026) ───────────────────────────────
# « Récupérer la marque, le modèle, le processeur, la RAM, l'état de la batterie,
# tout ce qui concerne l'ordinateur dans la remontée d'infos dans le helpdesk. »
#
# Ces valeurs étaient DÉJÀ relevées (voir « La machine » plus haut) mais restaient
# uniquement dans le rapport déposé sur le Bureau. Elles partent maintenant aussi
# vers le site : arriver chez un client en sachant que c'est un portable HP de 8 Go
# avec une batterie à 62 %, c'est arriver avec la bonne pièce dans le sac.
#
# On n'envoie que du MATÉRIEL — aucun nom d'utilisateur, aucun nom de machine,
# aucun fichier. Le détail personnel reste sur le Bureau, comme depuis l'origine.
$params = @{
releve = '1'
sig = $sig
bsod = ($arrets -join ',')
pc = $(if ($estPortable) { 'portable' } else { 'fixe' })
smart = $smart
marque = $marque
cpu = "$($cpu.Name)".Trim()
coeurs = "$($cpu.NumberOfCores)"
ram = "$ramGo"
os = "$($os.Caption) $($os.Version)".Trim()
disque = $disqueInfo
gpu = $gpuInfo
}
if ($null -ne $espace) { $params['espace'] = "$espace" }
if ($null -ne $sante) { $params['bat'] = "$sante" }
$q = ($params.GetEnumerator() | Where-Object { $_.Value -ne '' } | ForEach-Object {
"$($_.Key)=" + [System.Web.HttpUtility]::UrlEncode([string]$_.Value)
}) -join '&'
$url = $SiteUrl + '?' + $q
$barre.Style = 'Blocks'
$barre.Value = 100
$etat.Text = 'Votre diagnostic s''ouvre dans le navigateur'
$etat.ForeColor = $Or
[System.Windows.Forms.Application]::DoEvents()
Start-Sleep -Milliseconds 500
Start-Process $url
$bouton = New-Object System.Windows.Forms.Button
$bouton.Text = 'Fermer'
$bouton.Font = New-Object System.Drawing.Font('Segoe UI', 11)
$bouton.Size = New-Object System.Drawing.Size(140, 36)
$bouton.Location = New-Object System.Drawing.Point(242, 374)
$bouton.FlatStyle = 'Flat'
$bouton.BackColor = $Or
$bouton.ForeColor = $Sombre
$bouton.FlatAppearance.BorderSize = 0
$bouton.Add_Click({ $form.Close() })
$form.Controls.Add($bouton)
$detail.Size = New-Object System.Drawing.Size(568, 128)
$form.TopMost = $false
$form.Activate()
[System.Windows.Forms.Application]::Run($form)