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 segundo plano en un proceso de Windows PowerShell 5.1 en segundo plano. PowerShell crea este proceso cuando la característica compatibilidad importa el primer módulo. El proceso se cierra cuando se quita el último módulo (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. El módulo proxy 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 excluir más módulos del 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:
- Solo funciona localmente en equipos Windows
- Requiere Windows PowerShell 5.1
- Funciona en parámetros de cmdlet serializados y valores devueltos, no en objetos dinámicos
- Comparte un único espacio de ejecución para todos los módulos importados en la sesión de comunicación remota de Windows PowerShell
Archivos temporales
La característica compatibilidad de Windows PowerShell usa la comunicación remota implícita para que los módulos de Windows PowerShell 5.1 estén disponibles en PowerShell 7. La comunicación remota implícita crea archivos temporales en el $env:Temp
directorio. Cada módulo proxy se almacena en una carpeta independiente con la siguiente convención de nomenclatura:
remoteIpMoProxy_<ModuleName>_<ModuleVersion>_localhost_<SessionGuid>
.
PowerShell quita los archivos temporales al quitar el último módulo proxy de la sesión o cerrar la sesión.