TP N°4: Script d'inventaire du poste (disque, RAM, services critiques)

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

Voir la solutionMasquer la solution
# É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.