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. PowerShell skapar den här processen 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. Med proxymodulen 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 undanta fler moduler från kloning av kompatibilitetsläge.
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:
- Fungerar endast lokalt på Windows-datorer
- Kräver Windows PowerShell 5.1
- Fungerar på serialiserade cmdlet-parametrar och returvärden, inte på levande objekt
- Delar en enda runspace för alla moduler som importeras till Windows PowerShell-fjärrkommunikationssessionen
Tillfälliga filer
Kompatibilitetsfunktionen i Windows PowerShell använder implicit fjärrkommunikation för att göra Windows PowerShell 5.1-moduler tillgängliga i PowerShell 7. Implicit fjärrkommunikation skapar temporära filer i $env:Temp
katalogen. Varje proxied-modul lagras i en separat mapp med följande namngivningskonvention:
-
remoteIpMoProxy_<ModuleName>_<ModuleVersion>_localhost_<SessionGuid>
.
PowerShell tar bort de temporära filerna när du tar bort den senaste proxied-modulen från sessionen eller stänger sessionen.