Condividi tramite


about_Windows_PowerShell_Compatibility

Descrizione breve

Descrive la funzionalità di compatibilità di Windows PowerShell per PowerShell 7.

Descrizione lunga

A meno che il manifesto del modulo non indichi che il modulo è compatibile con PowerShell Core, i moduli nella %windir%\system32\WindowsPowerShell\v1.0\Modules cartella vengono caricati in un processo di Windows PowerShell 5.1 in background tramite la funzionalità compatibilità di Windows PowerShell.

Uso della funzionalità di compatibilità

Quando il primo modulo viene importato usando la funzionalità di compatibilità di Windows PowerShell, PowerShell crea una sessione remota denominata WinPSCompatSession che viene eseguita in un processo di Windows PowerShell 5.1 in background. PowerShell crea questo processo quando la funzionalità di compatibilità importa il primo modulo. Il processo viene chiuso quando l'ultimo modulo viene rimosso (usando Remove-Module) o quando il processo di PowerShell viene chiuso.

I moduli caricati nella WinPSCompatSession sessione vengono usati tramite comunicazione remota implicita e riflesse nella sessione corrente di PowerShell. Si tratta dello stesso metodo di trasporto usato per i processi di PowerShell.

Quando un modulo viene importato nella WinPSCompatSession sessione, la comunicazione remota implicita genera un modulo proxy nella directory dell'utente $env:Temp e importa questo modulo proxy nella sessione di PowerShell corrente. Il modulo proxy consente a PowerShell di rilevare che il modulo è stato caricato usando la funzionalità di compatibilità di Windows PowerShell.

Dopo aver creato la sessione, può essere usata per le operazioni che non funzionano correttamente sugli oggetti deserializzati. L'intera pipeline viene eseguita in Windows PowerShell e viene restituito solo il risultato finale. Ad esempio:

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

La funzionalità di compatibilità può essere richiamata in due modi:

  • In modo esplicito importando un modulo usando il parametro UseWindowsPowerShell

    Import-Module -Name ScheduledTasks -UseWindowsPowerShell
    
  • Importando in modo implicito un modulo di Windows PowerShell in base al nome del modulo, al percorso o al caricamento automatico tramite l'individuazione dei comandi.

    Import-Module -Name ServerManager
    Get-AppLockerPolicy -Local
    

    Se non è già stato caricato, il modulo AppLocker viene caricato automaticamente quando si esegue Get-AppLockerPolicy.

Compatibilità di Windows PowerShell blocca il caricamento dei moduli elencati nell'impostazione WindowsPowerShellCompatibilityModuleDenyList nel file di configurazione di PowerShell.

Il valore predefinito di questa impostazione è:

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

Gestione del caricamento implicito dei moduli

Per disabilitare il comportamento di importazione implicito della funzionalità compatibilità di Windows PowerShell, usare l'impostazione DisableImplicitWinCompat in un file di configurazione di PowerShell. Questa impostazione può essere aggiunta al powershell.config.json file. Per altre informazioni, vedere about_PowerShell_Config.

Questo esempio illustra come creare un file di configurazione che disabilita la funzionalità implicita di caricamento dei moduli di Compatibilità di 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

Per altre informazioni sulla compatibilità dei moduli, vedere l'elenco di compatibilità dei moduli di PowerShell 7.

Gestione del cmdlet clobbering

La funzionalità compatibilità di Windows PowerShell usa la comunicazione remota implicita per caricare i moduli in modalità di compatibilità. Il risultato è che i comandi esportati dal modulo hanno la precedenza sui comandi con lo stesso nome nella sessione corrente di PowerShell 7. Nella versione di PowerShell 7.0.0 sono inclusi i moduli principali forniti con PowerShell.

In PowerShell 7.1 il comportamento è stato modificato in modo che i moduli di PowerShell principali seguenti non siano 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 ha anche aggiunto la possibilità di escludere altri moduli dalla modalità di compatibilità.

È possibile aggiungere l'impostazione WindowsPowerShellCompatibilityNoClobberModuleList al file di configurazione di PowerShell. Il valore di questa impostazione è un elenco delimitato da virgole di nomi di modulo. Il valore predefinito di questa impostazione è:

"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]

Limiti

Funzionalità di compatibilità di Windows PowerShell:

  1. Funziona solo in locale nei computer Windows
  2. Richiede Windows PowerShell 5.1
  3. Opera sui parametri dei cmdlet serializzati e sui valori restituiti, non sugli oggetti attivi
  4. Condivide un singolo spazio di esecuzione per tutti i moduli importati nella sessione remota di Windows PowerShell

File temporanei

La funzionalità di compatibilità di Windows PowerShell usa la comunicazione remota implicita per rendere disponibili i moduli di Windows PowerShell 5.1 in PowerShell 7. La comunicazione remota implicita crea file temporanei nella $env:Temp directory. Ogni modulo proxied viene archiviato in una cartella separata con la convenzione di denominazione seguente:

  • remoteIpMoProxy_<ModuleName>_<ModuleVersion>_localhost_<SessionGuid>.

PowerShell rimuove i file temporanei quando si rimuove l'ultimo modulo proxy dalla sessione o si chiude la sessione.

Vedi anche