Partilhar via


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-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 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:

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

Consulte também