about_Windows_PowerShell_Compatibility

Kort beskrivning

Beskriver Funktionerna för Windows PowerShell-kompatibilitet för PowerShell 7.

Lång beskrivning

Om inte modulmanifestet anger att modulen är kompatibel med PowerShell Core läses modulerna %windir%\system32\WindowsPowerShell\v1.0\Modules i mappen in i en Windows PowerShell 5.1-bakgrundsprocess med Windows PowerShell-kompatibilitetsfunktionen.

Använda kompatibilitetsfunktionen

När den första modulen importeras med windows PowerShell-kompatibilitetsfunktionen skapar PowerShell en fjärrsession med namnet WinPSCompatSession som körs i en Windows PowerShell 5.1-bakgrundsprocess. Den här processen skapas när kompatibilitetsfunktionen importerar den första modulen. Processen stängs när den sista modulen tas bort (med hjälp av Remove-Module) eller när PowerShell-processen avslutas.

Modulerna som läses in i WinPSCompatSession sessionen används via implicit fjärrkommunikation och återspeglas i den aktuella PowerShell-sessionen. Det här är samma transportmetod som används för PowerShell-jobb.

När en modul importeras till WinPSCompatSession sessionen genererar implicit fjärrkommunikation en proxymodul i användarens $env:Temp katalog och importerar den här proxymodulen till den aktuella PowerShell-sessionen. På så sätt kan PowerShell identifiera att modulen lästes in med hjälp av Windows PowerShell-kompatibilitetsfunktioner.

När sessionen har skapats kan den användas för åtgärder som inte fungerar korrekt på deserialiserade objekt. Hela pipelinen körs i Windows PowerShell och endast slutresultatet returneras. Till exempel:

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

Kompatibilitetsfunktionen kan anropas på två sätt:

  • Explicit genom att importera en modul med parametern UseWindowsPowerShell

    Import-Module -Name ScheduledTasks -UseWindowsPowerShell
    
  • Implicit genom att importera en Windows PowerShell-modul efter modulnamn, sökväg eller automatisk inläsning via kommandoidentifiering.

    Import-Module -Name ServerManager
    Get-AppLockerPolicy -Local
    

    Om den inte redan har lästs in läses AppLocker-modulen in automatiskt när du kör Get-AppLockerPolicy.

Windows PowerShell-kompatibilitet blockerar inläsning av moduler som anges i WindowsPowerShellCompatibilityModuleDenyList inställningen i PowerShell-konfigurationsfilen.

Standardvärdet för den här inställningen är:

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

Hantera implicit modulinläsning

Om du vill inaktivera implicit importbeteende för Windows PowerShell-kompatibilitetsfunktionen använder du DisableImplicitWinCompat inställningen i en PowerShell-konfigurationsfil. Den här inställningen kan läggas till i powershell.config.json filen. Mer information finns i about_powershell_config.

Det här exemplet visar hur du skapar en konfigurationsfil som inaktiverar den implicita modulinläsningsfunktionen i Windows PowerShell-kompatibilitet.

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

Mer information om modulkompatibilitet finns i kompatibilitetslistan för PowerShell 7-modulen.

Hantera cmdlet-kloning

Kompatibilitetsfunktionen i Windows PowerShell använder implicit fjärrkommunikation för att läsa in moduler i kompatibilitetsläge. Resultatet är att kommandon som exporteras av modulen har företräde framför kommandon med samma namn i den aktuella PowerShell 7-sessionen. I PowerShell 7.0.0-versionen inkluderade detta de kärnmoduler som levereras med PowerShell.

I PowerShell 7.1 ändrades beteendet så att följande PowerShell-kärnmoduler inte klonas:

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

PowerShell 7.1 har också lagt till möjligheten att lista ytterligare moduler som inte ska klonas av kompatibilitetsläget.

Du kan lägga till inställningen i WindowsPowerShellCompatibilityNoClobberModuleList PowerShell-konfigurationsfilen. Värdet för den här inställningen är en kommaavgränsad lista med modulnamn. Standardvärdet för den här inställningen är:

"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]

Begränsningar

Windows PowerShell-kompatibilitetsfunktionen:

  1. Fungerar endast lokalt på Windows-datorer
  2. Kräver att Windows PowerShell 5.1
  3. Fungerar på serialiserade cmdlet-parametrar och returvärden, inte på levande objekt
  4. Alla moduler som importeras till Windows PowerShell-fjärrkommunikationssessionen delar samma runspace.

Nyckelord

about_Windows_PowerShell_Compatibility

Se även