about_Windows_PowerShell_Compatibility
Korte beschrijving
Beschrijft de compatibiliteitsfunctionaliteit van Windows PowerShell voor PowerShell 7.
Lange beschrijving
Tenzij het modulemanifest aangeeft dat de module compatibel is met PowerShell Core, worden modules in de %windir%\system32\WindowsPowerShell\v1.0\Modules
map geladen in een windows PowerShell 5.1-proces op de achtergrond door de windows PowerShell-compatibiliteitsfunctie.
De compatibiliteitsfunctie gebruiken
Wanneer de eerste module wordt geïmporteerd met de windows PowerShell-compatibiliteitsfunctie, maakt PowerShell een externe sessie met de naam WinPSCompatSession
die wordt uitgevoerd in een windows PowerShell 5.1-proces op de achtergrond. PowerShell maakt dit proces wanneer de compatibiliteitsfunctie de eerste module importeert. Het proces wordt gesloten wanneer de laatste module wordt verwijderd (met behulp van Remove-Module
) of wanneer het PowerShell-proces wordt afgesloten.
De modules die in de WinPSCompatSession
sessie worden geladen, worden gebruikt via impliciete externe communicatie en weerspiegeld in de huidige PowerShell-sessie. Dit is dezelfde transportmethode die wordt gebruikt voor PowerShell-taken.
Wanneer een module wordt geïmporteerd in de WinPSCompatSession
sessie, genereert impliciet externe communicatie een proxymodule in de map van $env:Temp
de gebruiker en importeert u deze proxymodule in de huidige PowerShell-sessie. Met de proxymodule kan PowerShell detecteren dat de module is geladen met de compatibiliteitsfunctionaliteit van Windows PowerShell.
Zodra de sessie is gemaakt, kan deze worden gebruikt voor bewerkingen die niet correct werken op gedeserialiseerde objecten. De volledige pijplijn wordt uitgevoerd in Windows PowerShell en alleen het uiteindelijke resultaat wordt geretourneerd. Voorbeeld:
$s = Get-PSSession -Name WinPSCompatSession
Invoke-Command -Session $s -ScriptBlock {
"Running in Windows PowerShell version $($PSVersionTable.PSVersion)"
}
De compatibiliteitsfunctie kan op twee manieren worden aangeroepen:
Expliciet door een module te importeren met behulp van de parameter UseWindowsPowerShell
Import-Module -Name ScheduledTasks -UseWindowsPowerShell
Impliciet door een Windows PowerShell-module te importeren op modulenaam, pad of automatisch laden via opdrachtdetectie.
Import-Module -Name ServerManager Get-AppLockerPolicy -Local
Als deze nog niet is geladen, wordt de AppLocker-module automatisch geladen wanneer u deze uitvoert
Get-AppLockerPolicy
.
Windows PowerShell-compatibiliteit blokkeert het laden van modules die worden vermeld in de WindowsPowerShellCompatibilityModuleDenyList
instelling in het PowerShell-configuratiebestand.
De standaardwaarde van deze instelling is:
"WindowsPowerShellCompatibilityModuleDenyList": [
"PSScheduledJob","BestPractices","UpdateServices"
]
Impliciet laden van modules beheren
Als u impliciet importgedrag van de windows PowerShell-compatibiliteitsfunctie wilt uitschakelen, gebruikt u de DisableImplicitWinCompat
instelling in een PowerShell-configuratiebestand. Deze instelling kan aan het powershell.config.json
bestand worden toegevoegd. Zie about_PowerShell_Config voor meer informatie.
In dit voorbeeld ziet u hoe u een configuratiebestand maakt waarmee de impliciete functie voor het laden van modules van Windows PowerShell-compatibiliteit wordt uitgeschakeld.
$ConfigPath = "$PSHOME\DisableWinCompat.powershell.config.json"
$ConfigJSON = ConvertTo-Json -InputObject @{
"DisableImplicitWinCompat" = $true
"Microsoft.PowerShell:ExecutionPolicy" = "RemoteSigned"
}
$ConfigJSON | Out-File -Force $ConfigPath
pwsh -settingsFile $ConfigPath
Zie de compatibiliteitslijst met PowerShell 7-modules voor meer informatie over modulecompatibiliteit .
Cmdlet-clobbering beheren
De windows PowerShell-compatibiliteitsfunctie maakt gebruik van impliciete externe communicatie om modules in de compatibiliteitsmodus te laden. Het resultaat is dat opdrachten die door de module worden geëxporteerd voorrang hebben op opdrachten met dezelfde naam in de huidige PowerShell 7-sessie. In de PowerShell 7.0.0-release bevatte dit de kernmodules die worden geleverd met PowerShell.
In PowerShell 7.1 is het gedrag gewijzigd, zodat de volgende PowerShell-kernmodules niet worden 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 heeft ook de mogelijkheid toegevoegd om meer modules uit te sluiten van clobbering door de compatibiliteitsmodus.
U kunt de instelling toevoegen aan het WindowsPowerShellCompatibilityNoClobberModuleList
PowerShell-configuratiebestand. De waarde van deze instelling is een door komma's gescheiden lijst met modulenamen. De standaardwaarde van deze instelling is:
"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]
Beperkingen
De compatibiliteitsfunctionaliteit van Windows PowerShell:
- Werkt alleen lokaal op Windows-computers
- Vereist Windows PowerShell 5.1
- Werkt op geserialiseerde cmdlet-parameters en retourwaarden, niet op live-objecten
- Deelt één runspace voor alle modules die zijn geïmporteerd in de externe sessie van Windows PowerShell
Tijdelijke bestanden
De windows PowerShell-compatibiliteitsfunctie maakt gebruik van impliciete externe communicatie om Windows PowerShell 5.1-modules beschikbaar te maken in PowerShell 7. Impliciete externe toegang maakt tijdelijke bestanden in de $env:Temp
map. Elke geproxiede module wordt opgeslagen in een afzonderlijke map met de volgende naamconventie:
remoteIpMoProxy_<ModuleName>_<ModuleVersion>_localhost_<SessionGuid>
.
PowerShell verwijdert de tijdelijke bestanden wanneer u de laatste geproxiede module uit de sessie verwijdert of de sessie sluit.