🎓 SIO1 · semestre 2⏱️ 5 h (cours + TP)🎯 Bloc 2 – SISROuvrir une console PowerShell, comprendre qu'une commande renvoie des objets, les filtrer et les exporter avec le pipeline, écrire un premier script de diagnostic et envoyer une commande à une machine distante.
🎯 Objectifs
Ouvrir PowerShell, distinguer Windows PowerShell 5.1 et PowerShell 7, installer VS Code pour écrire des scripts.
Lire une cmdlet Verbe-Nom et trouver de l'aide avec Get-Help, Get-Command et Get-Member.
Expliquer qu'une commande renvoie des objets et enchaîner un pipeline : filtrer, choisir, trier, compter, exporter en CSV.
Utiliser variables, tableaux, tables de hachage, if, switch et boucles.
Lister des fichiers, des services, des processus, tester le réseau et le DNS.
Écrire un script .ps1 avec paramètres, régler la stratégie d'exécution et lancer une commande à distance (WinRM).
📋 Prérequis
Savoir ouvrir une session sur Windows Server et sur Windows 11, utiliser un invite de commandes.B2-15 · Windows Server 2025
Test express des prérequis 3 questions · 2 minutes · conseillé avant de commencer
1. Quelle commande affiche l'adresse IP, le masque et la passerelle d'un poste Windows ?
ipconfig (avec /all pour le détail) affiche la configuration IP de chaque carte. hostname donne seulement le nom de la machine. À revoir : B2-02 · Adressage IPv4.
2. Dans l'Explorateur, où se trouve le dossier C:\Windows\System32 ?
Un chemin se lit de gauche à droite : le lecteur, puis chaque dossier séparé par une barre oblique inverse. Tu en auras besoin pour lister des fichiers.
3. Un service Windows, c'est…
Un service démarre avec Windows et travaille en arrière-plan : le spouleur d'impression, le client DHCP, le serveur DNS… Tu apprendras à les lister et à les redémarrer.
Brocéliande Logistique (entreprise fictive, 60 salariés, siège et agence de Rennes) prépare un audit. Le responsable demande la liste des services qui tournent sur SRV-01, les cinq processus les plus gourmands, et une preuve que le serveur joint bien sa passerelle 172.16.50.254 et le DNS. Jusqu'ici, le technicien faisait des captures d'écran des consoles graphiques, une par serveur.
Tu vas apprendre PowerShell, le langage de commande de Windows : une seule ligne donne la liste, la filtre, la trie et l'enregistre dans un fichier CSV que le responsable ouvre dans un tableur. Tu écriras ensuite un petit script de diagnostic et tu l'enverras à un autre poste.
Le coursLa console et les cmdlets, les objets et le pipeline, puis variables, boucles, fichiers, services, réseau, scripts et administration à distance.
1. La console, les deux PowerShell et VS Code
PowerShell remplace avantageusement l'invite de commandes (cmd) : ses commandes sont plus régulières, elles renvoient des objets que l'on peut filtrer, trier et exporter, et le même langage sert à taper une commande ou à écrire un script.
Deux versions cohabitent, et il faut savoir laquelle tu utilises. Pour le savoir, tape $PSVersionTable.PSVersion.
Les cmdlets de base sont les mêmes dans les deux versions. Sur les serveurs du labo, tu utilises Windows PowerShell 5.1 ; PowerShell 7 est un plus.
1.1 Ouvrir une console
Utilisateur ou administrateurClic droit sur le menu Démarrer → Terminal (admin) ou Windows PowerShell (admin). Sans élévation, les commandes qui modifient le système (arrêter un service, changer une adresse) sont refusées.
L'invitePS C:\Users\Administrateur> : PS signifie PowerShell, puis le dossier courant. Tu tapes la commande après le >.
Les touches utilesTab complète le nom, les flèches ↑ ↓ rappellent les commandes précédentes, Ctrl+C interrompt une commande, cls efface l'écran.
Le texte rougeC'est une erreur. Lis-la en entier : elle dit presque toujours quelle partie de la commande pose problème.
Windows PowerShell · SRV-01quelle version ?
PS C:\> $PSVersionTable.PSVersion # Major 5, Minor 1 : Windows PowerShell ; Major 7 : PowerShell 7 PS C:\> Get-Date # ta première cmdlet : la date et l'heure PS C:\> winget install --id Microsoft.PowerShell # installe PowerShell 7 (commande pwsh) PS C:\> winget install --id Microsoft.VisualStudioCode # installe VS Code sur le poste
Tu verras encore « ISE » (Integrated Scripting Environment), un ancien éditeur livré avec Windows PowerShell 5.1. Il n'évolue plus et ne fonctionne pas avec PowerShell 7 : on lui préfère VS Code. Sur un serveur sans accès Internet, ISE reste un dépannage acceptable.
2. Les cmdlets : Verbe-Nom
Une commande PowerShell s'appelle une cmdlet. Son nom suit une règle simple : un verbe (l'action), un tiret, un nom au singulier (ce sur quoi on agit). Ensuite viennent des paramètres, qui commencent par un tiret.
Clique sur chaque morceau de la commande pour savoir à quoi il sert.
Choisis un morceau : son rôle s'affiche ici.
Les noms sont écrits sans tenir compte des majuscules : get-service fonctionne aussi. On les écrit en majuscules initiales pour la lisibilité.
2.1 Trouver une commande et son mode d'emploi
Personne ne connaît toutes les cmdlets. Trois commandes te donnent l'autonomie :
Get-CommandCherche une commande par morceau de nom : Get-Command *service* liste toutes les cmdlets qui parlent de services. On peut aussi filtrer par verbe : Get-Command -Verb Stop.
Get-HelpAffiche le mode d'emploi : Get-Help Get-Service -Examples montre des exemples à copier. -Online ouvre la page web. Update-Help (en administrateur) télécharge l'aide complète.
Get-MemberMontre ce qu'un résultat contient (propriétés et méthodes) : Get-Service | Get-Member. C'est la clé de la partie 3.
Les aliasDes raccourcis : ls = Get-ChildItem, ? = Where-Object, % = ForEach-Object. Get-Alias les liste. Pratiques à la main ; dans un script, écris le nom complet pour que tout le monde lise.
Windows PowerShell · SRV-01chercher et comprendre
PS C:\> Get-Command *service* # toutes les commandes dont le nom contient « service » PS C:\> Get-Help Get-Service -Examples # des exemples d'utilisation PS C:\> Get-Service -Name Spooler # l'état d'un service PS C:\> Get-Alias ls # ls est un alias de Get-ChildItem
Tu ne connais pas la commande : Get-Command *mot*. Tu ne sais pas l'utiliser : Get-Help commande -Examples. Tu veux savoir ce qu'elle renvoie : commande | Get-Member.
Entraîne-toi. Complète chaque commande, puis vérifie avec ✓.
Afficher la date et l'heure ›
Chercher les commandes « process » ›
Voir des exemples de Get-Process ›
Lister le contenu de Get-Service (Get-Service | …) ›
3. Des objets, pas du texte
Dans cmd, une commande écrit du texte. En PowerShell, Get-Service renvoie une collection d'objets : un objet par service. Ce que tu vois à l'écran n'est qu'une mise en forme de ces objets.
Objet : un élément qui a des propriétés (des informations : Name, Status) et des méthodes (des actions : Stop(), Start()). Un service est un objet, un processus est un objet, un fichier est un objet. Get-Member liste tout ce qu'un objet possède.
Pour bien comprendre : le tapis roulant de l'entrepôt
Chaque service est un colis étiqueté : nom, état, type de démarrage… Les étiquettes sont les propriétés. Le pipeline (la barre verticale |) est le tapis roulant : il transporte les colis tels quels d'une station à la suivante.
Le contrôleur (Where-Object) lit l'étiquette « Status » et écarte les colis qui ne conviennent pas. Le camion (Export-Csv) ne reçoit que les bons. Aucune étape n'a besoin de relire du texte : elle lit directement les étiquettes. C'est ce qui rend PowerShell fiable.
3.1 Le chemin d'un objet dans le pipeline
Suis ce que devient la commande Get-Service | Where-Object Status -eq Running | Select-Object Name, Status | Export-Csv services.csv.
À chaque étape, ce sont des objets qui circulent. Le fichier CSV n'est créé qu'à la toute fin.
4. Le pipeline : filtrer, choisir, trier, exporter
Le pipeline relie des cmdlets avec la barre |. Dans une commande suivante, l'objet en cours s'appelle $_ (ou $PSItem) : $_.Status est la propriété Status de l'objet qui passe.
Cmdlet
Ce qu'elle fait
Exemple
Where-Object
Garde les objets qui respectent une condition
Get-Service | Where-Object Status -eq Running
Select-Object
Choisit des propriétés, ou les premiers / derniers objets
Select-Object Name, Status · Select-Object -First 5
Sort-Object
Trie sur une propriété (-Descending pour l'ordre inverse)
PowerShell n'utilise pas =, > ou < pour comparer : ces signes servent à autre chose (affecter une valeur, rediriger vers un fichier). On écrit des opérateurs avec un tiret.
-eq · -neégal, différent : Status -eq Running. Insensible à la casse.
-gt · -ge · -lt · -leplus grand, plus grand ou égal, plus petit, plus petit ou égal : CPU -gt 100.
-like · -match-like accepte les jokers (Name -like "win*") ; -match accepte une expression régulière.
Écrire Where-Object {$_.CPU > 100} ne compare rien : >redirige la sortie vers un fichier nommé « 100 » et ne filtre pas. Utilise toujours -gt, -lt, -eq.
Windows PowerShell · SRV-01pipeline pour l'audit de Brocéliande
-NoTypeInformationDans Windows PowerShell 5.1, sans ce paramètre, la première ligne du fichier est un commentaire #TYPE … qui gêne le tableur. PowerShell 7 ne l'ajoute plus.
-Encoding UTF8Garde les accents lisibles (« Spouleur d'impression »). En PowerShell 7, UTF8 n'écrit plus de marque BOM et Excel lit mal les accents : écris -Encoding utf8BOM.
-Delimiter ";"Excel en français attend le point-virgule comme séparateur de colonnes. Sans lui, tout apparaît dans une seule colonne.
Format-* en dernierLes cmdlets Format-Table et Format-List produisent du texte pour l'écran. On les met à la fin d'une ligne, jamais avant Export-Csv.
Lire (Get-) → filtrer d'abord (Where-Object) → choisir ou trier → exporter ou formater à la fin. Filtrer tôt réduit le nombre d'objets à traiter.
Entraîne-toi. Écris les pipelines demandés, puis vérifie avec ✓.
Services arrêtés (Get-Service | …) ›
Les 3 premiers processus (Get-Process | …) ›
Opérateur « plus grand que » ›
Paramètre contre le #TYPE du CSV ›
5. Variables, types, tableaux et tables de hachage
Une variable garde une valeur ou des objets pour les réutiliser. Son nom commence par $. On affecte avec =. PowerShell devine le type : texte ([string]), entier ([int]), vrai ou faux ([bool]), date ([datetime]).
Windows PowerShellvariables et types
PS C:\> $serveur = "SRV-01" # texte, entre guillemets PS C:\> $port = 443 # nombre entier PS C:\> $port.GetType().Name # Int32 : le type de la valeur PS C:\> [int]$age = "42" # force le type : le texte "42" devient le nombre 42 PS C:\> $services = Get-Service # une variable peut contenir des objets PS C:\> "Le serveur est $serveur et utilise le port $port" # guillemets doubles : $variable est remplacée PS C:\> 'Le serveur est $serveur' # guillemets simples : texte tel quel, rien n'est remplacé
"Service : $svc.Name" n'affiche pas le nom : PowerShell remplace seulement $svc et laisse « .Name » à côté. Écris "Service : $($svc.Name)" : le $( ) évalue l'expression entière.
5.1 Tableaux et tables de hachage
Un tableau se lit par numéro (en commençant à 0), une table de hachage par le nom de la clé.
Windows PowerShelltableaux et tables de hachage
PS C:\> $noms = @("Spooler", "Dhcp", "W32Time") # un tableau PS C:\> $noms[0] # Spooler : le premier élément porte le numéro 0 PS C:\> $noms += "Dnscache" # ajoute un élément à la fin PS C:\> $noms.Count # 4 PS C:\> $srv = @{ Nom = "SRV-01"; IP = "172.16.50.10" } # accolades pour une table de hachage PS C:\> $srv.IP # 172.16.50.10 PS C:\> Get-Service -Name $noms # un tableau comme valeur de paramètre : 4 services d'un coup
6. Conditions et boucles
6.1 if et switch
Une condition exécute un bloc entre accolades seulement si le test est vrai. if convient pour deux ou trois cas ; switch compare une valeur à une liste de cas.
Windows PowerShellif et switch
PS C:\> $svc = Get-Service -Name Spooler PS C:\> if ($svc.Status -eq "Running") { "Spooler tourne" } else { "Spooler est arrêté" } PS C:\> switch ($svc.StartType) { "Automatic" { "démarre avec Windows" } "Manual" { "démarré à la demande" } "Disabled" { "désactivé" } default { "autre" } } PS C:\> if (-not (Test-Path C:\Temp)) { New-Item -ItemType Directory C:\Temp } # crée le dossier s'il manque
La condition est entre parenthèses, le bloc entre accolades. Les accolades se tapent avec AltGr + 4 et AltGr + =. Une erreur d'accolade ou de parenthèse est la panne n° 1 du débutant : l'éditeur VS Code colore la paire correspondante.
6.2 foreach et ForEach-Object
Deux boucles font la même chose avec deux écritures. foreach parcourt une collection déjà stockée dans une variable ; ForEach-Object (alias %) traite les objets au fil du pipeline, en les appelant $_.
Une boucle fait exactement la même chose pour chaque élément : on écrit le traitement une fois.
Windows PowerShelldeux boucles, même résultat
PS C:\> $services = Get-Service -Name Spooler, Dhcp, W32Time PS C:\> foreach ($s in $services) { "$($s.Name) : $($s.Status)" } # la collection est dans une variable PS C:\> Get-Service -Name Spooler, Dhcp, W32Time | ForEach-Object { "$($_.Name) : $($_.Status)" } # au fil du pipeline : $_ PS C:\> 1..3 | ForEach-Object { "Tour $_" } # 1..3 produit les nombres 1, 2, 3
Souvent, elle est inutile : Get-Service | Where-Object … traite déjà tous les objets. Prends une boucle quand tu dois faire une action différente pour chaque élément, ou plusieurs commandes pour chacun.
7. Travailler avec les fichiers
Un fichier ou un dossier est lui aussi un objet. Quatre cmdlets couvrent l'essentiel :
Get-ChildItem(alias ls, dir) liste le contenu d'un dossier. -Recurse descend dans les sous-dossiers, -Filter *.log garde un type de fichier. Propriétés utiles : Name, Length (taille en octets), LastWriteTime (dernière modification).
Get-Contentlit un fichier texte ligne par ligne. -Tail 20 n'affiche que les 20 dernières lignes, pratique pour un journal.
Set-Content · Add-Contentécrivent dans un fichier : Set-Contentremplace le contenu, Add-Contentajoute à la fin.
Test-Pathrépond True ou False : le chemin existe-t-il ? On l'utilise avant de lire ou de créer.
Windows PowerShell · SRV-01fichiers et dossiers
PS C:\> Test-Path C:\Temp # True ou False PS C:\> New-Item -ItemType Directory -Path C:\Temp -Force # crée le dossier (sans erreur s'il existe déjà) PS C:\> Get-ChildItem C:\Windows\Logs -Recurse -Filter *.log | Sort-Object Length -Descending | Select-Object -First 3 Name, Length PS C:\> Set-Content -Path C:\Temp\audit.txt -Value "Audit SRV-01" # crée ou remplace le fichier PS C:\> Add-Content -Path C:\Temp\audit.txt -Value (Get-Date) # ajoute la date à la fin PS C:\> Get-Content C:\Temp\audit.txt # relit le fichier PS C:\> Get-ChildItem C:\Temp | Where-Object LastWriteTime -lt (Get-Date).AddDays(-30) # fichiers non modifiés depuis 30 jours
Remove-Item n'a pas de corbeille. Teste d'abord avec -WhatIf : la commande affiche ce qu'elle ferait sans rien supprimer. Exemple : Get-ChildItem C:\Temp -Filter *.tmp | Remove-Item -WhatIf. Ajoute -WhatIf à toute commande qui modifie quelque chose si tu hésites.
8. Services et processus
Un service tourne en arrière-plan ; un processus est un programme en cours d'exécution (un service en possède un, mais un programme ouvert par un utilisateur aussi). Les commandes se ressemblent.
Pour…
Services
Processus
Lister
Get-Service
Get-Process
Cibler par nom
Get-Service -Name Spooler
Get-Process -Name notepad
Arrêter
Stop-Service -Name Spooler
Stop-Process -Name notepad
Démarrer
Start-Service -Name Spooler
Start-Process notepad
Redémarrer
Restart-Service -Name Spooler
–
Démarrage automatique
Set-Service -Name Spooler -StartupType Automatic
–
Statusl'état d'un service : Running (en marche) ou Stopped (arrêté).
StartTypequand il démarre : Automatic, Manual ou Disabled.
CPU · WorkingSetpour un processus, le temps de processeur consommé (en secondes) et la mémoire utilisée (en octets). Id est son numéro.
Windows PowerShell (administrateur) · SRV-01inventaire et action
PS C:\> Get-Service | Where-Object { $_.Status -eq "Running" -and $_.StartType -eq "Automatic" } | Measure-Object # combien de services automatiques tournent ? PS C:\> Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 5 Name, Id, @{n="Mo";e={[math]::Round($_.WorkingSet/1MB)}} # cinq plus gros consommateurs de mémoire, en Mo PS C:\> Restart-Service -Name Spooler # redémarre le spouleur d'impression PS C:\> Stop-Service -Name Spooler -WhatIf # simulation : n'arrête rien
Arrêter un service peut couper des utilisateurs : sur le DNS ou le DHCP de SRV-01, tout le siège perdrait ses noms ou ses adresses. Vérifie le nom, ajoute -WhatIf à la première tentative, et vois quels services en dépendent avec Get-Service Spooler -DependentServices.
9. Le réseau en PowerShell
Trois cmdlets remplacent ipconfig, ping et nslookup avec de vrais objets, donc exportables. Tu les enchaînes du plus proche au plus lointain, comme le dépannage de la fiche B2-02.
On part de la machine et on s'éloigne : le premier test qui échoue désigne la zone en cause.
Windows PowerShell · PC-ADMINdiagnostic réseau
PS C:\> Get-NetIPConfiguration # IPv4Address, IPv4DefaultGateway, DNSServer, par carte PS C:\> Test-NetConnection 172.16.99.254 # « ping » en objet : PingSucceeded PS C:\> Test-NetConnection srv-01.broceliande.lan -Port 3389 # le port du Bureau à distance est-il ouvert ? PS C:\> Resolve-DnsName srv-01.broceliande.lan -Type A # enregistrement A : nom → IPv4 PS C:\> Resolve-DnsName 172.16.50.10 # résolution inverse : adresse → nom (PTR) PS C:\> Test-Connection 172.16.50.10 -Count 2 -Quiet # True ou False, idéal dans un if
Cherche deux lignes : PingSucceeded (le ping passe) et, avec -Port, TcpTestSucceeded (le service écoute). Un serveur peut refuser le ping et accepter le port : PingSucceeded : False ne prouve donc pas que la machine est éteinte.
10. Écrire un premier script
Un script est un fichier .ps1 qui contient les commandes que tu aurais tapées. Il se crée dans VS Code (ou le Bloc-notes). Le principe : ce qui marche à la main se copie dans un fichier, puis on remplace les valeurs qui changent par des paramètres.
10.1 Un script de diagnostic avec paramètres
Le bloc param( ) doit être la première instruction du script. Chaque paramètre a un type et une valeur par défaut, utilisée quand on n'en donne pas.
diag-reseau.ps1 C:\Scriptsscript de diagnostic
# diag-reseau.ps1 : test de la passerelle et du DNS, résultat dans un fichier
param(
[string]$Passerelle = "172.16.50.254",
[string]$Nom = "srv-01.broceliande.lan",
[string]$Sortie = "C:\Temp\diag-reseau.txt"
)
$date = Get-Date -Format "dd/MM/yyyy HH:mm"
Set-Content -Path $Sortie -Value "Diagnostic de $env:COMPUTERNAME le $date"
if (Test-Connection $Passerelle -Count 2 -Quiet) { $etat = "OK" } else { $etat = "INJOIGNABLE" }
Add-Content -Path $Sortie -Value "Passerelle $Passerelle : $etat"
$dns = Resolve-DnsName $Nom -Type A -ErrorAction SilentlyContinue
if ($dns) { Add-Content -Path $Sortie -Value "DNS $Nom : $($dns.IPAddress)" }
else { Add-Content -Path $Sortie -Value "DNS $Nom : ÉCHEC" }
Get-NetIPConfiguration | Out-String | Add-Content -Path $Sortie
Get-Content $Sortie
# commentaireTout ce qui suit # est ignoré. Commente le pourquoi, pas le quoi.
param( )Les valeurs que l'utilisateur peut changer. [string] impose un texte, [int] un entier.
$env:COMPUTERNAMEUne variable d'environnement : le nom de la machine. $env:USERNAME donne l'utilisateur.
-ErrorAction SilentlyContinueSi Resolve-DnsName échoue, pas de texte rouge : le script teste ensuite le résultat avec if ($dns).
Windows PowerShell · SRV-01lancer le script
PS C:\Scripts> .\diag-reseau.ps1 # valeurs par défaut ; le « .\ » est obligatoire PS C:\Scripts> .\diag-reseau.ps1 -Passerelle 172.16.99.254 -Sortie C:\Temp\diag-99.txt # d'autres valeurs, sans toucher au fichier PS C:\Scripts> Get-Help .\diag-reseau.ps1 # montre les paramètres du script
PowerShell ne lance pas un script du dossier courant sans le chemin, pour éviter d'exécuter par erreur un fichier piégé. Écris .\diag-reseau.ps1 (le point = ici), ou le chemin complet C:\Scripts\diag-reseau.ps1. Avec un espace dans le chemin, utilise & "C:\Mes scripts\diag.ps1".
10.2 La stratégie d'exécution
Par sécurité, Windows peut refuser de lancer des scripts. Cette stratégie d'exécution ne bloque que les fichiers de script : taper une commande à la main marche toujours. Les valeurs à connaître :
Stratégie
Effet
Où la trouve-t-on ?
Restricted
Aucun script ne s'exécute
Par défaut sur Windows 11
RemoteSigned
Scripts locaux autorisés ; scripts téléchargés seulement s'ils sont signés
Par défaut sur Windows Server ; choix courant
AllSigned
Seuls les scripts signés par un éditeur de confiance
Environnements stricts
Bypass
Tout s'exécute, sans avertissement
Pour une seule fenêtre, jamais en réglage permanent
La stratégie se règle à plusieurs endroits, appelés portées. Quand elles diffèrent, la plus haute dans cette liste l'emporte :
Get-ExecutionPolicy -List affiche les cinq portées et leur valeur. Celle qui est effective est la première qui n'est pas « Undefined ».
Windows PowerShelllire et régler la stratégie
PS C:\> Get-ExecutionPolicy -List # la valeur de chaque portée PS C:\> Get-ExecutionPolicy # la valeur effective, celle qui s'applique PS C:\> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # pour ton compte seulement PS C:\> powershell.exe -ExecutionPolicy Bypass -File .\diag-reseau.ps1 # une seule exécution, rien n'est modifié PS C:\> Unblock-File .\diag-reseau.ps1 # retire la marque « téléchargé » d'un fichier que tu as relu
Une stratégie d'exécution n'est pas une barrière de sécurité : n'importe qui peut la contourner. Ta vraie protection est de lire un script avant de l'exécuter, surtout s'il vient d'Internet, et de ne jamais y écrire un mot de passe en clair.
Un script est bloqué : que faire ? Réponds, l'outil te conseille
Le message parle-t-il d'un fichier « non signé numériquement » ou téléchargé ?Le script vient d'un site, d'un mail ou d'un partage réseau.
Veux-tu pouvoir lancer tes scripts à chaque ouverture de session ?Sur ton propre compte, sur une machine de test ou d'administration.
Relis le script en entier. S'il est sûr : Unblock-File .\script.ps1. Sinon, ne l'exécute pas. Éviter Bypass « pour que ça passe ».
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser : réglage limité à ton compte, sans droits d'administrateur. Si une stratégie de groupe impose une autre valeur, la commande n'aura aucun effet : Get-ExecutionPolicy -List te le montre.
powershell.exe -ExecutionPolicy Bypass -File .\script.ps1 : la stratégie est ignorée pour ce lancement uniquement et rien n'est modifié durablement.
11. Administrer à distance
Se connecter à chaque serveur par le Bureau à distance est lent. WinRM permet d'envoyer des commandes PowerShell à une autre machine depuis la tienne. Deux commandes à connaître :
Enter-PSSessionouvre une session interactive : l'invite devient [SRV-01]: PS C:\> et tout ce que tu tapes s'exécute sur le serveur. Exit-PSSession pour revenir.
Invoke-Commandenvoie un bloc de commandes-ScriptBlock { … } à une ou plusieurs machines et récupère le résultat. Idéal pour interroger plusieurs serveurs d'un coup.
Enable-PSRemotingà lancer sur la machine à administrer, en administrateur : démarre WinRM et ouvre le pare-feu. Windows Server l'a déjà actif ; Windows 11 non.
-Credentialle compte à utiliser. Get-Credential ouvre une fenêtre qui demande l'identifiant et le mot de passe, sans les écrire dans le script.
La commande part de ton poste, s'exécute sur le serveur, et seul le résultat revient.
Windows PowerShell · PC-ADMINcommandes à distance (machines du domaine)
PS C:\> Test-WSMan srv-01.broceliande.lan # WinRM répond-il sur SRV-01 ? PS C:\> Enter-PSSession -ComputerName srv-01.broceliande.lan -Credential (Get-Credential) [srv-01.broceliande.lan]: PS C:\Users\Administrateur\Documents> hostname # SRV-01 : la commande s'exécute sur le serveur [srv-01.broceliande.lan]: PS C:\Users\Administrateur\Documents> Exit-PSSession # retour sur PC-ADMIN PS C:\> Invoke-Command -ComputerName srv-01.broceliande.lan -ScriptBlock { Get-Service -Name Spooler } -Credential (Get-Credential) PS C:\> Invoke-Command -ComputerName srv-01, srv-02 -ScriptBlock { Get-Process | Measure-Object } # plusieurs machines à la fois
Un compte administrateur qui peut ouvrir une session WinRM peut tout faire sur la machine. Garde WinRM limité au réseau d'administration (VLAN 99 chez Brocéliande), jamais ouvert vers Internet, et protège les comptes administrateurs : même en HTTP (5985), le contenu d'une session PowerShell est chiffré après l'authentification ; mais dans un groupe de travail (authentification NTLM), le client ne peut pas vérifier l'identité du serveur, d'où le HTTPS (5986) ou une liste TrustedHosts précise.
11.1 Hors domaine : les machines de confiance
Dans un domaine Active Directory, les machines se reconnaissent par Kerberos et tout marche avec des noms. Entre deux machines d'un groupe de travail (comme au labo), ou en utilisant une adresse IP, le poste administrateur refuse de se connecter à une machine qu'il ne connaît pas. Il faut l'ajouter à la liste TrustedHosts du client.
Windows PowerShell (administrateur)machine cible puis machine client
Cible> Enable-PSRemoting -Force -SkipNetworkProfileCheck # sur la machine à administrer Client> Set-Item WSMan:\localhost\Client\TrustedHosts -Value "172.16.50.10" -Force # sur le poste qui commande Client> Get-Item WSMan:\localhost\Client\TrustedHosts # vérifier la liste Client> Enter-PSSession -ComputerName 172.16.50.10 -Credential Administrateur
Mettre * dans TrustedHosts marche mais supprime la vérification de l'identité de la cible : un attaquant pourrait se faire passer pour elle et récupérer tes identifiants. Liste des adresses précises, et vide la liste après le TP avec Clear-Item WSMan:\localhost\Client\TrustedHosts.
Tu viens de voir l'essentiel pour lire et agir sur une machine. Les sessions persistantes, les fonctions, les modules, la planification de scripts et les erreurs gérées avec try / catch sont vus en B2-30 · Automatisation.
12. Vérifier et dépanner
12.1 Les erreurs classiques
Symptôme
Cause probable
Vérification et correction
« Le terme … n'est pas reconnu comme nom d'applet de commande »
Faute de frappe, module absent, ou script lancé sans .\
Get-Command *mot* ; pour un script, .\nom.ps1
« L'exécution de scripts est désactivée sur ce système »
Stratégie d'exécution Restricted
Get-ExecutionPolicy -List puis RemoteSigned -Scope CurrentUser
« Accès refusé » en arrêtant un service ou en changeant une adresse
Console non élevée
Rouvrir en administrateur ; l'invite de la barre de titre le confirme
La commande n'affiche rien alors qu'il devrait y avoir des résultats
Filtre trop strict, ou comparaison avec >
Relancer sans le Where-Object, puis revenir au filtre avec -eq
CSV avec une seule colonne dans Excel
Séparateur « , » au lieu de « ; »
Export-Csv -Delimiter ";"
« Cannot find a property » / propriété vide
Mauvais nom de propriété
… | Get-Member -MemberType Property
WinRM : « le client ne peut pas traiter la demande »
Cible hors domaine ou adressée par IP
TrustedHosts sur le client ; Enable-PSRemoting sur la cible
12.2 Entraîne-toi : les tickets du support
Tu es de permanence au support de Brocéliande Logistique. Six tickets arrivent les uns après les autres : lis le message, observe la sortie, puis choisis la cause.
File d'attente du support6 tickets · un à la fois · l'explication s'affiche après ta réponse
Ticket n° 1De : stagiaire de l'exploitationPriorité moyenne
« Je cherche les processus qui consomment plus de 100 secondes de processeur. La commande ne renvoie rien du tout, et un drôle de fichier est apparu dans mon dossier. »
Cause : en PowerShell, > écrit dans un fichier (ici « 100 », vide). Le filtre ne reçoit donc jamais de valeur vraie. Correction :Where-Object { $_.CPU -gt 100 }, et supprimer le fichier « 100 » créé par erreur.
Ticket n° 2De : technicien réseauPriorité haute
« Mon script de diagnostic refuse de se lancer sur le nouveau poste Windows 11, alors qu'il marche sur le serveur. »
Windows PowerShell · PC-COMPTA-02
PS C:\Scripts> .\diag-reseau.ps1
.\diag-reseau.ps1 : Impossible de charger le fichier C:\Scripts\diag-reseau.ps1, car
l'exécution de scripts est désactivée sur ce système.
PS C:\Scripts> Get-ExecutionPolicy
Restricted
Que fais-tu en priorité ?
Cause : Windows 11 est livré avec Restricted, alors que Windows Server est en RemoteSigned. Correction : autoriser les scripts locaux pour le seul compte du technicien. Unrestricted sur toute la machine est inutilement permissif, et un fichier .bat n'exécuterait pas du PowerShell.
Ticket n° 3De : comptabilitéPriorité moyenne
« Le fichier des services que m'a envoyé l'informatique est illisible : des colonnes étranges, et rien de ce que j'ai demandé. »
Cause :Format-Table sert à l'écran ; il transforme les services en objets de mise en forme que Export-Csv écrit tels quels. Correction :Get-Service | Select-Object Name, Status | Export-Csv C:\Temp\services.csv -NoTypeInformation -Encoding UTF8 -Delimiter ";".
Ticket n° 4De : stagiairePriorité basse
« Mon script est bien dans le dossier où je suis, mais PowerShell dit qu'il ne le connaît pas. »
Windows PowerShell · SRV-01
PS C:\Scripts> dir diag-reseau.ps1
-a--- 18/10/2026 1204 diag-reseau.ps1
PS C:\Scripts> diag-reseau.ps1
diag-reseau.ps1 : Le terme «diag-reseau.ps1» n'est pas reconnu comme nom d'applet de
commande, fonction, fichier de script ou programme exécutable.
Quelle est la cause ?
Cause : le fichier existe (la commande dir le montre) mais PowerShell n'exécute pas un nom sans chemin. Avec une stratégie Restricted, le message serait différent (« exécution de scripts désactivée »). Correction :.\diag-reseau.ps1.
« Je veux ouvrir une session distante sur le serveur depuis mon poste de test, qui n'est pas dans le domaine. WinRM me répond par une erreur sur l'authentification. »
Windows PowerShell · poste de test
PS C:\> Enter-PSSession -ComputerName 172.16.50.10 -Credential Administrateur
Enter-PSSession : Le client WinRM ne peut pas traiter la demande. Si le schéma
d'authentification est différent de Kerberos, ou si l'ordinateur client n'est pas
joint à un domaine, le transport HTTPS doit être utilisé ou l'ordinateur de
destination doit être ajouté au paramètre de configuration TrustedHosts.
Que fais-tu ?
Cause : hors domaine, ou avec une adresse IP, Kerberos n'est pas utilisable : le client exige que la cible soit déclarée de confiance. Correction :Set-Item WSMan:\localhost\Client\TrustedHosts -Value "172.16.50.10" sur le client, en administrateur. Le pare-feu n'est pas en cause : le message vient du client.
Ticket n° 6De : apprentiQuestion
« Mon script affiche une ligne bizarre au lieu du nom du service. Il n'y a pas d'erreur pourtant. »
Cause : dans une chaîne, $svc.Name remplace seulement $svc (l'objet entier, affiché par son type) puis écrit « .Name ». Correction :"Service : $($svc.Name)". Des guillemets simples n'évalueraient plus du tout la variable.
13. À l'examen et en entreprise
Preuve par la commande : dans un dossier de réalisation, une capture d'écran est utile, une sortie exportée en CSV (inventaire, services, correctifs) est mieux. Ajoute la commande exacte qui l'a produite.
Un script lisible : en-tête qui dit à quoi il sert, paramètres plutôt que valeurs écrites en dur, noms complets de cmdlets (pas d'alias), commentaires sur le pourquoi.
Jamais de mot de passe dans un script : utilise Get-Credential ou, plus tard, un coffre de secrets. Un script de la documentation est relu par d'autres.
Cahier de recette : pour chaque test, la commande, le résultat attendu, le résultat obtenu. Les cmdlets Test-NetConnection, Get-Service et Test-Path donnent des réponses nettes (True, Running).
En entreprise : PowerShell est l'outil de base des administrateurs Windows : inventaires, vérifications avant et après une intervention, actions répétitives sur plusieurs serveurs. Un technicien qui sait lire un script gagne en autonomie.
14. L'essentiel
PowerShell travaille avec des objets ; deux versions : Windows PowerShell 5.1 (powershell.exe) et PowerShell 7 (pwsh.exe).
Une cmdlet s'écrit Verbe-Nom au singulier, suivie de paramètres commençant par un tiret.
Pour s'en sortir seul : Get-Command, Get-Help -Examples, Get-Member.
Le pipeline| envoie les objets d'une commande à la suivante ; $_ désigne l'objet en cours.
On filtre avec Where-Object, on choisit avec Select-Object, on trie avec Sort-Object, on compte avec Measure-Object.
Les comparaisons s'écrivent -eq -ne -gt -lt -like ; jamais = ni >. On exporte avec Export-Csv, et Format-* reste en dernier.
Variables en $nom ; tableau @( ) numéroté dès 0 ; table de hachage @{ clé = valeur } ; "$($objet.Propriété)" dans un texte.
if, switch, foreach et ForEach-Object : condition entre parenthèses, bloc entre accolades.
Un script .ps1 se lance avec .\ ; ses valeurs variables sont des param( ) ; la stratégie d'exécution se règle par portée (-Scope CurrentUser).
À distance : Enable-PSRemoting sur la cible, puis Enter-PSSession ou Invoke-Command ; hors domaine, TrustedHosts sur le client.
La fiche en une image : à refaire de mémoire, sur une feuille, avant de passer aux exercices.
Tout cela tient sur une page : utilise le bouton Mémo à imprimer en haut de la fiche.
La pratiqueLe quiz noté pour vérifier tes acquis, les exercices à rendre à ton professeur, puis le TP sur les machines de ton pool Proxmox.
15. Quiz noté
8 questions · 10 minutesRéponds à toutes les questions, puis valide. Seule ta première tentative est enregistrée : elle compte dans ton suivi. Ensuite, tu peux t'entraîner autant que tu veux.
1. Quelle cmdlet respecte la convention de nommage Verbe-Nom ?
2. Tu connais le sujet (« DNS ») mais pas le nom de la commande. Que tapes-tu ?
3. Que fait la commande Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 ?
4. Quel filtre garde les services en marche ?
5. Quel ensemble de paramètres de Export-Csv donne un fichier propre pour un tableur français, accents compris ?
6. Soit $n = @("a", "b", "c"). Que renvoie $n[1] ?
7. Un script sauvegarde.ps1 se trouve dans le dossier courant. Comment le lances-tu ?
8. Quelle commande règle la stratégie d'exécution pour ton seul compte, sans droits administrateur ?
16. Exercices : à toi de répondre
Écris ta réponse sous chaque énoncé et envoie-la à ton professeur. Quand il l'a validée, le corrigé s'affiche à la place du cadenas ; s'il te la renvoie « à revoir », lis son commentaire et corrige. Écris les commandes complètes, pas seulement l'idée.
Exercice 1 – Un pipeline pour l'audit (SIO1)
Écris la ligne qui liste les services dont le type de démarrage est Automatic et qui sont actuellement Stopped, ne garde que les colonnes Name, DisplayName et Status, les trie par nom et les enregistre dans C:\Temp\arret.csv, lisible dans Excel en français avec les accents. Indique ensuite la commande qui compte ces services.
Le corrigé s'affichera ici dès que ton professeur aura validé ta réponse. Cherche d'abord par toi-même : c'est en se trompant qu'on retient.
Exercice 2 – Trouver les trois erreurs (SIO1)
Ce script devait afficher les services arrêtés puis les exporter. Il contient trois erreurs de débutant. Repère-les, explique chacune en une phrase et réécris le script correct.
arret.ps1 script à corriger
$services = Get-Service
foreach ($s in $services) {
if ($s.Status = "Stopped") { Write-Host "Arrêté : $s.Name" }
}
$services | Format-Table Name, Status | Export-Csv C:\Temp\arret.csv
Le corrigé s'affichera ici dès que ton professeur aura validé ta réponse. Cherche d'abord par toi-même : c'est en se trompant qu'on retient.
Exercice 3 – Un script avec paramètre (SIO1)
Écris gros-fichiers.ps1 : il prend un paramètre -Dossier (par défaut C:\Windows\Logs). Si le dossier n'existe pas, il affiche un message et s'arrête. Sinon il affiche les cinq plus gros fichiers du dossier et de ses sous-dossiers avec leur nom et leur taille en Mo. Donne aussi la ligne qui le lance sur C:\Temp.
Le corrigé s'affichera ici dès que ton professeur aura validé ta réponse. Cherche d'abord par toi-même : c'est en se trompant qu'on retient.
Exercice 4 – Concevoir (SIO2)
Brocéliande Logistique a 12 serveurs Windows. Le responsable veut chaque matin la liste des services Automatic arrêtés de tous les serveurs, dans un seul tableau CSV daté. Sans écrire tout le script, décris ta démarche : prérequis sur les serveurs et sur le poste d'administration, commande de collecte, contenu du fichier final, précautions de sécurité, et ce que tu feras si un serveur ne répond pas.
Le corrigé s'affichera ici dès que ton professeur aura validé ta réponse. Cherche d'abord par toi-même : c'est en se trompant qu'on retient.
17. Au labo : inventaire, diagnostic et commande à distance
Objectif
Dans ton pool Proxmox (page Mes serveurs et VM), tu utilises PowerShell sur SRV-01 (Windows Server 2025) et sur ton poste Windows 11 : tu exportes l'inventaire des services et des processus en CSV, tu écris un script .ps1 de diagnostic réseau, puis tu envoies une commande du serveur vers le poste avec WinRM.
Machine
Système
Rôle dans le TP
SRV-01
Windows Server 2025 de ton pool (préparé en B2-15), 172.16.50.10/24
Inventaire, script de diagnostic, poste qui envoie les commandes
PC-COMPTA-01
Windows 11 Pro de ton pool (nom donné à la jonction au domaine en B2-17)
Machine administrée à distance
IPFire
Routeur de ton pool
Passerelle et DNS du réseau du pool
Le TP suit le plan de Brocéliande Logistique : SRV-01 en 172.16.50.10/24, passerelle 172.16.50.254. L'adresse de ton poste Windows 11 est celle qu'affiche Get-NetIPConfiguration sur celui-ci : note-la, elle remplace <IP-poste> dans les commandes. Si le réseau de ton pool est différent, applique le plan que ton professeur t'a donné.
Ce que tu réalises
Une console administrateur ouverte et vérifiée sur les deux machines.
L'inventaire des services et des processus, exporté en CSV et ouvert dans un tableur.
Un scriptdiag-reseau.ps1 avec paramètres, testé en cas normal et en cas de panne.
Une commande à distance envoyée au poste Windows 11 : session interactive puis Invoke-Command.
1 Ouvrir PowerShell en administrateur
Sur SRV-01 : clic droit sur le menu Démarrer → Terminal (admin) ou Windows PowerShell (admin). Vérifie la version, crée tes dossiers et note la réponse de chaque commande.
Avant de taper, complète les commandes, puis vérifie avec ✓.
Afficher la version de PowerShell ›
Le dossier C:\Temp existe-t-il ? ›
Créer C:\Temp (cmdlet + type) ›
Valeur effective de la stratégie ›
Windows PowerShell (administrateur)SRV-01 · préparation
PS C:\> $PSVersionTable.PSVersion # Major 5 : Windows PowerShell 5.1 PS C:\> New-Item -ItemType Directory -Path C:\Temp, C:\Scripts -Force # deux dossiers, sans erreur s'ils existent PS C:\> Get-ExecutionPolicy # RemoteSigned sur un serveur
2 Exporter l'inventaire en CSV
Exporte tous les services (colonnes Name, DisplayName, Status, StartType), triés par état puis par nom, dans C:\Temp\services.csv.
Exporte les dix processus qui utilisent le plus de mémoire (Name, Id, WorkingSet) dans C:\Temp\processus.csv.
Affiche le contenu des fichiers avec Get-Content et compte les services en marche avec Measure-Object.
Ouvre services.csv dans un tableur : les colonnes doivent être séparées et les accents lisibles. Sinon, relis le paramètre -Delimiter.
Windows PowerShell (administrateur)SRV-01 · inventaire
PS C:\> Get-Service | Select-Object Name, DisplayName, Status, StartType | Sort-Object Status, Name | Export-Csv C:\Temp\services.csv -NoTypeInformation -Encoding UTF8 -Delimiter ";" PS C:\> Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10 Name, Id, WorkingSet | Export-Csv C:\Temp\processus.csv -NoTypeInformation -Encoding UTF8 -Delimiter ";" PS C:\> Get-Service | Where-Object Status -eq Running | Measure-Object # Count = nombre de services en marche PS C:\> Get-Content C:\Temp\processus.csv -TotalCount 3 # les trois premières lignes du fichier
3 Écrire le script de diagnostic réseau
Dans VS Code (ou le Bloc-notes), crée C:\Scripts\diag-reseau.ps1 avec le script de la partie 10.1. Vérifie que le paramètre -Passerelle vaut bien la passerelle de ton réseau, puis lance-le.
Windows PowerShell (administrateur)SRV-01 · test du script
PS C:\> cd C:\Scripts PS C:\Scripts> .\diag-reseau.ps1 # cas normal : passerelle OK, DNS résolu PS C:\Scripts> .\diag-reseau.ps1 -Passerelle 172.16.50.99 -Sortie C:\Temp\diag-panne.txt # cas de panne : INJOIGNABLE attendu PS C:\Scripts> Get-Content C:\Temp\diag-panne.txt
Le nom srv-01.broceliande.lan n'existe que si ton DNS le connaît. Si la ligne DNS indique « ÉCHEC » dans le cas normal, passe le nom que ton serveur sait résoudre : .\diag-reseau.ps1 -Nom srv-01, ou un nom public comme www.debian.org.
4 Préparer le poste Windows 11
Sur le poste (PC-COMPTA-01), ouvre PowerShell en administrateur. Relève son adresse, autorise les connexions WinRM et, si ton compte est un compte local administrateur autre que le compte « Administrateur » intégré, lève le filtrage à distance de ce compte.
Windows 11 PowerShell (administrateur)PC-COMPTA-01 · poste administré
PS C:\> Get-NetIPConfiguration # note IPv4Address : c'est <IP-poste> PS C:\> Enable-PSRemoting -Force -SkipNetworkProfileCheck # démarre WinRM et ouvre le pare-feu (5985) PS C:\> New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name LocalAccountTokenFilterPolicy -Value 1 -PropertyType DWord -Force # seulement si « Accès refusé » à l'étape 5 PS C:\> Get-Service WinRM # Status : Running
5 Envoyer des commandes du serveur au poste
Retourne sur SRV-01. Le poste n'est pas dans un domaine : déclare-le de confiance, teste le port WinRM, ouvre une session interactive, puis envoie un bloc de commandes.
Windows PowerShell (administrateur)SRV-01 · client
PS C:\> Set-Item WSMan:\localhost\Client\TrustedHosts -Value "<IP-poste>" -Force PS C:\> Test-NetConnection <IP-poste> -Port 5985 # TcpTestSucceeded : True PS C:\> $cred = Get-Credential # compte administrateur du poste Windows 11 PS C:\> Enter-PSSession -ComputerName <IP-poste> -Credential $cred [<IP-poste>]: PS C:\> hostname # le nom du poste : la commande s'est exécutée là-bas [<IP-poste>]: PS C:\> Exit-PSSession PS C:\> Invoke-Command -ComputerName <IP-poste> -Credential $cred -ScriptBlock { New-Item -ItemType Directory C:\Temp -Force | Out-Null } PS C:\> Invoke-Command -ComputerName <IP-poste> -Credential $cred -FilePath C:\Scripts\diag-reseau.ps1 -ArgumentList "<passerelle-du-poste>" # exécute ton script sur le poste PS C:\> Invoke-Command -ComputerName <IP-poste> -Credential $cred -ScriptBlock { Get-Content C:\Temp\diag-reseau.txt } # relit le résultat
Si l'authentification est refusée alors que le mot de passe est juste, c'est le filtrage UAC des comptes locaux : lance la commande LocalAccountTokenFilterPolicy de l'étape 4 sur le poste. Si c'est une erreur « TrustedHosts », elle se règle sur le client, c'est-à-dire SRV-01.
6 Nettoyer
Vide la liste des machines de confiance et ferme tes sessions. Sur le poste, Disable-PSRemoting -Force retire l'écoute WinRM si ton professeur le demande.