Dela via


about_Windows_PowerShell_Compatibility

Kort beskrivning

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

Lång beskrivning

Såvida inte modulmanifestet anger att modulen är kompatibel med PowerShell Core läses modulerna %windir%\system32\WindowsPowerShell\v1.0\Modules i mappen in i en bakgrund Windows PowerShell 5.1-process genom Windows PowerShell kompatibilitetsfunktion.

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 bakgrund Windows PowerShell 5.1-process. Den här processen skapas när funktionen Kompatibilitet 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. Detta gör att PowerShell kan 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. 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 funktionen Windows PowerShell kompatibilitet 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 Compatibility.

$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

Funktionen Windows PowerShell Compatibility 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 kärnmodulerna 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

Funktionerna för Windows PowerShell-kompatibilitet:

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

Nyckelord

about_Windows_PowerShell_Compatibility

Se även