Cours B2-16 - PowerShell pour débutants
Cours · Fiche de cours

B2-16 - PowerShell pour débutants

B2-16 PowerShell pour débutants

🎓 SIO1 · semestre 2 ⏱️ 5 h (cours + TP) 🎯 Bloc 2 – SISR Ouvrir 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
  • Lire une adresse IPv4, un masque et une passerelle.B2-02 · Adressage IPv4
  • Avoir déjà utilisé quelques commandes de texte (ipconfig, ping, cd, dir).

🧭 Référentiel

  • B2.2 Installer et configurer des éléments d'infrastructure : administrer un serveur et un poste Windows en ligne de commande.
  • B2.3 Identifier, qualifier et réagir face à un incident : diagnostiquer avec des commandes, exporter des constats.
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.
PS> Get-Service Running Dhcp Running Spooler Stopped W32Time PS> _ 25 × UNE COMMANDE, PAS 25 CLICS AUDIT À RENDRE

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.

>_ Windows PowerShell 5.1 programme : powershell.exe · fond bleu • déjà installé sur Windows 10, 11 et Server• ne reçoit plus que des correctifs• réservé à Windows : modules d'administration >_ PowerShell 7 programme : pwsh.exe · fond noir • à installer (winget), vit à côté de la 5.1• en développement actif, Windows et Linux• plus rapide, meilleures valeurs par défaut </> Visual Studio Code + extension « PowerShell » éditeur de scripts : coloration, complétion, exécution de la sélection avec F8, console intégrée
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.

Get - Service -Name Spooler verbe nom (au singulier) paramètre valeur Get-Service -Name Spooler « obtenir le service dont le nom est Spooler »

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.

Get-Serviceentrepôt Where-Objectcontrôleur Export-Csvcamion Running Stopped Running écarté : Stopped

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.

Get-Service Where-Object Select-Object Export-Csv 3 objets · ~20 propriétésStatus -eq RunningName, Statusservices.csv SpoolerRunning · Automatic DhcpRunning · Automatic FaxStopped · Manual SpoolerRunning · Automatic DhcpRunning · Automatic Fax : écarté ✗ SpoolerRunning DhcpRunning "Name","Status""Spooler","Running""Dhcp","Running"
À 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.

CmdletCe qu'elle faitExemple
Where-ObjectGarde les objets qui respectent une conditionGet-Service | Where-Object Status -eq Running
Select-ObjectChoisit des propriétés, ou les premiers / derniers objetsSelect-Object Name, Status · Select-Object -First 5
Sort-ObjectTrie sur une propriété (-Descending pour l'ordre inverse)Get-Process | Sort-Object CPU -Descending
Measure-ObjectCompte, additionne, calcule moyenne, min, maxGet-Process | Measure-Object · Measure-Object WorkingSet -Sum
Format-Table · Format-ListMet en forme pour l'écran (tableau ou liste)Format-Table -AutoSize · Format-List *
Export-CsvEnregistre les objets dans un fichier CSVExport-Csv C:\Temp\services.csv -NoTypeInformation

4.1 Les opérateurs de comparaison

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.
  • -and · -or · -notcombinent des conditions : $_.Status -eq "Running" -and $_.StartType -eq "Manual".

É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
PS C:\> Get-Service | Where-Object Status -eq Running # syntaxe simple : propriété, opérateur, valeur
PS C:\> Get-Service | Where-Object { $_.Status -eq "Running" -and $_.StartType -eq "Manual" } # syntaxe à accolades : conditions combinées
PS C:\> Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name, Id, CPU
PS C:\> Get-Process | Measure-Object # Count : nombre de processus
PS C:\> Get-Service | Select-Object Name, Status, StartType | Export-Csv C:\Temp\services.csv -NoTypeInformation -Encoding UTF8 -Delimiter ";"

4.2 Exporter proprement

  • -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

Tableau : une liste numérotée à partir de 0 $noms = @("Spooler", "Dhcp", "W32Time") Spooler Dhcp W32Time [0][1][2] $noms[1] → Dhcp $noms.Count → 3 · $noms[-1] → le dernier Table de hachage : des paires clé = valeur $srv = @{ Nom = "SRV-01"; IP = "172.16.50.10" } Nom SRV-01 IP 172.16.50.10 $srv.IP → 172.16.50.10 on retrouve une valeur par son nom, pas par sa place
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 $_.

$services Spooler Dhcp W32Time $s= Spooler corps de la boucle :"$($s.Name) : $($s.Status)" PS> foreach ($s in $services) Spooler : Running Dhcp : Running W32Time : Stopped PS> _ (fin de la boucle)
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-Content remplace le contenu, Add-Content ajoute à 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…ServicesProcessus
ListerGet-ServiceGet-Process
Cibler par nomGet-Service -Name SpoolerGet-Process -Name notepad
ArrêterStop-Service -Name SpoolerStop-Process -Name notepad
DémarrerStart-Service -Name SpoolerStart-Process notepad
RedémarrerRestart-Service -Name Spooler–
Démarrage automatiqueSet-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.

PC-ADMIN passerelle172.16.99.254 Internetport 443 SRV-01 · DNS Get-NetIPConfiguration172.16.99.20 · GW .254 Test-NetConnectiongateway · Ping : True Resolve-DnsNamenom → adresse IP Test-NetConnection -PortTcpTestSucceeded : True
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égieEffetOù la trouve-t-on ?
RestrictedAucun script ne s'exécutePar défaut sur Windows 11
RemoteSignedScripts locaux autorisés ; scripts téléchargés seulement s'ils sont signésPar défaut sur Windows Server ; choix courant
AllSignedSeuls les scripts signés par un éditeur de confianceEnvironnements stricts
BypassTout s'exécute, sans avertissementPour 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 :

MachinePolicy · GPO ordinateur UserPolicy · GPO utilisateur Process · cette fenêtre seulement CurrentUser · ton compte LocalMachine · toute la machine la plus forte la plus faible Les deux premières viennent d'unestratégie de groupe (AD) : on neles modifie pas à la main. Pour toi : CurrentUser(sans droits administrateur).
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.
PC-ADMIN172.16.99.20 · ton poste SRV-01172.16.50.10 · à administrer WinRM écoute : 5985 canal WinRM · port 5985 [SRV-01]: PS C:\> _ Invoke-Command { Get-Service Spooler } script objets StatusNamePSComputerNameRunningSpoolerSRV-01 PS C:\> (de retour sur PC-ADMIN)
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ômeCause probableVé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 RestrictedGet-ExecutionPolicy -List puis RemoteSigned -Scope CurrentUser
« Accès refusé » en arrêtant un service ou en changeant une adresseConsole non élevéeRouvrir en administrateur ; l'invite de la barre de titre le confirme
La commande n'affiche rien alors qu'il devrait y avoir des résultatsFiltre trop strict, ou comparaison avec >Relancer sans le Where-Object, puis revenir au filtre avec -eq
CSV avec une seule colonne dans ExcelSéparateur « , » au lieu de « ; »Export-Csv -Delimiter ";"
« Cannot find a property » / propriété videMauvais nom de propriété… | Get-Member -MemberType Property
WinRM : « le client ne peut pas traiter la demande »Cible hors domaine ou adressée par IPTrustedHosts 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. »
Windows PowerShell · poste du stagiaire
PS C:\Users\stagiaire> Get-Process | Where-Object { $_.CPU > 100 }
PS C:\Users\stagiaire> dir

    Mode   LastWriteTime   Length Name
    -a---  18/10/2026       0      100

Quelle est la cause ?

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é. »
Windows commande utilisée et début du fichier
Get-Service | Format-Table Name, Status | Export-Csv C:\Temp\services.csv

#TYPE Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
"ClassId2e4f51ef21dd47e99d3c952918aff9cd","pageHeaderEntry",...

Quelle est la cause ?

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.

Ticket n° 5De : administrateur systèmePriorité haute
« 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. »
Windows PowerShell
PS C:\> $svc = Get-Service -Name Spooler
PS C:\> "Service : $svc.Name"
Service : System.ServiceProcess.ServiceController.Name

Quelle est la correction ?

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

  1. PowerShell travaille avec des objets ; deux versions : Windows PowerShell 5.1 (powershell.exe) et PowerShell 7 (pwsh.exe).
  2. Une cmdlet s'écrit Verbe-Nom au singulier, suivie de paramètres commençant par un tiret.
  3. Pour s'en sortir seul : Get-Command, Get-Help -Examples, Get-Member.
  4. Le pipeline | envoie les objets d'une commande à la suivante ; $_ désigne l'objet en cours.
  5. On filtre avec Where-Object, on choisit avec Select-Object, on trie avec Sort-Object, on compte avec Measure-Object.
  6. Les comparaisons s'écrivent -eq -ne -gt -lt -like ; jamais = ni >. On exporte avec Export-Csv, et Format-* reste en dernier.
  7. Variables en $nom ; tableau @( ) numéroté dès 0 ; table de hachage @{ clé = valeur } ; "$($objet.Propriété)" dans un texte.
  8. if, switch, foreach et ForEach-Object : condition entre parenthèses, bloc entre accolades.
  9. 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).
  10. À distance : Enable-PSRemoting sur la cible, puis Enter-PSSession ou Invoke-Command ; hors domaine, TrustedHosts sur le client.
PowerShellobjets · Verbe-Nom Console5.1 powershell · 7 pwshVS Code pour les scripts CmdletsGet-Command · Get-HelpGet-Member · alias PipelineWhere · Select · SortMeasure · Export-Csv Langage$variable · @( ) · @{ }if · switch · foreach Administrerfichiers · servicesprocessus · réseau Scripts et distant.\script.ps1 · param( )ExecutionPolicy · WinRM
La fiche en une image : à refaire de mémoire, sur une feuille, avant de passer aux exercices.

Les commandes clés

Pour…Commandes
Se repérerGet-Command *mot* · Get-Help cmd -Examples · cmd | Get-Member
Filtrer, choisir, trierWhere-Object Status -eq Running · Select-Object Name, Status · Sort-Object CPU -Descending
ExporterExport-Csv f.csv -NoTypeInformation -Encoding UTF8 -Delimiter ";"
Services, processusGet-Service · Restart-Service -Name X · Get-Process · Stop-Process -Name X
FichiersGet-ChildItem -Recurse · Get-Content · Set-Content · Test-Path
RéseauGet-NetIPConfiguration · Test-NetConnection h -Port 443 · Resolve-DnsName
Scripts et distant.\script.ps1 · Set-ExecutionPolicy RemoteSigned -Scope CurrentUser · Enter-PSSession · Invoke-Command

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.

MachineSystèmeRôle dans le TP
SRV-01Windows Server 2025 de ton pool (préparé en B2-15), 172.16.50.10/24Inventaire, script de diagnostic, poste qui envoie les commandes
PC-COMPTA-01Windows 11 Pro de ton pool (nom donné à la jonction au domaine en B2-17)Machine administrée à distance
IPFireRouteur de ton poolPasserelle 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 script diag-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

  1. Exporte tous les services (colonnes Name, DisplayName, Status, StartType), triés par état puis par nom, dans C:\Temp\services.csv.
  2. Exporte les dix processus qui utilisent le plus de mémoire (Name, Id, WorkingSet) dans C:\Temp\processus.csv.
  3. Affiche le contenu des fichiers avec Get-Content et compte les services en marche avec Measure-Object.
  4. 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.

Windows PowerShell (administrateur)SRV-01
PS C:\> Clear-Item WSMan:\localhost\Client\TrustedHosts -Force
PS C:\> Get-PSSession # aucune session ouverte attendue

7 Valider : le cahier de recette

N°TestCommande ou actionRésultat attenduOK
1La console est administrateur et en 5.1$PSVersionTable.PSVersionMajor 5, Minor 1
2L'inventaire des services est lisibleOuvrir services.csv dans un tableur4 colonnes séparées, accents corrects, une ligne par service
3Les processus sont triés par mémoireGet-Content C:\Temp\processus.csv -TotalCount 3En-tête puis le processus le plus gourmand en premier
4Le script détecte une passerelle valide.\diag-reseau.ps1« Passerelle … : OK »
5Le script détecte une panne.\diag-reseau.ps1 -Passerelle 172.16.50.99« INJOIGNABLE » dans le fichier de sortie
6WinRM répond sur le posteTest-NetConnection <IP-poste> -Port 5985TcpTestSucceeded : True
7La session interactive s'exécute sur le posteEnter-PSSession puis hostnameLe nom du poste Windows 11, pas SRV-01
8Le script a tourné à distanceInvoke-Command avec Get-Content C:\Temp\diag-reseau.txtTexte « Diagnostic de … » avec le nom du poste
9La liste de confiance est vidéeGet-Item WSMan:\localhost\Client\TrustedHostsValeur vide
Suis ta progressionConnecte-toi pour marquer les ressources comme terminées et retrouver ton avancement.
Se connecter