注意:正在考虑更改默认情况下远程端点 PowerShell [Core] 的目标(从 7.0 开始仍然是Window PowerShell):请参阅此 GitHub 问题。
本地指定的远程会话配置决定了远程计算机上使用的 PowerShell 版本,可能还有版本:
Ad hoc,您可以使用远程 cmdlet 的-ConfigurationName
参数,例如Invoke-Command
、New-PSSession
和Enter-PSSession
来明确指定会话配置。
持久地,通过配置,您可以通过首选项变量设置默认会话配置(链接的帮助主题还讨论了其他与远程会话相关的首选项变量,即和)$PSSessionConfigurationName
$PSSessionApplicationName
$PSSessionOption
- 默认情况下,客户端连接到
microsoft.powershell
远程机器上的会话配置(见下文)。因此,您也可以在远程目标机器上更改此配置的定义,但请注意,这意味着所有使用默认值的客户端都将使用重新定义的配置- 请参阅底部了解如何实现此重新定义。
在远程操作的目标计算机上,Get-PSSessionConfiguration
cmdlet 列出了客户端可用于连接的所有已注册会话配置,您可以使用Register-PSSessionConfiguration
和管理这些配置Unregister-PSSessionConfiguration
:
警告:Get-PSSessionConfiguration
必须在提升的会话中运行(以管理员身份),并且由于 Windows PowerShell 5.1 中的错误,您可能必须先运行以下虚拟命令:$null = Get-Command Test-WSMan
,以确保wsman:
驱动器已定义)。
名称以'microsoft.powershell
'为前缀的会话配置属于Windows PowerShell。
前缀'PowerShell.'
是指 PowerShell Core。
$PSSessionConfigurationName
'http://schemas.microsoft.com/powershell/Microsoft.PowerShell'
在两个版本中都默认为,这意味着即使您是从 PowerShell Core 运行, Windows PowerShell默认针对远程计算机:
该Microsoft.PowerShell
部分指的是(64 位)Windows PowerShell 会话配置,由Get-PSSessionConfiguration
(小写)列出。
http://schemas.microsoft.com/powershell/
前缀是可选的,可以省略;请注意,https:
在前缀中使用不起作用,并且不会自动切换到基于 SSL 的传输;对于后者,需要显式配置。请注意,如果您的所有远程处理都发生在 Windows 域中,则不需要基于 HTTPS/SSL 的远程处理。
要在远程计算机上定位 PowerShell Core (PowerShell v6+):
# Connect to computer $comp and make it execute $PSVersionTable
# in PowerShell Core v7.x, which tells you what PowerShell edition
# and version is running.
Invoke-Command -ComputerName $comp -ConfigurationName PowerShell.7 { $PSVersionTable }
- 要从给定的客户端计算机默认、持久地以 PowerShell Core 为目标,请将以下内容添加到您的
$PROFILE
文件中:
# When remoting, default to running PowerShell Core v7.x on the
# the target machines:
$PSSessionConfigurationName = 'PowerShell.7'
- 要让给定远程服务器机器的所有客户端默认持久地以PowerShell Core 为目标,您必须重新定义服务器的
microsoft.powershell
会话配置,这需要管理权限;您可以调整以下代码段:
# Run WITH ELEVATION (as administrator) and
# ONLY IF YOU UNDERSTAND THE IMPLICATIONS.
$ErrorActionPreference = 'Stop'
# The configuration whose definition you want to make the new default.
$newDefaultConfigSource = 'PowerShell.7'
# Standard registry locations and names.
$defaultConfigName = 'Microsoft.PowerShell'
$configXmlValueName = 'ConfigXml'
$configRootKey = 'registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Plugin'
# Rename the current default configuration XML to "ConfigXml.OLD" to keep a backup.
Rename-ItemProperty $configRootKey\$defaultConfigName $configXmlValueName -NewName "$configXmlValueName.OLD"
# Get the configuration XML from the configuration that should become the new default.
# Modify it to replace the source configuration name with the default configuration name.
$xmlText = (Get-ItemPropertyValue $configRootKey\$newDefaultConfigSource $configXmlValueName) -replace
('\b{0}\b' -f [regex]::Escape($newDefaultConfigSource)), $defaultConfigName
# Save the modified XML as the default configuration's config XML.
Set-ItemProperty $configRootKey\$defaultConfigName $configXmlValueName $xmlText
# Restart the WinRM service for changes to take effect.
Restart-Service WinRM