Verifica delle versioni di PowerShell: Migliori pratiche

In PowerShell, ci sono un miliardo di modi per fare la stessa cosa (o qualcosa di simile). In questo post sul blog, imparerai tutti i modi per controllare la versione di PowerShell che hai sui computer locali e remoti. Copriremo i modi sbagliati e il mio modo consigliato.

Ci sono siti web che mostrano vari modi per controllare la versione di Powershell. Ma nessuno ha compilato un elenco completo di tutti loro. Ho deciso di cambiare questo stato di cose.

Tutti questi metodi dovrebbero funzionare sia in Windows PowerShell che in PowerShell Core. Questi metodi dovrebbero funzionare anche nelle versioni di Windows PowerShell da 1.0 fino a PowerShell 7.

I modi per scoprire la versione di PowerShell che stai utilizzando sono:

  1. La proprietà (Get-Host).Version
  2. La proprietà $host.Version
  3. Il registro (solo Windows PowerShell)
  4. La proprietà $PSVersionTable.PSVersion

Analizziamo tutti i modi per trovare la versione di PowerShell dal meno al più consigliato.

Get-Host

PowerShell ha un concetto noto come hosts. Un host è un programma che sta ospitando il motore PowerShell. Non è il motore PowerShell stesso. La console di PowerShell o un editor di codice con un terminale integrato sono hosts di 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.

Se esegui (Get-Host).Version, vedrai che restituisce un numero di versione che sembra poter essere la versione del motore di PowerShell. Le apparenze ingannano.

Qui sotto ho eseguito Get-Host su Windows PowerShell 5.1 e puoi vedere che ritorna 5.1.17134.858. Questo sembra una versione legittima.

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

Tuttavia, a volte quando esegui Get-Host in un terminale integrato, la versione non è la stessa. Anche se di solito, l’host rappresenta la stessa versione del motore, non è sempre così.

Verifica la versione di Powershell tramite Get-Host su computer remoti

Anche se Get-Host sembra restituire la stessa versione quando viene eseguito su un computer locale, non lo farà mai su computer remoti.

Ad esempio, eseguiamo Get-Host su un server remoto Windows Server 2016 tramite Invoke-Command e vediamo cosa succede.

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

L’ultima volta che ho controllato, non è possibile eseguire PowerShell v1 su Windows Server 2016.

Fidarsi di Get-Host è semplicemente una brutta idea in generale.

Verifica la versione di Powershell con il comando $host.Version

Riferirsi a $host.Version è un altro modo per verificare la versione di Powershell. La variabile $host è una variabile automatica che restituisce lo stesso output di Get-Host.

Referencing $host.Version

Non c’è niente di speciale riguardo questo metodo. È semplicemente lo stesso di eseguire Get-Host.

$host.Version su computer remoti

Vedrai lo stesso comportamento tramite PowerShell Remoting con $host.Version come eseguire 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

Pericolo, Will Robinson!

Registro

Se non vuoi aprire PowerShell stesso, puoi anche controllare il registro. La versione di PowerShell è nascosta sotto un valore nel percorso della chiave di registro HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine. Questa chiave di registro ha un valore chiamato PowerShellVersion a cui puoi fare riferimento usando Get-ItemProperty.

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

Puoi vedere che questa versione è simile ma non include la revisione come fanno le altre opzioni.

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

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

Utilizzo di Altri Strumenti

Utilizzare il registro significa anche che non è necessario utilizzare PowerShell affatto per trovare la versione. Puoi eseguire comandi dall’indicatore dei comandi o da un altro strumento che può leggere il registro.

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

Registro su Computer Remoti

Il registro è statico e i valori non cambieranno localmente o remotamente. Puoi essere certo che ciò che vedi localmente sarà lo stesso che vedi remotamente.

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

Mostrare la stessa versione localmente e remotamente è buono. Ma ho un modo migliore per mostrarti usando la variabile automatica $PSVersionTable.

Controlla la Versione di Powershell tramite il comando $PSVersionTable.PSVersion

Il metodo ultimo e finale consiste nel fare riferimento alla proprietà PSVersion sulla variabile automatica $PSVersionTable. Questo metodo rappresenterà sempre il motore PowerShell.

PS51> $PSVersionTable.PSVersion

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

La variabile automatica $PSVersionTable è una tabella hash di sola lettura che restituisce informazioni specifiche sulla versione del motore PowerShell. Questa variabile automatica restituisce non solo la versione, ma anche PSEdition. Questa proprietà può essere Core o Desktop per fornire ulteriori informazioni sull’edizione di PowerShell in esecuzione.

$PSVersionTable output

$PSVersionTable su computer remoti

Utilizzare la variabile automatica $PSVersionTable è accurato sia localmente che in remoto. Come puoi vedere di seguito, avvolgendo $PSVersionTable.PSVersion in un blocco script ed eseguendo quel codice su un computer remoto, restituirà la stessa versione.

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

Riepilogo

In questo post del blog, hai imparato tutti i modi per controllare la versione di PowerShell sia localmente che in remoto. Spero che i primi metodi ti abbiano dato un’idea di quali modi non utilizzare per controllare la versione!

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.

Se ho trascurato qualche metodo, per favore fammelo sapere nei commenti. Sarò lieto di aggiornare il post e darti credito.

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