Controleer PowerShell-versies: Beste praktijken

In PowerShell zijn er ontelbare manieren om hetzelfde te doen (of iets wat er dichtbij komt). In deze blogpost leer je elke manier om je PowerShell-versie te controleren die je lokaal en op afstand hebt. We zullen de slechte manieren behandelen en mijn aanbevolen manier.

Er zijn websites die verschillende manieren laten zien om je PowerShell-versie te controleren. Maar geen van hen heeft een uitgebreide lijst van al deze methoden samengesteld. Ik heb besloten dat te veranderen.

All deze manieren zouden moeten werken in zowel Windows PowerShell als PowerShell Core. Deze methoden zouden ook moeten werken in Windows PowerShell-versies 1.0 helemaal tot aan PowerShell 7.

De manieren waarop je de versie van PowerShell kunt achterhalen waarop je draait zijn:

  1. De (Get-Host).Version-eigenschap
  2. De $host.Version-eigenschap
  3. Het register (alleen Windows PowerShell)
  4. De $PSVersionTable.PSVersion-eigenschap

Laten we alle manieren om de versie van PowerShell te vinden van minst aanbevolen tot meest aanbevolen bekijken.

Get-Host

PowerShell heeft een concept dat bekend staat als hosts. Een host is een programma dat de PowerShell-engine host. Het is niet de PowerShell-engine zelf. De PowerShell-console of een code-editor met een geïntegreerde terminal zijn PowerShell-hosts.

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.

Als je (Get-Host).Version uitvoert, zie je dat het een versienummer teruggeeft dat lijkt op de PowerShell-engineversie. Schijn bedriegt.

Hieronder heb ik Get-Host uitgevoerd in Windows PowerShell 5.1 en je ziet dat het terugkomt met 5.1.17134.858. Dit lijkt op een legitieme versie.

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

Soms, wanneer je echter Get-Host uitvoert in een geïntegreerde terminal, is de versie niet hetzelfde. Hoewel de host meestal dezelfde versie van de engine vertegenwoordigt, doet hij dat niet altijd.

Controleer Powershell-versie via Get-Host op externe computers

Hoewel Get-Host lijkt dezelfde versie terug te geven bij lokaal uitvoeren, doet het dat nooit bij externe computers.

Bijvoorbeeld, laten we Get-Host uitvoeren op een externe Windows Server 2016-server via Invoke-Command en kijken wat er gebeurt.

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

De laatste keer dat ik controleerde, was het niet mogelijk om PowerShell v1 uit te voeren op Windows Server 2016.

Vertrouwen op Get-Host is gewoonweg geen goed idee.

Controleer Powershell-versie $host.Version-commando

Verwijzen naar $host.Version is een andere manier om de Powershell-versie te controleren. De variabele $host is een automatische variabele die dezelfde uitvoer retourneert als Get-Host.

Referencing $host.Version

Er is niets bijzonders aan deze methode. Het is simpelweg hetzelfde als het uitvoeren van Get-Host.

$host.Version op externe computers

Je zult hetzelfde gedrag zien via PowerShell Remoting met $host.Version als wanneer je Get-Host uitvoert.

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

Gevaar, Will Robinson!

Register

Als je PowerShell zelf niet wilt openen, kun je ook het register controleren. De versie van PowerShell staat verstopt onder een waarde in het registerpad HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine. Deze registersleutel heeft een waarde genaamd PowerShellVersion die je kunt raadplegen met Get-ItemProperty.

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

Je ziet dat deze versie vergelijkbaar is, maar de revisie niet bevat, zoals de andere opties doen.

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

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

Gebruik van andere tools

Het gebruik van het register betekent ook dat je helemaal geen PowerShell hoeft te gebruiken om de versie te vinden. Je kunt commando’s uitvoeren vanaf de opdrachtprompt of een ander hulpprogramma dat het register kan lezen.

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

Register op externe computers

Het register is statisch en de waarden zullen lokaal of op afstand niet veranderen. Je kunt erop vertrouwen dat wat je lokaal ziet, hetzelfde zal zijn als wat je op afstand ziet.

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

Hetzelfde versienummer lokaal en op afstand weergeven is goed. Maar ik heb een betere manier om het je te laten zien met behulp van de automatische variabele $PSVersionTable.

Controleer de PowerShell-versie via het commando $PSVersionTable.PSVersion

De laatste en definitieve methode is het refereren aan de PSVersion-eigenschap op de automatische variabele $PSVersionTable. Deze methode zal altijd de PowerShell-engine vertegenwoordigen.

PS51> $PSVersionTable.PSVersion

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

De automatische variabele $PSVersionTable is een alleen-lezende hashtabel die specifieke informatie retourneert over de versie van de PowerShell-engine. Deze automatische variabele retourneert niet alleen de versie, maar ook de PSEdition. Deze eigenschap kan ofwel Core of Desktop zijn om verdere informatie te geven over de editie van PowerShell die wordt uitgevoerd.

$PSVersionTable output

$PSVersionTable op Externe Computers

Het gebruik van de automatische variabele $PSVersionTable is zowel lokaal als extern nauwkeurig. U kunt hieronder zien dat door $PSVersionTable.PSVersion in een scriptblok te omringen en die code op een externe computer uit te voeren, dezelfde versie wordt geretourneerd.

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

Samenvatting

In deze blogpost heb je alle manieren geleerd om de versie van PowerShell zowel lokaal als extern te controleren. Ik hoop dat de eerste paar methoden je een idee hebben gegeven van welke manieren niet om de versie te controleren!

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.

Als ik een manier heb gemist, laat het me dan weten in de opmerkingen. Ik zal blij zijn om de post bij te werken en je er erkenning voor te geven.

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