about_Windows_PowerShell_Compatibility

Descrição breve

Descreve a funcionalidade de compatibilidade do Windows PowerShell para 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 está sendo executada em um processo do Windows PowerShell 5.1 em segundo plano. Esse processo é criado quando o recurso 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 WinPSCompatSession sessão são usados por meio de 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 proxy no diretório do $env:Temp usuário e importa esse módulo proxy para a WinPSCompatSession sessão atual do PowerShell. Isso 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 de compatibilidade pode ser chamado 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 comando.

    Import-Module -Name ServerManager
    Get-AppLockerPolicy -Local
    

    Se ainda não tiver sido carregado, o módulo AppLocker será carregado automaticamente quando você executar Get-AppLockerPolicyo .

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 configuração em um arquivo de configuração do DisableImplicitWinCompat 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 de carregamento de módulo implícito 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ódulo, consulte a lista de compatibilidade de módulo do PowerShell 7.

Gerenciando o fechamento 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 comandos de mesmo nome na sessão atual do PowerShell 7. Na versão do PowerShell 7.0.0, 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 bloqueados:

  • 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 listar módulos adicionais que não devem ser bloqueados pelo modo de compatibilidade.

Você pode adicionar a configuração ao arquivo de configuração do WindowsPowerShellCompatibilityNoClobberModuleList PowerShell. O valor dessa configuração é uma lista separada por vírgulas de nomes de módulo. O valor padrão dessa configuração é:

"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]

Limitações

A funcionalidade de compatibilidade do Windows PowerShell:

  1. Só funciona localmente em computadores Windows
  2. Requer que o Windows PowerShell 5.1
  3. Opera em parâmetros de cmdlet serializados e valores de retorno, não em objetos dinâmicos
  4. Todos os módulos importados para a sessão remota do Windows PowerShell compartilham o mesmo espaço de execução.

Palavras-chave

about_Windows_PowerShell_Compatibility

Confira também