可以使用特定的Powershell版本在远程目标上调用Command?

时间:2017-09-29 07:42:07

标签: powershell invoke-command

我正在尝试编写一个小型PowerShell脚本,该脚本将使用远程计算机上的特定PowerShell模块来执行某些操作。此模块需要使用PowerShell版本> =才能工作。

我尝试使用Invoke-Command在远程计算机上执行脚本,但我无法弄清楚如何使用远程目标上提供的最新PowerShell版本:

$SessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$Session = New-PSSession -ComputerName "TARGETHOST" -Authentication Negotiate -SessionOption $SessionOption
Invoke-Command -Session $Session -ScriptBlock {
    (Get-Host).Version
}

将导致使用版本1。经过一些修修补补后,我找到了一种方法来做我想做的事:

$SessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$Session = New-PSSession -ComputerName "TARGETHOST" -Authentication Negotiate -SessionOption $SessionOption
Invoke-Command -Session $Session -ScriptBlock{
    C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe -Command {
        (Get-Host).Version
    }
}

但我不认为这是一个很好的解决方案,因为我在远程会话中产生了另一个PS会话。现在我想知道是否有更好的方法来完成同样的事情。

2 个答案:

答案 0 :(得分:0)

当PowerShell创建时,最初的想法是通过脚本扩展来区分版本。

这个想法没有实现以保持向后兼容性并避免混淆,因此现在只有.ps1个文件(而不是.ps2.ps3等。)

由于保留了向后兼容性,他们不需要保留旧版本的PowerShell,因此将PowerShell v2安装到C:\Windows\System32\WindowsPowerShell\v1.0目录中...在原始v1.0的顶部...并保持相同的目录名。

因此即使您认为从该目录运行PS v1,您实际上也在运行最新的Powershell版本。您可以通过从该位置运行powershell.exe并使用$PSVersionTable

检查版本来确认此问题

就我而言:

PS C:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.15063.608
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.15063.608
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

答案 1 :(得分:0)

我的 Invoke-Command 脚本遇到了同样的问题,在检查 (Get-Host).Version$host.version 时它会返回版本 1.0.0.0。但是 $PSVersionTable.PSVersion 成功输出了 5.1。因此,我修改了要求版本使用 $PSVersionTable.PSVersion 的脚本,现在它可以正常运行了。