Piloter les services et les processus
Objectifs de la séance
- Interroger et piloter les services Windows avec PowerShell
- Distinguer un service d'un processus, et
Stop-ServicedeStop-Process - Découvrir CIM/WMI comme alternative moderne aux paramètres
-ComputerNamedépréciés - Construire un objet de rapport avec
[PSCustomObject]
Notions théoriques
Qu'est-ce qu'un service Windows
Un service Windows est un programme qui s'exécute en arrière-plan, sans interface graphique, généralement démarré automatiquement avec le système — l'équivalent Windows d'un démon Linux piloté par systemctl, déjà rencontré dans le cours Linux.
| Notion | Sous Linux (systemctl) | Sous Windows (PowerShell) |
|---|---|---|
| Lister | systemctl list-units --type=service | Get-Service |
| État | systemctl status nginx | Get-Service -Name Spooler |
| Démarrer | systemctl start nginx | Start-Service -Name Spooler |
| Arrêter | systemctl stop nginx | Stop-Service -Name Spooler |
| Redémarrer | systemctl restart nginx | Restart-Service -Name Spooler |
Un service a un état (Running, Stopped, Paused) et un type de démarrage (Automatic, Manual, Disabled).
Interroger les services
Get-Service
Get-Service -Name Spooler
Get-Service -DisplayName "*Impression*"
Get-Service | Where-Object { $_.Status -eq 'Running' }
Deux propriétés supplémentaires utiles : -DependentServices (les services qui dépendent de celui-ci) et -RequiredServices (ceux dont il dépend).
Agir sur les services
Start-Service -Name Spooler
Stop-Service -Name Spooler -Force
Restart-Service -Name Spooler
Set-Service -Name Spooler -StartupType Automatic
-Force arrête aussi les services qui dépendent du service ciblé.
Les processus
Get-Process
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5
Stop-Process -Name notepad -Force
Ne confondez pas Stop-Service et Stop-Process : Stop-Service demande au service de s'arrêter proprement (le programme peut terminer ses traitements en cours), tandis que Stop-Process tue le processus immédiatement, sans lui laisser la possibilité de se fermer correctement. Utilisez toujours Stop-Service pour un service, en réservant Stop-Process -Force aux cas où le service ne répond plus.
Le cas de -ComputerName
Get-Service -ComputerName SRV-FIC et Get-Process -ComputerName SRV-FIC existaient en Windows PowerShell 5.1, en s'appuyant sur RPC/DCOM.
Ce paramètre -ComputerName a été retiré de PowerShell 7. Interroger une machine distante nécessite désormais une autre approche : le PowerShell Remoting, que nous découvrirons à la séance suivante.
CIM/WMI, l'alternative moderne
Get-CimInstance interroge l'infrastructure de gestion Windows (CIM/WMI), et fonctionne aussi bien en local qu'à distance, y compris depuis PowerShell 7 :
Get-CimInstance -ClassName Win32_Service
Get-CimInstance -ClassName Win32_OperatingSystem
Get-CimInstance -ClassName Win32_LogicalDisk -ComputerName SRV-FIC
Chaque ClassName correspond à une catégorie d'information (services, système d'exploitation, disques...).
Fabriquer un objet de rapport
Rappel du niveau 1 : PowerShell fait circuler des objets, pas du texte. [PSCustomObject] permet de construire son propre objet, avec les propriétés de son choix :
[PSCustomObject]@{
Machine = $env:COMPUTERNAME
Service = "Spooler"
Etat = "Running"
}
Cet objet peut ensuite être trié, filtré, exporté en CSV — exactement comme un objet renvoyé par une cmdlet native. C'est la technique que nous utiliserons pour tous les scripts de rapport du reste de ce cours.
Exemple pratique
# Script : Get-EtatServices.ps1
# Role : verifier que les services critiques d'un poste sont demarres
$servicesCritiques = @("Spooler", "W32Time", "WinRM")
foreach ($nomService in $servicesCritiques) {
$service = Get-Service -Name $nomService
if ($service.Status -ne "Running") {
Write-Host "$nomService est arrete : redemarrage..."
Start-Service -Name $nomService
}
[PSCustomObject]@{
Machine = $env:COMPUTERNAME
Service = $service.Name
Etat = (Get-Service -Name $nomService).Status
Demarrage = (Get-CimInstance Win32_Service -Filter "Name='$nomService'").StartMode
}
}
En produisant des objets plutôt que du texte affiché avec Write-Host, ce script pourra plus tard être trié, filtré et exporté en CSV sans être ré écrit — nous reviendrons sur l'export de rapports dans la dernière séance de ce cours.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Les étapes 1 à 3 utilisent des cmdlets de lecture et fonctionnent sans droits particuliers. Start-Service peut nécessiter une élévation selon le service ciblé : si l'exécution échoue pour cette raison, complétez tout de même les zones à trous, la correction ne dépend pas d'une exécution réelle.
Étape 1 — Boucler sur un tableau de services critiques
Placer la liste des services critiques dans une variable en tête de script, plutôt que de la répéter dans le code, permet de la modifier à un seul endroit.
Étape 2 — Redémarrer le service s'il est arrêté
Vérifier l'état d'un service avant de le redémarrer évite une action inutile — le même réflexe que les tests if [ -d ... ] déjà pratiqués en Bash.
Étape 3 — Renvoyer un objet de rapport
Un script d'administration gagne à renvoyer des objets structurés plutôt que d'afficher directement du texte avec Write-Host : l'appelant du script décide alors lui-même comment les exploiter (trier, filtrer, exporter).