Sophie pose le ticket le plus complet reçu jusqu’ici : « Avant de déployer quoi que ce soit sur un nouveau poste Nordika, j’ai besoin d’un script qui me sort un rapport d’inventaire : espace disque, RAM totale, état de 3 services critiques, et le nombre de comptes locaux présents. Le tout dans un fichier texte que je peux archiver. »
Objectif
Combiner tout ce qui a été vu depuis la section 1 (Get-Process, pipeline, Measure-Object) et toute la section 4 (Providers, fichiers, services, comptes locaux) pour produire un script d’inventaire complet, avec un export dans un fichier.
Consignes
Étape 1 — Récupérez l’espace disque disponible et total du lecteur C: en Go.
Indice : Get-Volume (ou Get-PSDrive C si Get-Volume n’est pas disponible) renvoie des propriétés comme SizeRemaining et Size. Pensez à la conversion vue en TP de la section 2 (/1GB).
Étape 2 — Récupérez la RAM totale du poste, en Go.
Indice : Get-CimInstance -ClassName Win32_ComputerSystem renvoie une propriété TotalPhysicalMemory, en octets.
Étape 3 — Vérifiez l’état de 3 services critiques : Spooler, W32Time, Dnscache. Utilisez un tableau et une boucle, comme vu en leçon 4.3.
Étape 4 — Comptez le nombre de comptes utilisateurs locaux présents sur la machine (leçon 4.4).
Étape 5 — Assemblez toutes ces informations dans une chaîne de texte lisible, et écrivez-la dans un fichier C:\Nordika\Rapports\inventaire_<nomdelamachine>.txt (leçon 4.2). Créez le dossier au préalable s’il n’existe pas.
Indice : $env:COMPUTERNAME (Provider Env: vu en 4.1) donne le nom de la machine locale.
Étape 6 (bonus) — Ajoutez la date et l’heure du rapport en première ligne du fichier.
Solution commentée
# Étape 5 (partie création dossier) — anticipée en premier pour que tout soit prêt
$dossierRapports = "C:\Nordika\Rapports"
if (-not (Test-Path $dossierRapports)) {
New-Item -Path $dossierRapports -ItemType Directory | Out-Null
}
# Étape 1 : Espace disque
$disque = Get-Volume -DriveLetter C
$espaceLibre = [math]::Round($disque.SizeRemaining / 1GB, 1)
$espaceTotal = [math]::Round($disque.Size / 1GB, 1)
# Étape 2 : RAM totale
$ram = Get-CimInstance -ClassName Win32_ComputerSystem
$ramTotale = [math]::Round($ram.TotalPhysicalMemory / 1GB, 1)
# Étape 3 : Services critiques
$servicesCritiques = "Spooler", "W32Time", "Dnscache"
$rapportServices = foreach ($nomService in $servicesCritiques) {
$service = Get-Service -Name $nomService -ErrorAction SilentlyContinue
"$nomService : $($service.Status)"
}
# Étape 4 : Comptes locaux
$nombreComptes = (Get-LocalUser).Count
# Étape 6 : Date du rapport
$dateRapport = Get-Date
# Étape 5 : Assemblage et export
$nomFichier = "$dossierRapports\inventaire_$env:COMPUTERNAME.txt"
$contenu = @"
Rapport d'inventaire - $env:COMPUTERNAME
Généré le : $dateRapport
Espace disque C: : $espaceLibre Go libres sur $espaceTotal Go
RAM totale : $ramTotale Go
Services critiques :
$($rapportServices -join "`n")
Nombre de comptes locaux : $nombreComptes
"@
Set-Content -Path $nomFichier -Value $contenu
Write-Output "Rapport généré : $nomFichier"
Points clés à retenir :
$env:COMPUTERNAME : notation directe du Provider Env: vu en 4.1, sans passer par Get-ChildItem Env:.foreach (...) { } assigné directement à une variable ($rapportServices = foreach ...) : chaque ligne produite dans la boucle est automatiquement collectée dans un tableau. C’est une astuce d’écriture qu’on approfondira en section 5, mais qui fonctionne dès maintenant.-join "n »: rassemble les éléments du tableau$rapportServicesen une seule chaîne, avec un retour à la ligne (``n « ) entre chacun.@" ... "@ : une chaîne multi-lignes (heredoc), pratique pour construire un texte structuré sans multiplier les Write-Output ou les concaténations.Get-CimInstance remplace l’ancien Get-WmiObject, aujourd’hui déprécié : c’est la cmdlet moderne à privilégier pour interroger les informations matérielles d’un poste.
Ce TP est le plus complet de la formation jusqu’ici : il mobilise cinq leçons différentes en une seule fois. Si l’assemblage final vous a semblé dense, c’est normal — la syntaxe @" ... "@ et le foreach assigné à une variable seront revus et expliqués plus en détail dès la section 5, dédiée entièrement au scripting.