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 进程中运行。 当兼容性功能导入第一个模块时,会创建此进程。 (使用 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 还添加了列出不应通过兼容模式强制改写的其他模块的功能。

可以将 WindowsPowerShellCompatibilityNoClobberModuleList 设置添加到 PowerShell 配置文件中。 此设置的值是模块名称的逗号分隔列表。 此设置的默认值为:

"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]

限制

Windows PowerShell 兼容性功能:

  1. 仅在 Windows 计算机上本地工作
  2. 需要 Windows PowerShell 5.1
  3. 对序列化的 cmdlet 参数和返回值(而不是实时对象)进行操作
  4. 导入到 Windows PowerShell 远程处理会话的所有模块共享相同的运行空间。

Keywords

about_Windows_PowerShell_Compatibility

另请参阅