about_Windows_PowerShell_Compatibility
Breve descrição
Descreve a funcionalidade de compatibilidade do Windows PowerShell para o PowerShell 7.
Descrição longa
A menos que o manifesto do módulo indique que o módulo é compatível com o PowerShell Core, os módulos na pasta são carregados em um processo em segundo plano do %windir%\system32\WindowsPowerShell\v1.0\Modules
Windows PowerShell 5.1 pelo recurso de compatibilidade do Windows PowerShell.
Usando o recurso de compatibilidade
Quando o primeiro módulo é importado usando o recurso de compatibilidade do Windows PowerShell, o PowerShell cria uma sessão remota chamada WinPSCompatSession
que é executada em um processo em segundo plano do Windows PowerShell 5.1. O PowerShell cria esse processo quando o recurso de compatibilidade importa o primeiro módulo. O processo é fechado quando o último módulo é removido (usando Remove-Module
) ou quando o processo do PowerShell é encerrado.
Os módulos carregados na sessão são usados por meio de comunicação remota implícita e refletidos na WinPSCompatSession
sessão atual do PowerShell. Este é o mesmo método de transporte usado para trabalhos do PowerShell.
Quando um módulo é importado para a sessão, a comunicação remota implícita gera um módulo proxy no diretório do $env:Temp
usuário e importa esse módulo proxy para a WinPSCompatSession
sessão atual do PowerShell. O módulo proxy permite que o PowerShell detete que o módulo foi carregado usando a funcionalidade de compatibilidade do Windows PowerShell.
Depois que a sessão é criada, ela pode ser usada para operações que não funcionam corretamente em objetos desserializados. Todo o pipeline é executado no Windows PowerShell e somente o resultado final é retornado. Por exemplo:
$s = Get-PSSession -Name WinPSCompatSession
Invoke-Command -Session $s -ScriptBlock {
"Running in Windows PowerShell version $($PSVersionTable.PSVersion)"
}
O recurso de compatibilidade pode ser invocado de duas maneiras:
Explicitamente importando um módulo usando o parâmetro UseWindowsPowerShell
Import-Module -Name ScheduledTasks -UseWindowsPowerShell
Implicitamente, importando um módulo do Windows PowerShell por nome de módulo, caminho ou carregamento automático por meio da descoberta de comandos.
Import-Module -Name ServerManager Get-AppLockerPolicy -Local
Se ainda não estiver carregado, o módulo AppLocker será carregado automaticamente quando você executar
Get-AppLockerPolicy
o .
A Compatibilidade do Windows PowerShell bloqueia o WindowsPowerShellCompatibilityModuleDenyList
carregamento de módulos listados na configuração no arquivo de configuração do PowerShell.
O valor padrão dessa configuração é:
"WindowsPowerShellCompatibilityModuleDenyList": [
"PSScheduledJob","BestPractices","UpdateServices"
]
Gerenciando o carregamento implícito do módulo
Para desabilitar o comportamento de importação implícita do recurso de Compatibilidade do Windows PowerShell, use a DisableImplicitWinCompat
configuração em um arquivo de configuração do PowerShell. Essa configuração pode ser adicionada powershell.config.json
ao arquivo. Para obter mais informações, consulte about_PowerShell_Config.
Este exemplo mostra como criar um arquivo de configuração que desabilita o recurso implícito de carregamento de módulo da Compatibilidade do 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
Para obter mais informações sobre compatibilidade de módulos, consulte a lista de compatibilidade de módulos do PowerShell 7.
Gerenciando o clobbering de cmdlets
O recurso de compatibilidade do Windows PowerShell usa comunicação remota implícita para carregar módulos no modo de compatibilidade. O resultado é que os comandos exportados pelo módulo têm precedência sobre os comandos de mesmo nome na sessão atual do PowerShell 7. Na versão 7.0.0 do PowerShell, isso incluía os módulos principais fornecidos com o PowerShell.
No PowerShell 7.1, o comportamento foi alterado para que os seguintes módulos principais do PowerShell não sejam clobbered:
- Microsoft.PowerShell.ConsoleHost
- Microsoft.PowerShell.Diagnostics
- Microsoft.PowerShell.Host
- Microsoft.PowerShell.Management
- Microsoft.PowerShell.Security
- Microsoft.PowerShell.Utility
- Microsoft.WSMan.Management
O PowerShell 7.1 também adicionou a capacidade de excluir mais módulos do clobbering pelo modo de compatibilidade.
Você pode adicionar a WindowsPowerShellCompatibilityNoClobberModuleList
configuração ao arquivo de configuração do PowerShell. O valor dessa configuração é uma lista separada por vírgulas de nomes de módulos. O valor padrão dessa configuração é:
"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]
Limitações
A funcionalidade de compatibilidade do Windows PowerShell:
- Só funciona localmente em computadores Windows
- Requer o Windows PowerShell 5.1
- Opera em parâmetros de cmdlet serializados e valores de retorno, não em objetos dinâmicos
- Compartilha um único espaço de execução para todos os módulos importados para a sessão remota do Windows PowerShell
Ficheiros temporários
O recurso de compatibilidade do Windows PowerShell usa comunicação remota implícita para disponibilizar módulos do Windows PowerShell 5.1 no PowerShell 7. A comunicação remota implícita cria arquivos temporários no $env:Temp
diretório. Cada módulo proxy é armazenado em uma pasta separada com a seguinte convenção de nomenclatura:
remoteIpMoProxy_<ModuleName>_<ModuleVersion>_localhost_<SessionGuid>
.
O PowerShell remove os arquivos temporários quando você remove o último módulo com proxy da sessão ou fecha a sessão.