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.

Compte rendu

Relever toutes les commandes saisies pour répondre aux questions avec le résultat auxquelles elles mènent.

✎ 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 :

  1. 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.msix.y.z représente la version de Microsoft Powershell.

  2. 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 :

    install pwsh msi
    • 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

  3. Exécuter Microsoft Powershell en tapant pwsh dans la barre de recherche Windows

    launch pwsh
  4. 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.0

    PS 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 cmdlet Format-Table

  • des exemples d’utilisation de commandes grâce à l’option -Examples

    Ex. : Get-Help Format-Table -Examples → exemples d’utilisation de la cmdlet Format-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 :

  1. 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 link pour installer les fichiers d’aide sans nécessiter d’accès à internet.

  2. Afficher l’aide sur la cmdlet Get-Alias

  3. À partir des informations fournies dans la section “REMARKS” de l’aide de la cmdlet Get-Alias, déterminer les commandes à exécuter pour afficher :

    1. les exemples d’utilisation de la cmdlet Get-Alias

    2. 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 cmdlet Get-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

      get help showwindow
  4. 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é)

  5. À 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 processus pwsh.
    Quelle condition doit être remplie pour que cette commande aboutisse ?

  6. 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 cmdlet Get-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
  1. Relancer Microsoft Powershell en tant qu’utilisateur standard

  2. 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
  3. Créer dans htdocs 2 fichiers vides:

    • index.html

    • style.css (ce fichier sera déplacé par la suite)

  4. Créer, toujours dans htdocs, un fichier changelog.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 cmdlet Get-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éthode ToString().

      PS> "Date & Heure courantes : " + (Get-Date).toString()
      Date & Heure courantes : 05/11/2023 16:58:10
  5. Renommer le dossier htdocs en public

  6. Créer un dossier css dans le dossier public

  7. Déplacer le fichier style.css dans le dossier css

  8. Afficher le contenu complet du dossier public et de son sous-dossier css

    Résultat attendu
        Directory: 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

Exemple pour la cmdlet 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 -Name

Exemple :
PS > Get-Date | Get-Member -Name *Day* (1)

   TypeName: System.DateTime

Name                 MemberType Definition
----                 ---------- ----------
AddDays              Method     datetime AddDays(double value)
IsDaylightSavingTime Method     bool IsDaylightSavingTime()
Day                  Property   int Day {get;}
DayOfWeek            Property   System.DayOfWeek DayOfWeek {get;}
DayOfYear            Property   int DayOfYear {get;}
TimeOfDay            Property   timespan TimeOfDay {get;}
1 Affichage des propriétés et méthodes de l’objet retourné par Get-Date contenant le mot “Day”

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

Exemples :
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 :

  1. Exécuter l’application Bloc-Notes depuis le menu “Démarrer” de Windows

  2. En s’appuyant sur les méthodes et propriétés de l’objet retourné par la cmdlet Get-Process (→ Get-Process | Get-Member) :

    1. Afficher la date/heure du démarrage de l’application Bloc-Notes (← affichage d’une propriété)

    2. Tuer (kill en anglais) l’application (← appel d’une méthode)

  3. Créer un fichier credentials.txt dans votre répertoire utilisateur (→ C:\Users\<compte>) avec le contenu suivant :

    user : ragnar
    password : Valhalla.4.me!
  4. En s’appuyant sur les méthodes/propriétés de l’objet retourné par la cmdlet Get-ChilItem :

    1. Afficher la date de création du fichier credentials.txt

    2. Chiffrer ce fichier

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

Exemple :
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 :

  1. Quelle commande peut-on saisir pour créer une nouvelle variable d’environnement nommée STS dont la valeur vaut CIEL

  2. 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:”) ?

    Voici où se trouve cette information dans la base de registre Windows

    hkcu wallpaper

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

Exemple d’enchaînement de cmdlets pour afficher les identifiants des processus associés aux instances du Bloc-notes en cours d’exécution :
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.

Exemple :
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.

get netipconfiguration
Exemple de résultat attendu
  • L’affichage ci-dessus a été obtenu en chainant les cmdlets Get-NetIpConfiguration, Where-Object et Select-Object

  • L’affichage d’une propriété imbriquée (→ nested property) — comme celle précisant l’état du Dhcp dans la description d’une interface réseau retournée par la cmdlet Get-NetIpConfiguration-- ne peut se faire qu’à travers une “propriété calculée” (→ calculated property). Voir about_Calculated_Properties link.

Exemple :
PS > get-netipconfiguration | format-table @{N="EtatDhcp"; E={$_.NetIPv4Interface.DHCP}}, InterfaceDescription (1)

EtatDhcp InterfaceDescription
-------- --------------------
 Enabled VMware Virtual Ethernet Adapter for VMnet1
 Enabled VMware Virtual Ethernet Adapter for VMnet8
 Enabled Npcap Loopback Adapter
 Enabled Intel(R) Dual Band Wireless-AC 8265
 Enabled Bluetooth Device (Personal Area Network)
 Enabled Intel(R) Ethernet Connection (4) I219-V
1 Utilisation d’une propriété calculée (→ EtatDhcp) pour afficher l’état du DHCP

🞄  🞄  🞄