about_Windows_PowerShell_Compatibility
Descrição breve
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 %windir%\system32\WindowsPowerShell\v1.0\Modules
módulos na pasta são carregados em um processo do Windows PowerShell 5.1 em segundo plano 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 do Windows PowerShell 5.1 em segundo plano. 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 WinPSCompatSession
comunicação remota implícita e refletidos na sessão atual do PowerShell. Esse é 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 de proxy no diretório do usuário e importa esse módulo de proxy para a WinPSCompatSession
sessão atual do $env:Temp
PowerShell. O módulo proxy permite que o PowerShell detecte 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 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 carregamento de módulos listados na configuração do WindowsPowerShellCompatibilityModuleDenyList
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 configuração em um arquivo de configuração do DisableImplicitWinCompat
PowerShell. Essa configuração pode ser adicionada ao powershell.config.json
arquivo. Para obter mais informações, consulte about_PowerShell_Config.
Este exemplo mostra como criar um arquivo de configuração que desabilita o recurso de carregamento de módulo implícito da Compatibilidade com 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 a compatibilidade do módulo, consulte a lista de compatibilidade do módulo do PowerShell 7.
Gerenciando a sobrecarga 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 com o 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 sobrescritos:
- 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 da sobrecarga por 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:
- Funciona apenas localmente em computadores Windows
- Requer o Windows PowerShell 5.1
- Opera em parâmetros de cmdlet serializados e valores retornados, não em objetos dinâmicos
- Compartilha um único runspace para todos os módulos importados para a sessão de comunicação remota do Windows PowerShell
Arquivos temporários
O recurso de compatibilidade do Windows PowerShell usa comunicação remota implícita para disponibilizar os 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 com 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.