about_Windows_PowerShell_Compatibility

Descripción breve

Describe la funcionalidad compatibilidad de Windows PowerShell para PowerShell 7.

Descripción larga

A menos que el manifiesto del módulo indique que el módulo es compatible con PowerShell Core, los módulos de la carpeta se cargan en un proceso de Windows PowerShell 5.1 en segundo plano mediante la %windir%\system32\WindowsPowerShell\v1.0\Modules característica compatibilidad de Windows PowerShell.

Uso de la característica compatibilidad

Cuando se importa el primer módulo mediante la característica compatibilidad de Windows PowerShell, PowerShell crea una sesión remota denominada WinPSCompatSession que se ejecuta en un proceso de Windows PowerShell 5.1 en segundo plano. Este proceso se crea cuando la característica compatibilidad importa el primer módulo. El proceso se cierra cuando se quita el último módulo de este tipo (mediante Remove-Module) o cuando se cierra el proceso de PowerShell.

Los módulos cargados en la WinPSCompatSession sesión se usan a través de la comunicación remota implícita y se reflejan en la sesión actual de PowerShell. Este es el mismo método de transporte que se usa para los trabajos de PowerShell.

Cuando se importa un módulo en la WinPSCompatSession sesión, la comunicación remota implícita genera un módulo proxy en el directorio del $env:Temp usuario e importa este módulo proxy en la sesión actual de PowerShell. Esto permite a PowerShell detectar que el módulo se cargó mediante la funcionalidad compatibilidad de Windows PowerShell.

Una vez creada la sesión, se puede usar para las operaciones que no funcionan correctamente en objetos deserializados. Toda la canalización se ejecuta en Windows PowerShell y solo se devuelve el resultado final. Por ejemplo:

$s = Get-PSSession -Name WinPSCompatSession
Invoke-Command -Session $s -ScriptBlock {
  "Running in Windows PowerShell version $($PSVersionTable.PSVersion)"
}

La característica compatibilidad se puede invocar de dos maneras:

  • Importar explícitamente un módulo mediante el parámetro UseWindowsPowerShell

    Import-Module -Name ScheduledTasks -UseWindowsPowerShell
    
  • Importa implícitamente un módulo de Windows PowerShell por nombre de módulo, ruta de acceso o carga automática a través de la detección de comandos.

    Import-Module -Name ServerManager
    Get-AppLockerPolicy -Local
    

    Si aún no se ha cargado, el módulo de AppLocker se carga automáticamente al ejecutar Get-AppLockerPolicy.

La compatibilidad de Windows PowerShell bloquea la carga de módulos que aparecen en la WindowsPowerShellCompatibilityModuleDenyList configuración del archivo de configuración de PowerShell.

El valor predeterminado de esta configuración es:

"WindowsPowerShellCompatibilityModuleDenyList":  [
   "PSScheduledJob","BestPractices","UpdateServices"
]

Administración de la carga implícita de módulos

Para deshabilitar el comportamiento de importación implícito de la característica compatibilidad de Windows PowerShell, use la DisableImplicitWinCompat configuración en un archivo de configuración de PowerShell. Esta configuración se puede agregar al powershell.config.json archivo. Para obtener más información, consulte about_powershell_config.

En este ejemplo se muestra cómo crear un archivo de configuración que deshabilite la característica implícita de carga de módulos de compatibilidad de 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 más información sobre la compatibilidad de módulos, consulte la lista de compatibilidad de módulos de PowerShell 7.

Administración de cmdlets clobbering

La característica compatibilidad de Windows PowerShell usa comunicación remota implícita para cargar módulos en modo de compatibilidad. El resultado es que los comandos exportados por el módulo tienen prioridad sobre los comandos del mismo nombre en la sesión actual de PowerShell 7. En la versión de PowerShell 7.0.0, esto incluye los módulos principales que se incluyen con PowerShell.

En PowerShell 7.1, se cambió el comportamiento para que los siguientes módulos principales de PowerShell no estén clobbered:

  • Microsoft.PowerShell.ConsoleHost
  • Microsoft.PowerShell.Diagnostics
  • Microsoft.PowerShell.Host
  • Microsoft.PowerShell.Management
  • Microsoft.PowerShell.Security
  • Microsoft.PowerShell.Utility
  • Microsoft.WSMan.Management

PowerShell 7.1 también ha agregado la capacidad de enumerar módulos adicionales que no deben ser clobberedados por el modo de compatibilidad.

Puede agregar la WindowsPowerShellCompatibilityNoClobberModuleList configuración al archivo de configuración de PowerShell. El valor de esta configuración es una lista separada por comas de nombres de módulo. El valor predeterminado de esta configuración es:

"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]

Limitaciones

La funcionalidad de compatibilidad de Windows PowerShell:

  1. Solo funciona localmente en equipos Windows
  2. Requiere que Windows PowerShell 5.1
  3. Funciona en parámetros de cmdlet serializados y valores devueltos, no en objetos dinámicos
  4. Todos los módulos importados en la sesión remota de Windows PowerShell comparten el mismo espacio de ejecución.

Palabras clave

about_Windows_PowerShell_Compatibility

Consulte también