Vérifier les versions de PowerShell : Meilleures pratiques

En PowerShell, il existe une multitude de façons de faire la même chose (ou quelque chose de similaire). Dans cet article de blog, vous apprendrez toutes les façons de vérifier la version de votre PowerShell sur les ordinateurs locaux et distants. Nous examinerons les mauvaises méthodes et ma méthode recommandée.

Il existe des sites Web qui montrent diverses façons de vérifier votre version de Powershell. Mais aucun n’a compilé une liste complète de toutes ces méthodes. J’ai décidé de changer cela.

Toutes ces méthodes devraient fonctionner à la fois dans Windows PowerShell et PowerShell Core. Ces méthodes devraient également fonctionner dans les versions de Windows PowerShell 1.0 jusqu’à PowerShell 7.

Les façons de connaître la version de PowerShell que vous utilisez sont les suivantes :

  1. La propriété (Get-Host).Version
  2. La propriété $host.Version
  3. Le registre (uniquement dans Windows PowerShell)
  4. La propriété $PSVersionTable.PSVersion

Explorons toutes les façons de trouver la version de PowerShell, de la moins recommandée à la plus recommandée.

Get-Host

PowerShell utilise un concept appelé hôtes. Un hôte est un programme qui héberge le moteur PowerShell. Ce n’est pas le moteur PowerShell lui-même. La console PowerShell ou un éditeur de code avec un terminal intégré sont des hôtes PowerShell.

A host can have a version that is completely independent of PowerShell itself. This can be deceiving to many newcomers. Let me show you why.

Si vous exécutez (Get-Host).Version, vous verrez qu’il renvoie un numéro de version qui semble être la version du moteur PowerShell. Les apparences peuvent être trompeuses.

Ci-dessous, j’ai exécuté Get-Host sur Windows PowerShell 5.1 et vous pouvez voir qu’il revient avec 5.1.17134.858. Cela semble être une version légitime.

PS51> (Get-Host).Version
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

Cependant, parfois lorsque vous exécutez Get-Host dans un terminal intégré, la version n’est pas la même. Bien que généralement, l’hôte représentera la même version du moteur, ce n’est pas nécessairement toujours le cas.

Vérifier la version de PowerShell via Get-Host sur des ordinateurs distants

Même si Get-Host semble renvoyer la même version lorsqu’il est exécuté sur un ordinateur local, ce ne sera jamais le cas sur des ordinateurs distants.

Par exemple, exécutons Get-Host sur un serveur distant Windows Server 2016 via Invoke-Command et voyons ce qui se passe.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {Get-Host} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

La dernière fois que j’ai vérifié, il n’est pas possible d’exécuter PowerShell v1 sur Windows Server 2016.

Se fier à Get-Host est une mauvaise idée en général.

Vérifier la version de PowerShell avec la commande $host.Version

Référencer $host.Version est un autre moyen de vérifier la version de PowerShell. La variable $host est une variable automatique qui renvoie la même sortie que Get-Host.

Referencing $host.Version

Il n’y a rien de spécial à propos de cette méthode. C’est simplement la même chose que d’exécuter Get-Host.

$host.Version sur des ordinateurs distants

Vous verrez le même comportement via PowerShell Remoting avec $host.Version que si vous exécutez Get-Host.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$host.Version} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

Attention, Will Robinson !

Registre

Si vous ne voulez pas ouvrir PowerShell lui-même, vous pouvez également vérifier le registre. La version de PowerShell est cachée sous une valeur dans la clé de registre HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine. Cette clé de registre a une valeur appelée PowerShellVersion que vous pouvez référencer en utilisant Get-ItemProperty.

PS51> (Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
5.1.17134.1

Vous pouvez voir que cette version est similaire mais n’inclut pas la révision comme le font les autres options.

PS51> [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  1

Utilisation d’autres outils

Utiliser le registre signifie également que vous n’avez pas besoin d’utiliser PowerShell du tout pour trouver la version. Vous pouvez exécuter des commandes depuis l’invite de commandes ou un autre outil qui peut lire le registre.

CMD> reg query HKLM\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine /v PowerShellVersion

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine
    PowerShellVersion    REG_SZ    5.1.17134.1

Registre sur des ordinateurs distants

Le registre est statique et les valeurs ne changeront pas localement ou à distance. Vous pouvez être sûr que ce que vous voyez localement sera le même que ce que vous voyez à distance.

PS51> $scriptBlock = {
    [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
}
PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock $scriptBlock -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  1        10.0.0.5

Afficher la même version localement et à distance est bien. Mais j’ai une meilleure façon de vous montrer en utilisant la variable automatique $PSVersionTable.

Vérifiez la version de Powershell avec la commande $PSVersionTable.PSVersion

La dernière méthode, et la méthode finale, consiste à faire référence à la propriété PSVersion de la variable automatique $PSVersionTable. Cette méthode représentera toujours le moteur PowerShell.

PS51> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

La variable automatique $PSVersionTable est une table de hachage en lecture seule qui retourne des informations spécifiques sur la version du moteur PowerShell. Cette variable automatique ne retourne pas seulement la version mais aussi l’édition. Cette propriété peut être soit Core soit Desktop pour fournir davantage d’informations sur l’édition de PowerShell en cours d’exécution.

$PSVersionTable output

$PSVersionTable sur des ordinateurs distants

L’utilisation de la variable automatique $PSVersionTable est aussi précise localement que distante. Vous pouvez voir ci-dessous qu’en enveloppant $PSVersionTable.PSVersion dans un scriptblock et en exécutant ce code sur un ordinateur distant, il retournera la même version.

PS> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$PSVersionTable.PSVersion} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  592      10.0.0.5

Résumé

Dans cet article de blog, vous avez appris toutes les façons de vérifier la version de PowerShell à la fois localement et à distance. J’espère que les premières méthodes vous ont donné une idée des façons de ne pas vérifier la version!

I recommend always using $PSVersionTable.PSVersion. All of the other methods may appear similar to the PowerShell engine version but may not always reflect the engine version.

Si j’ai manqué une méthode, veuillez me le faire savoir dans les commentaires. Je serai ravi de mettre à jour l’article et de vous donner du crédit.

Source:
https://adamtheautomator.com/powershell-version/