post-template-default,single,single-post,postid-3672,single-format-standard,ajax_fade,page_not_loaded,,side_area_uncovered_from_content,qode-theme-ver-15.0,qode-theme-bridge,wpb-js-composer js-comp-ver-5.4.7,vc_responsive

Get-PSVersions: Retrieve PowerShell version remotely

Get-PSVersions: Retrieve PowerShell version remotely

Okay at the end it’s a simple $PSVersion wrapped in an Invoke-Command but hey these simple things are needful in case you need to run it against of 100s of servers and not just locally. With the help of Invoke-Command via WinRM and $PSVersionTable.psversion wrapped in a foreach you can retrieve PowerShell version of your remote computers indifferent if you need to use credentials to run it against a different domain than you currently reside. Just use the below function Get-PSVersions, simple but good.

Function Get-PSVersions
    Gets the PowerShell version on a local or remote computer using Invoke-Command.

    Gets the PowerShell version on a local or remote computer using Invoke-Command.

.PARAMETER ComputerName
    A single Computer or an array of computer names. The default is localhost ($env:COMPUTERNAME).

.PARAMETER Credentials
    Commit PSCredential object or using Get-Credentials.

    Run in Verbose Mode.

    PS C:> Get-PSVersions -ComputerName Server01,Server02
    Major  Minor  Build  Revision PSComputerName                                                   
    -----  -----  -----  -------- --------------                                                   
    5      1      14393  1066     Server01
    5      1      14393  1066     Server02

	PS C:> Get-PSVersions -ComputerName Server01,Server02 -Credentials Get-Credentials

    PS C:> Get-PSVersions -ComputerName (Get-Content C:ServerList.txt)

.NOTES Author: Sebastian Gräf Email: Date: September 9, 2017 PSVer: 3.0/4.0/5.0 #> [Cmdletbinding()] Param ( [Parameter( Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [string[]]$ComputerName = $Env:COMPUTERNAME, [Parameter( ValueFromPipelineByPropertyName = $true, Mandatory = $false, ValueFromPipeline = $true)] [Alias( 'PSCredential' )] [ValidateNotNull()] [System.Management.Automation.PSCredential] [System.Management.Automation.Credential()] $Credentials = [System.Management.Automation.PSCredential]::Empty ) Begin { Write-Verbose " [$($MyInvocation.InvocationName)] :: Start Process" $ProgressCounter = 0 } Process { foreach ($Computer in $ComputerName) { $ProgressCounter++ Write-Progress -activity "Running on $Computer" -status "Please wait ..." -PercentComplete (($ProgressCounter / $ComputerName.length) * 100) if (Test-Connection $Computer) { Write-Verbose " [$($MyInvocation.InvocationName)] :: Processing $Computer" try { $PSVersion = Invoke-Command -Computername $Computer -Scriptblock { $PSVersionTable.psversion } -Credential $Credentials $PSVersion } catch { Write-Verbose " Host [$Computer] Failed with Error: $($Error[0])" } } else { Write-Verbose " Host [$Computer] Failed Connectivity Test " } } } End { Write-Verbose " [$($MyInvocation.InvocationName)] :: End Process" } }

While processing your list of computers a nice Write-Progress will give you some details about the status:

Once finished your output will look like this:

No Comments

Sorry, the comment form is closed at this time.

%d bloggers like this: