Compartilhar via


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-AppLockerPolicyo .

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:

  1. Funciona apenas localmente em computadores Windows
  2. Requer o Windows PowerShell 5.1
  3. Opera em parâmetros de cmdlet serializados e valores retornados, não em objetos dinâmicos
  4. 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.

Confira também