Comment gérer l’historique des commandes PowerShell exécutées ?

I. Présentation

Depuis PowerShell 5.0, introduit à l'occasion de la sortie de Windows 10 et de Windows Server 2016, PowerShell sauvegarde l'historique des commandes exécutées sur une machine, ce qui n'était pas le cas auparavant. C'était d'ailleurs un inconvénient par rapport à Linux où l'on peut consulter facilement l'historique à l'aide de la commande history.

Dans ce tutoriel, je vais vous expliquer comment visualiser l'historique des commandes PowerShell mais également comment supprimer l'historique des commandes PowerShell exécutées sur une machine. L'historique est géré par le module PSReadLine, natif à Windows.

Tutoriel disponible au format vidéo :

II. Afficher l'historique des commandes PowerShell

Tout d'abord, il faut savoir que si vous ouvrez une console PowerShell ou Windows PowerShell, soit en direct, soit à l'aide d'un outil comme Windows Terminal, vous pouvez consulter l'historique des commandes grâces aux flèches directionnelles : vers le haut et vers le bas. En remontant avec la flèche du haut, vous pourrez consulter l'historique des commandes, de la plus récente à la plus ancienne. Même après reboot de la machine, cet historique reste accessible. Néanmoins, les commandes exécutées au travers d'un exécutable ou de PowerShell ISE ne sont pas consignées dans ce fichier.

Note : sur les versions antérieures à PowerShell 5.0, la commande Get-History sert à consulter l'historique des commandes PowerShell de la session en cours.

L'historique est stocké dans un fichier texte, au sein du profil de chaque utilisateur, dans le fichier suivant :

%UserProfile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

Voici un exemple :

La liste des 4096 dernières commandes exécutées par cet utilisateur sur la machine locale s'affiche dans ce fichier. On peut le vérifier en consultant la valeur de "MaximumHistoryCount" avec la commande suivante :

Get-PSReadLineOption

On peut remarquer également la propriété HistorySaveStyle qui a la valeur "SaveIncrementally". Cela signifie que dès qu'une commande termine son exécution, elle est exécutée à l'historique. Il y a deux autres valeurs possibles : "SaveAtExit" pour ajouter les commandes à l'historique lorsque l'on ferme la console PowerShell, et "SaveNothing" pour désactiver l'historique des commandes PowerShell.

La commande Set-PSReadLineOption va permettre de modifier les différentes valeurs. Par exemple, pour désactiver l'historique :

Set-PSReadlineOption -HistorySaveStyle SaveNothing

Dans le même esprit, on peut modifier l'emplacement du fichier qui contient l'historique des commandes PowerShell :

Set-PSReadlineOption -HistorySavePath "<nouveau-chemin>"

Pour finir sur l'affichage de l'historique, la commande Get-History contient des donnés intéressantes concernant les commandes exécutées dans la session en cours. Pour cela, il faut afficher l'ensemble des propriétés :

Get-History | Format-List -Property *

Cette commande retourne, pour chaque commande, les propriétés suivantes :

  • CommandLine : commande saisie
  • ExecutionStatus : le statut de l'exécution
  • StartExecutionTime : date et heure de début pour l'exécution de la commande
  • EndExecutionTime : date et heure de fin d'exécution de cette commande
  • Duration : temps d'exécution de la commande

III. Rechercher une commande dans l'historique PowerShell

Nous avons vu comment afficher l'historique des commandes PowerShell, maintenant pour rechercher une commande dans l'historique, il n'est pas nécessaire de naviguer avec les flèches directionnelles (et de galérer). Tout d'abord, il faut savoir que l'on peut rechercher à l'aide du raccourci "CTRL+R" (Reverse Search), il suffit d'appuyer sur cette combinaison de touches dans une console pour déclencher l'action de recherche, puis de commencer à saisir le début de la commande à rechercher.

Une autre façon consiste à commencer à saisir le début de la commande, par exemple "Get-Serv" et d'appuyer sur F8 : la commande va se compléter automatiquement sur la base de votre historique, de la commande la plus récente à la plus ancienne. À chaque fois que vous appuyez sur F8, l'autocomplétion remonte dans l'historique.

Pour rechercher une commande dans l'historique de la session PowerShell en cours, on peut toujours s'appuyer sur Get-History. Pour affiner le résultat, on va pouvoir utiliser un pattern (modèle) pour recherche une commande qui commence par "Get-Serv" par exemple :

Get-History | Select-String -Pattern "Get-Serv"

IV. Clear-History : effacer l'historique des commandes PowerShell

Effacer l'historique des commandes PowerShell c'est un excellent moyen d'éviter que des identifiants, mots de passe, ou toute autre donnée sensible trainent dans le fichier texte, disponible en clair, au sein du profil utilisateur. Il y a la solution radicale : désactiver l'historique des commandes, mais ce n'est pas forcément l'idéal. Il y a l'alternative : la suppression de l'historique des commandes de la session en cours grâce à la commande Clear-History.

Si vous venez d'exécuter une commande avec un mot de passe en clair, vous pouvez supprimer uniquement cette commande de l'historique. Clear-History permet d'effacer les X commandes les plus récentes saisies dans la session PowerShell en cours :

Clear-History -Count 1 -Newest

Pour supprimer l'historique de la session PowerShell en cours, sans pour autant supprimer le contenu du fichier texte, il n'est pas nécessaire de spécifier de paramètres :

Clear-History

Enfin, il est possible de supprimer directement le fichier texte afin de remettre à zéro l'historique des commandes. Soit on peut préciser le chemin vers le fichier texte, mais au cas où il serait modifié, il est plus sûr de lire directement la valeur de HistorySavePath. Voici la commande correspondante :

Remove-Item (Get-PSReadlineOption).HistorySavePath

V. Activer l'historique sur les anciennes versions de Windows

Sachez que sur une machine qui exécute un OS antérieur à Windows 10 ou Windows Server 2012 R2, l'historique des commandes PowerShell peut être activé grâce à l'installation de WMF 5.1 (Windows Management Framework) pour mettre à jour Windows PowerShell et l'installation du module PSReadLine :

Install-Module PSReadLine

Pour télécharger WMF 5.1, suivez ce lien.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian Burnel

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

florian has 3285 posts and counting.See all posts by florian

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

 

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.