Aller au contenu principal

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-Service de Stop-Process
  • Découvrir CIM/WMI comme alternative moderne aux paramètres -ComputerName dé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.

NotionSous Linux (systemctl)Sous Windows (PowerShell)
Listersystemctl list-units --type=serviceGet-Service
Étatsystemctl status nginxGet-Service -Name Spooler
Démarrersystemctl start nginxStart-Service -Name Spooler
Arrêtersystemctl stop nginxStop-Service -Name Spooler
Redémarrersystemctl restart nginxRestart-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
attention

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.

attention

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
}
}
astuce

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


Quelle est la différence entre Stop-Service et Stop-Process appliqués à un même service ?


Que se passe-t-il si vous exécutez Get-Process -ComputerName SRV-FIC dans PowerShell 7 ?


Quelle cmdlet rend un service automatique au démarrage ?


TP pour réfléchir et résoudre des problèmes

astuce

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


Bonne pratique - Une liste en donnée, pas en dur

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é


Bonne pratique - Tester avant d'agir

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


Bonne pratique - Produire des objets, pas du texte

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).

📌 Une solution