about_Windows_PowerShell_Compatibility
简短说明
介绍 PowerShell 7 的 Windows PowerShell 兼容性功能。
长说明
除非模块清单指示该模块与 PowerShell Core 兼容,否则 %windir%\system32\WindowsPowerShell\v1.0\Modules
文件夹中的模块会通过 Windows PowerShell 兼容性功能加载到后台 Windows PowerShell 5.1 进程中。
使用兼容性功能
使用 Windows PowerShell 兼容性功能导入第一个模块时,PowerShell 将创建一个名为 WinPSCompatSession
在后台 Windows PowerShell 5.1 进程中运行的远程会话。 当兼容性功能导入第一个模块时,PowerShell 会创建此过程。 删除最后一个模块(使用 Remove-Module
)或 PowerShell 进程退出时,进程将关闭。
WinPSCompatSession
会话中加载的模块通过隐式远程处理使用,并反映在当前的 PowerShell 会话中。 这是用于 PowerShell 作业的相同传输方法。
将模块导入 WinPSCompatSession
会话时,隐式远程处理会在用户的 $env:Temp
目录中生成代理模块,并将此代理模块导入到当前的 PowerShell 会话中。 代理模块允许 PowerShell 检测模块是否使用 Windows PowerShell 兼容性功能加载了该模块。
创建会话后,它可用于无法正确处理反序列化对象的操作。 整个管道在 Windows PowerShell 中执行,仅返回最终结果。 例如:
$s = Get-PSSession -Name WinPSCompatSession
Invoke-Command -Session $s -ScriptBlock {
"Running in Windows PowerShell version $($PSVersionTable.PSVersion)"
}
可以通过两种方式调用兼容性功能:
显式方式:使用 UseWindowsPowerShell 参数导入模块
Import-Module -Name ScheduledTasks -UseWindowsPowerShell
隐式方式:按模块名称、路径导入 Windows PowerShell 模块或通过命令发现自动加载。
Import-Module -Name ServerManager Get-AppLockerPolicy -Local
如果尚未加载,运行
Get-AppLockerPolicy
时,会自动加载 AppLocker 模块。
Windows PowerShell 兼容性阻止加载 PowerShell 配置文件的 WindowsPowerShellCompatibilityModuleDenyList
设置中列出的模块。
此设置的默认值为:
"WindowsPowerShellCompatibilityModuleDenyList": [
"PSScheduledJob","BestPractices","UpdateServices"
]
管理隐式模块加载
要禁用 Windows PowerShell 兼容性功能的隐式导入行为,请使用 PowerShell 配置文件中的 DisableImplicitWinCompat
设置。 可以将此设置添加到 powershell.config.json
文件。 有关详细信息,请参阅 about_PowerShell_Config。
此示例演示了如何创建禁用 Windows PowerShell 兼容性隐式模块加载功能的配置文件。
$ConfigPath = "$PSHOME\DisableWinCompat.powershell.config.json"
$ConfigJSON = ConvertTo-Json -InputObject @{
"DisableImplicitWinCompat" = $true
"Microsoft.PowerShell:ExecutionPolicy" = "RemoteSigned"
}
$ConfigJSON | Out-File -Force $ConfigPath
pwsh -settingsFile $ConfigPath
有关模块兼容性的详细信息,请参阅 PowerShell 7 模块兼容性列表。
管理 cmdlet 强制改写
Windows PowerShell 兼容性功能使用隐式远程处理在兼容模式下加载模块。 结果是模块导出的命令优先于当前 PowerShell 7 会话中同名的命令。 在 PowerShell 7.0.0 版本中,这包括随 PowerShell 一起提供的核心模块。
在 PowerShell 7.1 中,行为已更改,因此不会对以下核心 PowerShell 模块进行加密:
- Microsoft.PowerShell.ConsoleHost
- Microsoft.PowerShell.Diagnostics
- Microsoft.PowerShell.Host
- Microsoft.PowerShell.Management
- Microsoft.PowerShell.Security
- Microsoft.PowerShell.Utility
- Microsoft.WSMan.Management
PowerShell 7.1 还添加了通过兼容性模式从 clobbering 中排除更多模块的功能。
可以将 WindowsPowerShellCompatibilityNoClobberModuleList
设置添加到 PowerShell 配置文件中。 此设置的值是模块名称的逗号分隔列表。 此设置的默认值为:
"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]
限制
Windows PowerShell 兼容性功能:
- 仅在 Windows 计算机上本地工作
- 需要 Windows PowerShell 5.1
- 对序列化的 cmdlet 参数和返回值(而不是实时对象)进行操作
- 共享导入到 Windows PowerShell 远程处理会话的所有模块的单个运行空间
临时文件
Windows PowerShell 兼容性功能使用隐式远程处理使 Windows PowerShell 5.1 模块在 PowerShell 7 中可用。 隐式远程处理在 $env:Temp
目录中创建临时文件。 每个代理模块都存储在具有以下命名约定的单独文件夹中:
remoteIpMoProxy_<ModuleName>_<ModuleVersion>_localhost_<SessionGuid>
。
从会话中删除最后一个代理模块或关闭会话时,PowerShell 会删除临时文件。