Ajouter un domaine d'expertise à ton inventaire : commandes PowerShell, structure JSON, affichage dédié.
Chaque élève apporte un domaine d'expertise au parc. Ton module :
À la fin, tous les modules sont visibles dans le même dashboard — chacun voit le résultat des autres.
Ton numéro est inscrit au tableau. Voici les 8 modules :
| N° | Module | Slug | Question à éclairer |
|---|---|---|---|
| 1 | Réseau & IP | network |
Mon PC est-il bien configuré pour le réseau ? |
| 2 | Sécurité & patchs | security |
Mon PC est-il à jour ? Defender est-il actif ? |
| 3 | Utilisateurs & groupes | users |
Qui a les droits sur mon PC ? |
| 4 | Services & démarrage | startup |
Qu'est-ce qui démarre avec Windows ? |
| 5 | Périphériques USB | usb |
Qu'est-ce qui est branché en USB ? |
| 6 | Tâches planifiées | scheduler |
Qu'est-ce qui se déclenche tout seul ? |
| 7 | Connexions actives | connections |
Mon PC parle-t-il à des inconnus ? |
| 8 | Santé du disque | health |
Combien de temps va vivre mon disque ? |
Tous les modules doivent respecter cette enveloppe :
{
"module": {
"name": "network",
"summary": "Une phrase humaine (15 mots max) résumant l'état observé",
"stats": {
"primaryMetric": "valeur clé chiffrée",
"primaryLabel": "ce que représente la valeur"
},
"data": { /* dépend du module */ }
}
}
Le summary et la primaryMetric sont affichés directement dans la
carte du dashboard. Le data est affiché en détail sur la fiche PC.
💡 Pourquoi cette enveloppe ? Pour que le PHP du dashboard puisse afficher quelque chose sans connaître les modules à l'avance. C'est de l'extensibilité par convention — un principe qu'on retrouve dans tous les gros logiciels.
network)$adaptateurs = Get-NetAdapter |
Where-Object Status -eq 'Up' |
Select-Object Name, InterfaceDescription, LinkSpeed, MacAddress
$ips = Get-NetIPAddress -AddressFamily IPv4 |
Where-Object { $_.IPAddress -notlike '169.*' -and $_.IPAddress -ne '127.0.0.1' } |
Select-Object InterfaceAlias, IPAddress, PrefixLength
$dns = Get-DnsClientServerAddress -AddressFamily IPv4 |
Where-Object ServerAddresses |
Select-Object InterfaceAlias, ServerAddresses
primaryMetric : nombre d'adaptateurs actifsprimaryLabel : "interfaces actives"summary : ex. "3 interfaces actives, IP principale 192.168.1.42"Tableau des adaptateurs, badge pour chaque IP, liste des serveurs DNS.
security)$hotfixes = Get-HotFix | Select-Object HotFixID, Description, InstalledOn |
Sort-Object InstalledOn -Descending |
Select-Object -First 20
$defender = Get-MpComputerStatus |
Select-Object AntivirusEnabled, RealTimeProtectionEnabled,
AntivirusSignatureLastUpdated, AMServiceEnabled
primaryMetric : nombre de jours depuis le dernier patchsummary : "Defender actif, dernier patch il y a 12 jours"Get-HotFix ne montre que les patchs wusa. Pour Windows 10/11 récents,
Get-WindowsUpdate (du module PSWindowsUpdate) est plus complet, mais
demande une installation. Reste sur Get-HotFix pour le TP.users)$users = Get-LocalUser |
Select-Object Name, Enabled, LastLogon, PasswordRequired
$admins = Get-LocalGroupMember -Group 'Administrators' -ErrorAction SilentlyContinue |
Select-Object Name, PrincipalSource
$groups = Get-LocalGroup | Select-Object Name, Description
primaryMetric : nombre d'administrateurs locauxsummary : "4 utilisateurs locaux, 2 admins"C'est l'occasion de discuter du principe de moindre privilège. Un PC avec 5 administrateurs locaux est une mauvaise idée. Tu peux colorer en rouge les comptes admin dans la fiche PC.
startup)$servicesActifs = Get-Service |
Where-Object Status -eq 'Running' |
Select-Object Name, DisplayName, StartType
$startups = Get-CimInstance Win32_StartupCommand |
Select-Object Name, Command, Location, User
primaryMetric : nombre de programmes au démarragesummary : "42 services actifs, 8 programmes au démarrage"Quels programmes au démarrage sont vraiment nécessaires ? Pour ton mockup,
mets un bouton « Suspicieux » qui surligne les Command pointant ailleurs
que C:\Program Files.
usb)$usb = Get-PnpDevice -PresentOnly |
Where-Object Class -in @('USB','HIDClass','Camera','Bluetooth','Image') |
Select-Object FriendlyName, Class, Manufacturer, Status
primaryMetric : nombre de périphériques USB connectéssummary : "7 périphériques USB, dont 1 caméra et 1 clé"Différencier visuellement les classes (icône clavier, souris, stockage…). Beau défi de design.
scheduler)$taches = Get-ScheduledTask |
Where-Object State -eq 'Ready' |
Select-Object TaskName, TaskPath, Author,
@{N='LastRun'; E={(Get-ScheduledTaskInfo $_).LastRunTime}},
@{N='NextRun'; E={(Get-ScheduledTaskInfo $_).NextRunTime}}
primaryMetric : nombre de tâches prêtes à se déclenchersummary : "112 tâches planifiées, prochaine dans 2 heures"Il y a beaucoup de tâches Microsoft. Filtre TaskPath -notlike '*\Microsoft\*'
si tu veux ne voir que les tâches tierces.
connections)$connexions = Get-NetTCPConnection -State Established |
Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort,
@{N='Process'; E={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName}}
primaryMetric : nombre de connexions sortantes ouvertessummary : "23 connexions actives, 8 processus différents"Regrouper par Process et compter. Top 5 des processus qui communiquent
le plus.
health)$physical = Get-PhysicalDisk |
Select-Object FriendlyName, MediaType, HealthStatus,
@{N='SizeGo'; E={[math]::Round($_.Size/1GB,1)}},
Temperature, Usage
$reliability = Get-PhysicalDisk | Get-StorageReliabilityCounter |
Select-Object Temperature, ReadErrorsTotal, WriteErrorsTotal,
PowerOnHours, Wear
primaryMetric : score de santé (0-100 calculé par toi)summary : "SSD 512 Go, état Healthy, 2 ans en service"Inspire-toi : 100 - (wear%) - (errors > 100 ? 20 : 0). À toi de doser.
C'est le module le plus directement écoresponsable. Repérer un disque
en fin de vie permet de le remplacer avant que la machine devienne
inutilisable. C'est concret : tu peux mettre une alerte rouge sur le
dashboard si un disque a Wear > 80 %.
Dans public/pc.php, ajoute juste avant le footer :
<?php if (!empty($rapport['module']['name'])):
$modName = $rapport['module']['name'];
$modFile = __DIR__ . "/modules/$modName.php";
if (is_file($modFile)) {
require $modFile;
}
?>
<?php endif; ?>
Et tu crées public/modules/network.php (et un pour chaque module).
Chaque fichier reçoit $rapport['module']['data'] et l'affiche à sa façon.
💡 Pourquoi un fichier par module ? C'est le pattern « plugin ». Chaque élève maintient son fichier, sans toucher au reste. Pas de conflit Git, pas de cassage mutuel.
Très bon prompt :
Je travaille sur le module "usb" d'un inventaire informatique en PHP/ PowerShell. Voici les commandes PowerShell qui me donnent les périphériques USB connectés : [colle le bloc]. J'aimerais 3 propositions de visualisation HTML (Bootstrap 5, dark mode) pour la fiche PC, qui mettent en évidence le nombre par classe et les périphériques inconnus. Pas de code, juste les idées + ce qu'elles racontent à l'utilisateur.
Mauvais prompt :
Fais-moi le module USB en entier.
Comprends pourquoi : avec le mauvais prompt, ton voisin pourrait livrer exactement le même rendu que toi. Avec le bon, tu fais un choix de design qui te distingue.
Une fois tout intégré, le dashboard montre pour chaque PC :
summary du module spécifique,Et un élève peut comparer son PC à celui de toute la classe. C'est ça, un inventaire de parc.
module.name, module.summary, module.stats, module.data.summary du module pour chaque PC.| Piège | Solution |
|---|---|
Get-ScheduledTask lent ou bloqué par l'antivirus |
Limiter avec -TaskPath '\' |
Get-LocalGroupMember plante avec un message bizarre |
-ErrorAction SilentlyContinue |
| Tu casses la fiche PC pour les autres élèves | Module dans un fichier séparé + is_file avant require |
| Données sensibles dans le JSON (mot de passe, token) | Ne jamais envoyer ces données — vérifier avant l'envoi |
Dernière étape : sécuriser l'API. Pourquoi ? Parce qu'aujourd'hui, n'importe qui sur le réseau de l'école peut envoyer des rapports au nom de n'importe quel PC. On verra le token, et pourquoi on en a besoin.