Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.