Share via


about_Windows_PowerShell_Compatibility

Description courte

Décrit la fonctionnalité de compatibilité Windows PowerShell pour PowerShell 7.

Description longue

À moins que le manifeste du module indique que le module est compatible avec PowerShell Core, les modules du %windir%\system32\WindowsPowerShell\v1.0\Modules dossier sont chargés en arrière-plan Windows PowerShell processus 5.1 par Windows PowerShell fonctionnalité de compatibilité.

Utilisation de la fonctionnalité de compatibilité

Lorsque le premier module est importé à l’aide de Windows PowerShell fonctionnalité de compatibilité, PowerShell crée une session distante nommée WinPSCompatSession qui s’exécute en arrière-plan Windows PowerShell processus 5.1. Ce processus est créé lorsque la fonctionnalité de compatibilité importe le premier module. Le processus est fermé lorsque le dernier module de ce type est supprimé (à l’aide Remove-Modulede ) ou lorsque le processus PowerShell se ferme.

Les modules chargés dans la session sont utilisés via la WinPSCompatSession communication à distance implicite et répercutés dans la session PowerShell actuelle. Il s’agit de la même méthode de transport que celle utilisée pour les travaux PowerShell.

Lorsqu’un module est importé dans la session, la WinPSCompatSession communication à distance implicite génère un module proxy dans le répertoire de $env:Temp l’utilisateur et importe ce module proxy dans la session PowerShell active. Cela permet à PowerShell de détecter que le module a été chargé à l’aide de Windows PowerShell fonctionnalité de compatibilité.

Une fois la session créée, elle peut être utilisée pour les opérations qui ne fonctionnent pas correctement sur des objets désérialisés. L’intégralité du pipeline est exécutée dans Windows PowerShell et seul le résultat final est retourné. Par exemple :

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

La fonctionnalité de compatibilité peut être appelée de deux façons :

  • Explicitement en important un module à l’aide du paramètre UseWindowsPowerShell

    Import-Module -Name ScheduledTasks -UseWindowsPowerShell
    
  • Implicitement en important un module Windows PowerShell par nom de module, chemin d’accès ou chargement automatique via la découverte de commandes.

    Import-Module -Name ServerManager
    Get-AppLockerPolicy -Local
    

    S’il n’est pas déjà chargé, le module AppLocker est chargé automatiquement lorsque vous exécutez Get-AppLockerPolicy.

Windows PowerShell Compatibilité bloque le chargement des modules répertoriés dans le paramètre dans le WindowsPowerShellCompatibilityModuleDenyList fichier de configuration PowerShell.

La valeur par défaut de ce paramètre est :

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

Gestion du chargement implicite des modules

Pour désactiver le comportement d’importation implicite de la fonctionnalité compatibilité Windows PowerShell, utilisez le DisableImplicitWinCompat paramètre dans un fichier de configuration PowerShell. Ce paramètre peut être ajouté au powershell.config.json fichier. Pour plus d’informations, consultez about_powershell_config.

Cet exemple montre comment créer un fichier de configuration qui désactive la fonctionnalité de chargement de module implicite de Windows PowerShell Compatibilité.

$ConfigPath = "$PSHOME\DisableWinCompat.powershell.config.json"
$ConfigJSON = ConvertTo-Json -InputObject @{
  "DisableImplicitWinCompat" = $true
  "Microsoft.PowerShell:ExecutionPolicy" = "RemoteSigned"
}
$ConfigJSON | Out-File -Force $ConfigPath
pwsh -settingsFile $ConfigPath

Pour plus d’informations sur la compatibilité des modules, consultez la liste de compatibilité des modules PowerShell 7 .

Gestion du clobbering d’applet de commande

La fonctionnalité compatibilité Windows PowerShell utilise la communication à distance implicite pour charger des modules en mode de compatibilité. Le résultat est que les commandes exportées par le module sont prioritaires sur les commandes du même nom dans la session PowerShell 7 actuelle. Dans la version 7.0.0 de PowerShell, cela incluait les modules de base fournis avec PowerShell.

Dans PowerShell 7.1, le comportement a été modifié afin que les modules PowerShell de base suivants ne soient pas clobés :

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

PowerShell 7.1 a également ajouté la possibilité de répertorier des modules supplémentaires qui ne doivent pas être clobés par le mode de compatibilité.

Vous pouvez ajouter le WindowsPowerShellCompatibilityNoClobberModuleList paramètre au fichier de configuration PowerShell. La valeur de ce paramètre est une liste de noms de module séparés par des virgules. La valeur par défaut de ce paramètre est :

"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]

Limites

La fonctionnalité compatibilité Windows PowerShell :

  1. Fonctionne uniquement localement sur les ordinateurs Windows
  2. Nécessite que Windows PowerShell 5.1
  3. Fonctionne sur les paramètres d’applet de commande sérialisés et les valeurs de retour, et non sur les objets actifs
  4. Tous les modules importés dans la session de communication à distance Windows PowerShell partagent le même runspace.

Mots clés

about_Windows_PowerShell_Compatibility

Voir aussi