1er pas avec Microsoft Powershell
L’objectif de cet atelier est de découvrir l’interpréteur de commande Powershell de chez Microsoft au travers de sa ligne de commande.
✎ Travail n° 1 Introduction à Microsoft Powershell
Prendre connaissance du document Introduction à Microsoft Powershell
💻 Travail n° 2 Installation
Comme indiqué en début d’atelier, l’utilisation de Microsoft Powershell nécessite son installation au préalable.
🎯 Travail à faire :
-
Télécharger localement depuis le NAS du labo (→
\\Diskstation\install\microsoft\powershell
) la dernière version du package d’installation de Microsoft Powershell :PowerShell-x.y.z-win-x64.msi
oùx.y.z
représente la version de Microsoft Powershell. -
Installer le paquet depuis l’explorateur de fichier (→ option “Installer” dans le menu contextuel qui apparait quand on clique droit sur le fichier) en veillant à respecter le paramétrage suivant :
-
La désactivation des options de mise à jour durant l’installation ne vise qu’à préserver la bande passante au lycée. Dans un environnement professionnel, il faudrait bien sûr les laisser activées.
-
Il est également possible d’installer le package .msi depuis une ligne de commande exécutée en tant qu’administrateur avec la commande suivante :
msiexec /i PowerShell-x.y.z-win-x64.msi
-
-
Exécuter Microsoft Powershell en tapant
pwsh
dans la barre de recherche Windows -
Afficher les informations de version de Microsoft Powershell en exécutant la commande suivante :
Write-OutPut $PSVersionTable
qui affiche sur l’écran la valeur de la variable$PSVersionTable
et vérifier que la version affichée est ≥ 6.0PS C:\Users\ragnar> Write-Output $PSVersionTable Name Value ---- ----- PSVersion 7.3.9 (1) PSEdition Core GitCommitId 7.3.9 OS Microsoft Windows 10.0.19045 Platform Win32NT PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…} PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 WSManStackVersion 3.0
1 Version 7.3.9 > 6.0 ⇒ c’est bien l’édition Powershell Core et non l’édition Windows Powershell
💻 Travail n° 3 Consultation de l’aide d’une commande
🕮 Apport de connaissances :
Microsoft Powershell est relativement complexe à maîtriser. Cependant, à l’instar des pages de manuel de Linux, le système d’aide intégré à Microsoft Powershell contribue considérablement à son apprentissage.
Ce système d’aide est accessible grâce à la cmdlet Get-Help
.
L’aide fournit :
-
des informations précises sur les commandes standards de Microsoft Powershell ou celles des modules additionnels.
Ex. :
Get-Help Format-Table
→ aide sur la cmdletFormat-Table
-
des exemples d’utilisation de commandes grâce à l’option
-Examples
Ex. :
Get-Help Format-Table -Examples
→ exemples d’utilisation de la cmdletFormat-Table
-
des articles plus conceptuels sur le fonctionnement de Microsoft Powershell
Ex. :
Get_Help about_scripts
→ aide sur comment exécuter ou écrire des scripts Microsoft Powershell
L’aide intégrée à Microsoft Powershell lors de son installation ne fournit que des informations sommaires sur les commandes disponibles (syntaxe, nombre et types des paramètres mais par leur signification).
Pour avoir accès localement à l’aide complète, il faut alors l’installer séparément (préférablement en langue anglaise car tous ne sont pas forcément traduits en français).
L’aide complète est également disponible en ligne sur internet. |
🎯 Travail à faire :
-
Exécuter Microsoft Powershell en tant qu’administrateur puis installer les fichiers d’aide avec la cmdlet :
Update-Help -Force -UICulture en-US (1)
1 Installation ders fichiers d’aide en anglais US quelle que soit la langue du système Voir Exemple 4 : Mettre à jour les fichiers d’aide sur plusieurs ordinateurs à partir d’un partage de fichiers
pour installer les fichiers d’aide sans nécessiter d’accès à internet.
-
Afficher l’aide sur la cmdlet
Get-Alias
-
À partir des informations fournies dans la section “REMARKS” de l’aide de la cmdlet
Get-Alias
, déterminer les commandes à exécuter pour afficher :-
les exemples d’utilisation de la cmdlet
Get-Alias
-
l’aide en ligne de la cmdlet
Get-Alias
-
Pour afficher l’aide dans la console avec pagination, c’est-à-dire une page après l’autre, on utilise la commande — ou plus exactement la fonction —
help
plutôt que la cmdletGet-Help
.Ex. :
help Get-Alias
-
Sans avoir recours à internet, on peut afficher l’aide d’une commande de manière un peu plus lisible/navigable que dans la console avec l’option
-ShowWindow
.Ex. :
Get-Help Get-Alias -ShowWindow
-
-
-
Consulter l’aide de la cmdlet
Get-Date
puis déterminer la commande à saisir pour afficher l’heure UTC plutôt que l’heure locale (→ heure locale française - 1h en hiver, heure locale française - 2h en été) -
À partir de l’aide de la cmdlet
Get-Process
, déterminer l’option à fournir pour obtenir le nom de l’utilisateur sous lequel s’exécute le processuspwsh
.
Quelle condition doit être remplie pour que cette commande aboutisse ? -
En s’appuyant sur l’aide de la cmdlet
Get-Member
, déterminer la commande à saisir pour afficher les méthodes et les propriétés de la cmdletGet-Location
.Les méthodes et propriétés des objets retournés par les cmdlets seront abordés plus loin dans l’activité.
💻 Travail n° 4 Actions sur le système de fichiers
🕮 Apport de connaissances :
Microsoft Powershell dispose d’un ensemble de cmdlets pour agir sur le système de fichiers en permettant par exemple de :
-
Se déplacer dans les dossiers
Ex. :
Set-Location c:\windows\system32
-
Afficher le chemin du dossier courant avec
Get-Location
-
Afficher le contenu d’un dossier
Ex. :
Get-ChildItem c:\users
-
Créer un dossier
Ex. :
New-Item ~\nouveau-dossier -ItemType directory
-
Créer un fichier avec du texte
Ex. :
New-Item liste-courses.txt -ItemType file -Value ".pain `n.lait `n.pâtes"
(la séquence`n
représente un retour chariot) -
Supprimer un fichier ou un dossier
Ex. :
Remove-Item liste-courses.txt
-
Déplacer un fichier
Ex. :
Move-Item rapport.docx -Destination backupFolder\rapport.docx.bak
-
Déplacer un dossier
Ex. :
Move-Item backupFolder -Destination archives\bts-ciel\sauvegarde
-
Renommer un fichier ou dossier
Ex. :
Rename-Item monFichier.txt -NewName myFile.txt
-
Copier un fichier
Ex. :
Copy-Item myFile.txt -Destination myFile-copy.txt
-
Copier un dossier avec ses fichiers
Ex. :
Copy-Item monDossier -Destination d:\ –Recurse
-
Tester l’existence d’un fichier ou dossier
Ex. :
Test-Path d:\monDossier
🎯 Travail à faire :
L’objectif du travail est de construire l’arborescence de fichiers suivante :
C:\Users\ragnar
└────public
├───index.html
├───changelog.txt
└───css
└───style.css
-
Relancer Microsoft Powershell en tant qu’utilisateur standard
-
Créer un dossier
htdocs
dans le répertoire d’accueil de votre utilisateur (celui-ci sera renommépublic
plus loin dans le travail)-
Le répertoire d’accueil de l’utilisateur est présent dans la variable automatique
$HOME
-
On peut concaténer, c’est-à-dire mettre bout-à-bout, 2 chaînes de caractères avec l’opérateur ‘+’.
Exemple :PS > ("Répertoire d'accueil : " + $HOME) Répertoire d'accueil : C:\Users\ragnar
-
-
Créer dans
htdocs
2 fichiers vides:-
index.html
-
style.css
(ce fichier sera déplacé par la suite)
-
-
Créer, toujours dans
htdocs
, un fichierchangelog.txt
contenant la date courante suivie du texte “: création”.Exemple de résultat attendu :PS> Get-Content changelog.txt 2023-11-05 16:46:11Z : création
-
Dans l’exemple, le format de la date a été obtenu en fournissant la valeur ‘u’ à l’option
-format
de la cmdletGet-Date
-
On peut concaténer la date retournée par
Get-Date
avec une autre chaîne à condition de la convertir auparavant en chaîne avec la méthodeToString()
.PS> "Date & Heure courantes : " + (Get-Date).toString() Date & Heure courantes : 05/11/2023 16:58:10
-
-
Renommer le dossier
htdocs
enpublic
-
Créer un dossier
css
dans le dossierpublic
-
Déplacer le fichier
style.css
dans le dossiercss
-
Afficher le contenu complet du dossier
public
et de son sous-dossiercss
Résultat attenduDirectory: C:\Users\ragnar\public Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 05/11/2023 17:05 css -a--- 05/11/2023 16:46 33 changelog.txt -a--- 05/11/2023 17:05 0 index.html Directory: C:\Users\ragnar\public\css Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 05/11/2023 17:05 0 style.css
💻 Travail n° 5 Accès aux méthodes et propriétés d’un objet
🕮 Apport de connaissances :
Comme indiqué dans Introduction à Microsoft Powershell, Microsoft Powershell considère tout ce qu’il traite comme des objets.
Cet objets possèdent :
-
des propriétés c’est-à-dire des valeurs qui représentent l’état de l’objet à un instant donné à la manière du modèle, de la couleur, le nombre de litres de carburant dans le réservoir ou le kilométrage d’une voiture
-
des méthodes qui s’apparentent à des actions que l’on appliquer sur l’objet. Dans notre exemple de voiture, ces méthodes seraient par exemple “avancer”, “reculer”, “tourner”…
Pour avoir la liste des méthodes et propriétés d’un objet retourné par une cmdlet ou fonction Microsoft Powershell, on la chaîne à l’aide d’un pipe (→ ‘|’)) avec Get-Member
Get-Date
:PS C:\Users\ragnar> Get-Date | Get-Member
TypeName: System.DateTime (1)
Name MemberType Definition (2)
---- ---------- ----------
Add Method datetime Add(timespan value)
AddDays Method datetime AddDays(double value)
AddHours Method datetime AddHours(double value)
AddMicroseconds Method datetime AddMicroseconds(double value)
AddMilliseconds Method datetime AddMilliseconds(double value)
AddMinutes Method datetime AddMinutes(double value)
AddMonths Method datetime AddMonths(int months)
AddSeconds Method datetime AddSeconds(double value)
AddTicks Method datetime AddTicks(long value)
AddYears Method datetime AddYears(int value)
[...]
Date Property datetime Date {get;}
Day Property int Day {get;}
DayOfWeek Property System.DayOfWeek DayOfWeek {get;}
DayOfYear Property int DayOfYear {get;}
Hour Property int Hour {get;}
[...]
1 | Indication du type de l’objet retourné par Get-Date |
2 | La colonne “MemberType” indique si le membre dont le nom apparaît dans la colonne “Name” est une propriété (→ Property) ou une méthode (→ Method). |
On peut filtrer l’affichage de la cmdlet en lui fournissant un motif de filtrage dans l’option Exemple :
|
Pour accéder aux valeurs des propriétés ou exécuter les méthodes d’un objet, il suffit d’y faire appel grâce à l’opérateur ‘.’ (→ point).
PS > Get-Date (1)
dimanche 12 novembre 2023 12:00:06
PS > (Get-Date).Year (2)
2023
PS > (Get-Date).IsDaylightSavingTime() (3)
False
PS > (Get-Date).AddYears(1) (4)
mardi 12 novembre 2024 12:00:06
PS > (Get-Date).AddYears(1).DayOfWeek (5)
Tuesday
1 | On affiche la date courante |
2 | On affiche la valeur de la propriété Year de l’objet retourné par la cmdlet Get-Date . Noter les parenthèses qui sont nécessaires pour accéder au contenu de la propriété. |
3 | On invoque la méthode IsDaylightSavingTime() pour savoir si on est en heure d’été |
4 | On invoque la méthode AddYears(1) pour ajouter 1 an à la date courante. Noter que l’ajout prend en compte les années bissextiles |
5 | Comme la méthode AddYears() renvoie elle-même un objet de type System.DateTime , on peut accéder à la propriété DayOfWeek de ce nouvel objet. On voit ici qu’il est cette fois inutile de mettre des parenthèses autour de ce qui précède DayOfWeek puisque AddYears() est une méthode et pas une cmdlet. |
Vous allez appliquer ce que vous venez d’apprendre à travers plusieurs exemples.
🎯 Travail à faire :
-
Exécuter l’application Bloc-Notes depuis le menu “Démarrer” de Windows
-
En s’appuyant sur les méthodes et propriétés de l’objet retourné par la cmdlet
Get-Process
(→Get-Process | Get-Member
) :-
Afficher la date/heure du démarrage de l’application Bloc-Notes (← affichage d’une propriété)
-
Tuer (kill en anglais) l’application (← appel d’une méthode)
-
-
Créer un fichier
credentials.txt
dans votre répertoire utilisateur (→C:\Users\<compte>
) avec le contenu suivant :user : ragnar password : Valhalla.4.me!
-
En s’appuyant sur les méthodes/propriétés de l’objet retourné par la cmdlet
Get-ChilItem
:-
Afficher la date de création du fichier
credentials.txt
-
Chiffrer ce fichier
-
Le déplacer dans votre répertoire “Documents”
La méthode utilisée pour déplacer le fichier nécessite un nom de chemin complet : lecteur + chemin absolu + nom de fichier + extension
-
💻 Travail n° 6 Providers
🕮 Apport de connaissances :
Les Providers sont une fonctionnalité proposée par Microsoft Powershell qui consiste à considérer certains éléments (→ Ex. : base de registre, variables d’environnement) comme un système de fichiers.
On peut alors manipuler la base de registre, les variables d’environnement… comme s’il s’agissait d’une arborescence de fichiers/répertoires grâce aux cmdlets usuelles (Get-ChildchilItem
, New-Item
, Set-Location
, Get-Content
…).
La liste des providers disponibles est affichée grâce à la cmdlet Get-PSDrive
ou Get-PSProvider
.
PS C:\Users\ragnar> Get-PSDrive (1)
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
Alias Alias
C 157,39 385,97 FileSystem C:\ Users\ragnar
Cert Certificate \
D 66,95 253,05 FileSystem D:\
Env Environment
Function Function
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
Temp 157,39 385,97 FileSystem C:\Users\ragnar\AppData\Local\Temp\
Variable Variable
WSMan WSMan
PS C:\Users\ragnar> Set-Location env: (2)
PS Env:\> Get-ChildItem (3)
Name Value
---- -----
ALLUSERSPROFILE C:\ProgramData
APPDATA C:\Users\ragnar\AppData\Roaming
[...]
PS Env:\> Get-Content -Path .\NUMBER_OF_PROCESSORS (4)
8
PS Env:\> set-Location C: (5)
PS C:\Users\ragnar>
1 | On affiche la liste des providers |
2 | On se place dans le provider “env:” qui contient l’ensemble des variables d’environnement. |
3 | On liste l’ensemble des variables d’environnement comme on listerait un répertoire du système de fichiers. Noter la nouvelle invite de commande (→ PS Env:\> ) |
4 | On affiche le contenu de la variable d’environnement NUMBER_OF_PROCESSORS comme on afficherait le contenu d’un fichier. On peut aussi directement l’afficher avec $env:NUMBER_OF_PROCESSORS . |
5 | On se déplace à nouveau dans le provider qui gère le système de fichiers (le vrai !) |
Rappel :
Une variable d’environnement est une variable dont le contenu est mis à jour par le système d’exploitation et que les scripts ou programmes peuvent utiliser au cours de leurs traitements. |
🎯 Travail à faire :
-
Quelle commande peut-on saisir pour créer une nouvelle variable d’environnement nommée
STS
dont la valeur vautCIEL
-
Quelle commande peut-on saisir pour afficher le chemin de l’image utilisée pour l’arrière-plan du bureau Windows sachant que cette information est située dans la branche HKEY_CURRENT_USER de la base de registre (→ provider “HKCU:”) ?
💻 Travail n° 7 Pipeline
🕮 Apport de connaissances :
Dans Microsoft Powershell, ce qu’on appelle un “pipeline” correspond à un enchaînement de commandes reliées par le caractère ‘|’ (→ pipe).
Dans cet enchaînement, le résultat de chaque commande est envoyé en tant que valeur d’entrée à la suivante pour être traitée.
PS > Get-Process | Where-Object {$_.Name -eq "notepad"} | Select-Object -ExpandProperty "Id" (1)
19096
22996
1 | On liste les processus → On filtre ceux qui se nomment “notepad” → On affiche leur propriété nommée “Id”. Ici, on voit que 2 instances du Bloc-Notes sont lancées. |
Dans une commande de pipeline, la variable $PSItem
(ou son alias $_
) contient l’objet qui lui a été passée par la commande précédente. Dans l’exemple ci-dessus, la variable $_
contient successivement l’objet retourné par Get-Process
puis celui retourné par Where-Object
.
Lorsqu’on conçoit des pipelines, il est utile de savoir le type du résultat que génère une commande et quelles sont les commandes capables de le prendre en entrée. Les cmdlets Get-Member
et Get-Command
permettent d’obtenir ces informations.
PS > Get-Date | Get-Member
TypeName: System.DateTime(1)
Name MemberType Definition
---- ---------- ----------
Add Method datetime Add(timespan value)
[...]
PS > Get-Command -ParameterType System.DateTime(2)
CommandType Name Version Source
----------- ---- ------- ------
Function Get-NetTCPConnection 1.0.0.0 NetTCPIP
Function Get-NetUDPEndpoint 1.0.0.0 NetTCPIP
Cmdlet Get-Date 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-Job 7.3.9.500 Microsoft.PowerShell.Core
Cmdlet New-TimeSpan 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-Date 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Test-Path 7.0.0.0 Microsoft.PowerShell.Management
PS >
1 | La cmdlet Get-Date retourne un objet de type System.DateTime |
2 | On demande à afficher l’ensemble des fonctions/cmdlets acceptant un objet de type System.DateTime en entrée. |
🎯 🔥 Travail à faire :
Trouver l’enchaînement de cmdlets à exécuter pour afficher à l’écran le nom des interfaces réseau présentes sur la machine qui sont configurées en Dhcp ainsi que leurs adresses Ipv4 et leurs adresses MAC.
Exemple :
|
🞄 🞄 🞄