Patrick Daxenbichler - Fotolia
Administration système : personnalisez votre profil PowerShell
Adoptez une approche plus rationalisée de PowerShell en apprenant à personnaliser votre profil PowerShell afin d’optimiser les flux de travail, de renforcer la sécurité et de vous adapter à différents environnements.
Si vous exécutez les mêmes commandes à chaque fois que vous lancez la console PowerShell, pensez à modifier votre profil PowerShell pour une meilleure expérience globale.
Le profil PowerShell charge vos paramètres chaque fois que vous lancez PowerShell afin de personnaliser l’environnement en fonction de vos besoins. Vous définissez vos paramètres sous forme de script PowerShell, ce qui simplifie le processus. Cet article explique les concepts qui sous-tendent le profil PowerShell et comment le modifier pour les différentes consoles PowerShell : PowerShell, Windows PowerShell, Visual Studio Code (VS Code), Integrated Scripting Environment (ISE). Il liste plusieurs ajouts utiles à intégrer pour améliorer votre flux de travail et éviter les problèmes potentiels.
Qu’est-ce que le profil PowerShell ?
Le profil PowerShell est simplement un script PowerShell qui s’exécute chaque fois que vous lancez PowerShell, sauf lorsque vous lancez PowerShell avec l’indicateur -NoProfile. L’emplacement du profil varie en fonction de plusieurs conditions :
- La version de PowerShell (Windows PowerShell ou PowerShell)
- Si le profil concerne tous les utilisateurs ou uniquement l’utilisateur actuel
- Si le profil est spécifique à l’application hôte (ISE, VS Code, etc.)
Les listes suivantes sont des répertoires. Les noms des scripts de profil dépendent de l’application hôte. Pour tous les utilisateurs, le profil se trouve ici :
Windows : $PSHOME\
Linux : /usr/local/Microsoft/powershell/7/
macOS : /usr/local/Microsoft/powershell/7/
Pour certains utilisateurs, le profil se trouve ici :
Windows PowerShell : $HOME\Documents\WindowsPowerShell\
Windows : $HOME\Documents\PowerShell\
Linux : ~/.config/powershell/
macOS : ~/.config/powershell/
Dans ces répertoires, vous pouvez avoir plusieurs fichiers de profil valides. La différence entre les profils dépend de l’application hôte qui lance PowerShell. Dans le cadre de cet article, nous utiliserons ISE et VS Code comme exemples d’hôtes :
Tous les hôtes : profile.ps1
ISE : Microsoft.PowerShellISE_profile.ps1
VS Code : Microsoft.VSCode_profile.ps1
Si un utilisateur lance PowerShell dans VS Code, les profils suivants peuvent s’exécuter sous Windows :
Tous les utilisateurs, tous les hôtes : $PSHOME\profile.ps1
Tous les utilisateurs, VS Code : $PSHOME\Microsoft.VSCode_profile.ps1
Utilisateur actuel, tous les hôtes : $HOME\profile.ps1
Utilisateur actuel, VS Code : $HOME\Microsoft.VSCode_profile.ps1
Si l’un des fichiers n’existe pas, PowerShell ignore ce profil.
Comment accéder au profil PowerShell
Le moyen le plus simple d’accéder au profil PowerShell est d’utiliser PowerShell lui-même. Il n’est pas nécessaire de mémoriser les chemins d’accès indiqués, car ils sont tous stockés dans une variable appelée $Profile.
Dans ce cas, le nom d’utilisateur est masqué. Vous remarquerez que le seul chemin d’accès affiché est le profil d’application hôte PowerShell de l’utilisateur actuel. Heureusement, la variable $Profile dispose de propriétés supplémentaires qui nous permettent d’afficher les autres chemins d’accès. Nous pouvons trouver ces propriétés en redirigeant la variable vers Get-Member :
$Profile | Get-Member -MemberType NoteProperty
Par conséquent, si nous voulons trouver le chemin d’accès au profil AllUsersAllHosts, nous pouvons le faire avec :
$Profile.AllUsersAllHosts
Sur notre système, le résultat est C:\Program Files\PowerShell\7\profile.ps1 pour le chemin d’accès. Comme le fichier se trouve dans la hiérarchie Program Files et que nous ne pouvons pas le modifier sans autorisations administratives, concentrons-nous plutôt sur le profil CurrentUserCurrentHost avec :
$Profile.CurrentUserCurrentHost
Si nous voulons modifier ce script, nous pouvons appeler VS Code directement :
code $Profile.CurrentUserCurrentHost
Cela lancera VS Code et ouvrira ce fichier.
Idées d’éléments à ajouter à votre profil
Le profil étant très flexible, vous pouvez l’utiliser de nombreuses façons différentes. Voyons quelques-unes des utilisations que j’ai trouvées utiles au fil des ans.
Ajoutez la reconnaissance du système d’exploitation au profil. Toutes les commandes ne fonctionnent pas de la même manière sur tous les systèmes d’exploitation pris en charge par PowerShell. Nous avons donc besoin d’une logique pour séparer les différentes commandes. Heureusement, PowerShell facilite grandement cette tâche grâce à certaines variables intégrées qui existent sur toutes les plateformes :
$IsWindows est vrai lorsque le programme est exécuté sous Windows.
$IsLinux est vrai lorsque le programme est exécuté sous Linux.
$IsMacOS est vrai lorsque le programme est exécuté sous MacOS.
if ($IsWindows) {
# do Windows stuff
} elseif ($IsLinux) {
# do Linux stuff
} elseif ($IsMacOS) {
# do MacOS stuff
}
Les suggestions suivantes contiennent quelques exemples illustrant comment écrire du code de profil pour plusieurs plateformes.
Personnalisez votre invite de commande. PowerShell vous permet d’exécuter un script à chaque chargement de l’invite de commande, c’est-à-dire à chaque fois que vous exécutez une commande.
Par exemple, si nous voulons placer le curseur sur la ligne sous le chemin d’accès et afficher le symbole # lorsque nous exécutons une commande en tant qu’administrateurs sous Windows ou en tant que root sous Linux, nous pouvons procéder comme suit :
Function Prompt {
$endChar = '>'
# check if running as admin
if ($IsWindows) {
If (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
$endChar = '#'
}
} elseif ($IsLinux) {
if ((id -u) -eq 0) {
$endChar = '#'
}
}
"$PWD`nPS$endchar"
}
Comme nous voulons que cela s’exécute à chaque chargement de PowerShell, ajoutez-le à votre profil.
Chargez un module PowerShell et définissez les propriétés par défaut. Une erreur que je commets régulièrement est d’utiliser un module qui nécessite une authentification avant de s’authentifier. Certains modules sont astucieux et vous rappellent de vous authentifier, tandis que d’autres affichent une erreur cryptique. Quoi qu’il en soit, s’il s’agit d’un module que vous utilisez fréquemment, pensez à ajouter les étapes d’authentification à votre profil.
Prenons l’exemple du module Microsoft.Graph. Il vous permet de vous authentifier à l’aide d’informations d’identification mises en cache. Ainsi, en supposant que vous vous soyez déjà authentifié, vous pouvez simplement ajouter ce qui suit à votre profil :
Connect-MgGraph
Cependant, l’une des particularités du module Microsoft.Graph.Users est que le renvoi de plusieurs propriétés des utilisateurs nécessite de spécifier même les propriétés par défaut. Nous pouvons contourner cette difficulté en créant une variable dans notre profil :
$graphUserProps = @(
'BusinessPhones',
'DisplayName',
'GivenName',
'Id',
'Mail',
'PreferredLanguage',
'Surname',
'UserPrincipalName'
)
Et ensuite, chaque fois que nous avons besoin de propriétés supplémentaires pour un utilisateur Graph, nous pouvons référencer cette variable et ajouter des propriétés supplémentaires :
Get-MgUser -UserId <upn> -Select ($graphUserProps + 'AccountEnabled','UsageLocation')
Gérez les versions des modules PowerShell. Si vous souhaitez maintenir à jour un module particulier, vous pouvez vérifier la version dans votre profil ou exécuter la commande Update-PSResource ou Update-Module à chaque lancement. Étant donné que vous pouvez être amené à gérer de nombreux modules ou des modules volumineux, nous pouvons lancer cette partie du profil dans un ThreadJob :
$modulesToUpdate = @('az', 'microsoft.graph')
$null = Start-ThreadJob -Name "Update modules" -ArgumentList $modulesToUpdate {
param([string[]]$modulesToUpdate)
foreach ($module in $modulesToUpdate) {
Update-PSResource -Name $module -Force -Confirm:$false
}
}
Comme cet exemple s’exécute en tant que ThreadJob, les modules se mettront à jour en arrière-plan sans ralentir votre profil.
Ajoutez des fonctionnalités de sécurité. Comme votre profil PowerShell se charge à chaque exécution, c’est l’endroit idéal pour activer certaines fonctionnalités de sécurité. Par exemple, si votre organisation utilise Just Enough Administration (JEA), vous pouvez configurer de manière préventive certaines sessions JEA :
$jeaDcSession = New-PSSession -ComputerName 'DC01' -ConfigurationName 'JEA_DC'
Import-PSSession -Session $jeaDcSession -Prefix 'JEADC'
Ensuite, si vous souhaitez voir quelles commandes ont été importées, vous pouvez exécuter :
Get-JEADCCommand
Une autre utilisation consiste à déverrouiller des coffres-forts secrets. Si vous utilisez le module Secrets Management, vous pouvez déverrouiller le coffre-fort le plus utilisé dans votre profil :
Unlock-SecretVault -Name VaultName -Password (Read-Host -AsSecureString)
Cependant, cela vous demandera le mot de passe du coffre-fort à chaque exécution.
Si votre équipe chargée de la sécurité de l’information vous demande d’enregistrer toutes vos activités PowerShell afin de les intégrer dans le SIEM de votre entreprise, vous pouvez même ajouter la journalisation des transcriptions à votre profil :
Start-Transcript -OutputDirectory C:\Path\To\SIEM\Directory
Ajoutez des alias et de complétions d’arguments. L’ajout d’alias est un autre excellent cas d’utilisation du profil PowerShell. Si vous travaillez beaucoup dans PowerShell de manière interactive, les alias peuvent vous faire gagner beaucoup de temps en vous évitant de taper trop de caractères. Si nous revenons à l’exemple Microsoft.Graph précédent, vous pouvez raccourcir Get-MgUser en gmu :
New-Alias -Name gmu -Value Get-MgUser
Cependant, l’un des alias préférés des administrateurs est celui de l’outil de ligne de commande Kubernetes kubectl. On peut l’associer à la lettre k :
New-Alias -Name k -Value kubectl
Kubectl comprend une complétion d’arguments PowerShell, une fonction qui fournit des suggestions dynamiques pour les valeurs des paramètres des commandes afin d’accélérer le codage. Si vous utilisez beaucoup kubectl, c’est un excellent ajout à votre profil.
Chargez des fonctions personnalisées. Il arrive souvent que vous écriviez des fonctions ponctuelles pour vous aider dans votre travail. Elles ne méritent peut-être pas d’être ajoutées à un module, mais elles vous aident à accomplir votre travail. Ainsi, une fois que vous les avez placées dans le contrôle de source, votre profil peut les « dot-sourcer » toutes pour les charger lorsque vous lancez PowerShell :
. C:\path\to\Function.ps1
Appliquez la reconnaissance de l’environnement. Si vous disposez d’hôtes avec des noms standard ou d’un moyen simple d’identifier l’environnement dans lequel se trouve un hôte, vous pouvez apporter des modifications à PowerShell en fonction de l’environnement. Par exemple, vous pouvez forcer l’arrière-plan à être rouge lorsque vous êtes en production.
if ($IsWindows) {
if ($env:COMPUTERNAME -like 'prod-*') {
$Host.UI.RawUI.BackgroundColor = 'DarkRed'
}
}
Vous pouvez également mettre à jour le titre de la fenêtre afin d’ajouter un niveau d’avertissement supplémentaire :
$Host.ui.RawUI.WindowTitle = "POWERSHELL in PRODUCTION"
Différentes façons de synchroniser un profil PowerShell
Une fois votre profil perfectionné, vous ne verrez pas ces personnalisations lorsque vous passerez à un autre système. Pour résoudre ce problème, nous pouvons introduire une synchronisation des profils.
Une solution courante et simple consiste à utiliser une application de synchronisation de fichiers, telle que OneDrive. Veillez à activer la redirection du dossier Documents pour synchroniser votre profil. Si vous procédez ainsi, sachez que vos modules seront également synchronisés, ce qui pourrait entraîner une latence, à moins que vous ne configuriez votre dossier Documents pour qu’il soit stocké localement sur votre appareil. Chaque fois que vous importez un module, OneDrive télécharge les fichiers associés à ce module.
Une meilleure approche consisterait à stocker votre profil dans un emplacement facilement accessible. Si vous travaillez dans un environnement d’entreprise, cela peut être sur un serveur de fichiers ou même un partage de fichiers Azure. Ensuite, chaque fois que vous lancez PowerShell sur une nouvelle machine, il vous suffit de copier le profil sur votre système local :
Copy-Item Z:\share\home\profile.ps1 ~\Documents\PowerShell\Profile.ps1
Cette approche présente également l’avantage d’être prise en charge sur les serveurs où l’installation d’une application telle que OneDrive est interdite.
Une autre méthode consiste à utiliser un gist GitHub pour rendre le profil disponible au téléchargement. Les gists sont accessibles au public, donc n’utilisez cette méthode que si votre profil ne contient aucune information privée, telle que des informations sur votre environnement interne.
Steve Lee, ingénieur logiciel principal et responsable de l’équipe de développement PowerShell chez Microsoft, fournit un excellent exemple d’utilisation d’un gist pour synchroniser votre profil PowerShell. Son profil utilise un commentaire pour identifier la version publiée :
# Version 1.2.13
Il inclut également une logique qui compare la version du profil local avec la version publique. Si la version du profil public est supérieure, le profil sera téléchargé et mis à disposition lors du prochain lancement de PowerShell.
Le code suivant télécharge un profil PowerShell à partir d’un gist et l’enregistre en tant que profil PowerShell local.
$gist = Invoke-RestMethod https://api.github.com/gists/a208d2bd924691bae7ec7904cab0bd8e
$gist.files."profile.ps1".content | Out-File ~\Documents\PowerShell\Profile.ps1
Ce ne sont là que quelques exemples illustrant comment personnaliser votre profil PowerShell. Testez certaines de ces suggestions et intégrez-les afin d’optimiser et de simplifier votre flux de travail lorsque vous utilisez cet outil d’automatisation.
