Compartilhar via


about_Windows_PowerShell_Compatibility

Descrição breve

Descreve a funcionalidade de compatibilidade 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 segundo plano Windows PowerShell processo 5.1 por Windows PowerShell recurso de Compatibilidade.

Usando o recurso de compatibilidade

Quando o primeiro módulo é importado usando Windows PowerShell recurso de compatibilidade, o PowerShell cria uma sessão remota chamada WinPSCompatSession que está em execução em segundo plano Windows PowerShell processo 5.1. Esse processo é criado quando o recurso de compatibilidade importa o primeiro módulo. O processo é fechado quando o último módulo desse tipo é 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 sessão atual do WinPSCompatSession 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 usuário e importa esse módulo proxy para a WinPSCompatSession sessão atual do $env:Temp PowerShell. Isso permite que o PowerShell detecte que o módulo foi carregado usando Windows PowerShell funcionalidade de compatibilidade.

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 em Windows PowerShell e apenas 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:

  • Importando explicitamente um módulo usando o parâmetro UseWindowsPowerShell

    Import-Module -Name ScheduledTasks -UseWindowsPowerShell
    
  • Implicitamente, importando um módulo Windows PowerShell por nome do 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.

Windows PowerShell Compatibilidade bloqueia o carregamento de módulos listados na configuração no arquivo de configuração do WindowsPowerShellCompatibilityModuleDenyList 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 Windows PowerShell, use a DisableImplicitWinCompat configuração em um arquivo de configuração do 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 implícito de carregamento de módulo de Windows PowerShell Compatibilidade.

$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 de módulos do PowerShell 7 .

Gerenciando o clobbering do cmdlet

O recurso de compatibilidade 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 incluiu os módulos principais que são fornecidos com o PowerShell.

No PowerShell 7.1, o comportamento foi alterado para que os seguintes módulos principais do PowerShell não sejam ignorados:

  • 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 substituídos 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ódulo. O valor padrão dessa configuração é:

"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]

Limitações

A funcionalidade de compatibilidade Windows PowerShell:

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

Palavras-chave

about_Windows_PowerShell_Compatibility

Confira também