DEV Community

Cover image for Montre moi ton profile !
Laurent LIENHARD for FrPSUG

Posted on

Montre moi ton profile !

Information

Cette article a été rédigé pour une présentation du French Powershell UserGroup.

Cette présentation peut-être vu sur Youtube sur la chaîne du FRPSUG

C'est quoi un profile ?

Évidement c'est la première question que l'on peut se poser ;-)

Un profile PowerShell est simplement un script :

  • avec un nom spéciale
  • qui se trouve dans un répertoire spécial
  • qui s'execute au démarrage de PowerShell

Le (ou plutôt les) profile sert à customiser votre environnement :

  • ajouter des alias
  • ajouter des fonctions
  • connecter des drive
  • ...

Les différents types de profile

Dans le point précédent, je fais allusion à plusieurs profiles, effectivement il existe un profile pour chaque hôte :

  • Windows Powershell
  • Powershell (core)

mais il y a également une profile qui s'applique à tous les hôtes

Comme pour les profiles d'hôte, Il existe un profile pour tous les utilisateurs d'une machine ou pour l'utilisateur courant.

Donc en résumé un profile s'applique :

  • à l'hôte actuellement utilisé (CurrentHost) ou à tous les hôtes (AllHosts)
  • à l'utilisateur actuellement connecté (CurrentHost) ou à tous les utilisateurs (AllUsers)

Les combinaisons possibles sont donc :

* AllUsers, AllHosts
* AllUsers, CurrentHost
* CurrentUser, AllHosts
* CurrentUser, CurrentHost
Enter fullscreen mode Exit fullscreen mode

L'ordre ci-dessus n'est pas anodin, il s'agit de l'ordre dans lequel les profiles sont chargés au démarrage d'une console

Pour adresser ces différents profiles on utilise la variable $PROFILE de la façon suivante :

* AllUsers, AllHosts       => $PROFILE.AllUsersAllHosts
* AllUsers, CurrentHost    => $PROFILE.AllUsersCurrentHost
* CurrentUser, AllHosts    => $PROFILE.CurrentUserAllHosts
* CurrentUser, CurrentHost => $PROFILE.CurrentUserCurrentHost
Enter fullscreen mode Exit fullscreen mode

Par défaut quand on parle de la variable $PROFILE on parle de la variable $PROFILE.CurrentUserCurrentHost

Chaque combinaisons est stocké dans un répertoire particulier (cas de Windows PowerShell et PowerShell Core) :

* $PROFILE.AllUsersAllHosts       => $PSHOME\Profile.ps1
* $PROFILE.AllUsersCurrentHost    => $PSHOME\Microsoft.PowerShell_profile.ps1
* $PROFILE.CurrentUserAllHosts    => $Home\[My]Documents\PowerShell\Profile.ps1
* $PROFILE.CurrentUserCurrentHost => $Home\[My]Documents\PowerShell\Microsoft.PowerShell_profile.ps1

Enter fullscreen mode Exit fullscreen mode

$PSHOME fait allusion au repertoire d'installation de PowerShell : C:\Windows\System32\WindowsPowerShell\v1.0
pour Windows PowerShell C:\Program Files\PowerShell\7-preview pour PowerShell Core

Dans le cas des autres environnements (ISE, VSCode) les chemins sont identiques mais les noms de fichiers peuvent être différent

Comment créer un profile ?

La première étape est de vérifier si un fichier profile n'est pas déjà existant

Test-Path -Path $PROFILE
False
Enter fullscreen mode Exit fullscreen mode

Si le résultat est False, il suffit de créer le fichier

New-Item -ItemType File -path $PROFILE -force
Enter fullscreen mode Exit fullscreen mode

Ensuite il suffit de l'éditer avec n'importe quel éditeur de texte (notepad, notepad++, VSCode)

notepad $PROFILE
Enter fullscreen mode Exit fullscreen mode

Mais on mets quoi dans un profile ?

Comme nous l'avons vu le profile PowerShell est un script comme les autres. Nous pouvons donc y mettre tous ce qui peut se trouver dans un script "normal"

Par exemple dans le profile $PROFILE.AllUsersAllHosts sur ma machine j'ai cette fonction

#region <Admin or Not>
function IsAdmin
{
    $CurrentUser =
    [System.Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = New-Object System.Security.principal.windowsprincipal($CurrentUser)
    $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
}

# Personalized greeting
#
if (isAdmin)
{
    $ElevationMode = 'Privilegie'
    $host.UI.RawUI.BackGroundColor = 'DarkRed'
    Clear-Host
}
else
{
    $ElevationMode = 'Non Privilegie'
    #$host.UI.RawUI.BackGroundColor = 'DarkMagenta'
    Clear-Host
}

$CurrentUser =


Write-Host '+---------------------------------------------------+'
Write-Host ("+- Bonjour {0} " -f ($CurrentUser.Name).split('\')[1])
Write-Host '+---------------------------------------------------+'
#endregion <Admin or Not>
Enter fullscreen mode Exit fullscreen mode

Cette fonction permet d'afficher dans le titre de la fenêtre quand je lance la console en administrateur

Image description

ou en utilisateur normal

Image description

j'ai également une fonction d'installation de module

$private:AutoLoad = @{
    Modules = @(
        'Plaster',
        'Psake',
        'PSDepend',
        'PSDeploy'
    )
}

Write-Host "=> loading modules from AllUsersAllHosts"
Foreach ($private:M in $AutoLoad.Modules)
{
    if (!(Get-Module -ListAvailable -Name $m))
    {
        Write-Warning "$($m) not found => installation launch "
        Install-Module -Name $m -AllowClobber -Force -ErrorAction SilentlyContinue -Scope CurrentUser
    }
}
Enter fullscreen mode Exit fullscreen mode

Il s'agit de module que j'utilise pour la compilation de mes builds lorsque je code.

Pour plus d'exemple sur les profiles vous pouvez faire une recherche google.

Top comments (0)