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 : 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.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 : 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 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 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 processus pwsh. 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 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 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 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 Renommer le dossier htdocs en public Créer un dossier css dans le dossier public Déplacer le fichier style.css dans le dossier css 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 : 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. 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 : Quelle commande peut-on saisir pour créer une nouvelle variable d’environnement nommée STS dont la valeur vaut CIEL 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 💻 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. 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 . 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 🞄 🞄 🞄 Windows Initiation aux scripts Microsoft Powershell