当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 关于 Windows PowerShell 兼容性

作者:精品下载站 日期:2024-12-14 02:17:16 浏览:14 分类:玩电脑

关于 Windows PowerShell 兼容性


简短描述

描述 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
    

    如果尚未加载,AppLocker 模块会在您运行 Get-AppLockerPolicy 时自动加载。

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 远程处理会话中的所有模块共享相同的运行空间。

关键词

about_Windows_PowerShell_兼容性

参见

  • about_模块
  • Import-Module

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯