about_Windows_PowerShell_Compatibility
Korte beschrijving
Beschrijft de Windows PowerShell compatibiliteitsfunctionaliteit 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 achtergrond Windows PowerShell 5.1-proces door Windows PowerShell compatibiliteitsfunctie.
De compatibiliteitsfunctie gebruiken
Wanneer de eerste module wordt geïmporteerd met Windows PowerShell compatibiliteitsfunctie, maakt PowerShell een externe sessie met de naam WinPSCompatSession die wordt uitgevoerd op een achtergrond Windows PowerShell 5.1-proces. Dit proces wordt gemaakt wanneer de compatibiliteitsfunctie de eerste module importeert. Het proces wordt gesloten wanneer de laatste dergelijke 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 impliciete externe communicatie een proxymodule in de directory van $env:Temp de gebruiker en importeert deze proxymodule in de huidige PowerShell-sessie. Hierdoor kan PowerShell detecteren dat de module is geladen met behulp van Windows PowerShell compatibiliteitsfunctionaliteit.
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. Bijvoorbeeld:
$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 -UseWindowsPowerShellImpliciet door een Windows PowerShell module te importeren op modulenaam, pad of automatisch laden via opdrachtdetectie.
Import-Module -Name ServerManager Get-AppLockerPolicy -LocalAls 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 instelling in het WindowsPowerShellCompatibilityModuleDenyList PowerShell-configuratiebestand.
De standaardwaarde van deze instelling is:
"WindowsPowerShellCompatibilityModuleDenyList": [
"PSScheduledJob","BestPractices","UpdateServices"
]
Impliciet laden van modules beheren
Als u het impliciete importgedrag van de functie Windows PowerShell Compatibiliteit wilt uitschakelen, gebruikt u de DisableImplicitWinCompat instelling in een PowerShell-configuratiebestand. Deze instelling kan worden toegevoegd aan het powershell.config.json bestand. Zie about_powershell_config voor meer informatie.
In dit voorbeeld ziet u hoe u een configuratiebestand maakt waarmee de impliciete modulelaadfunctie 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 functie Windows PowerShell Compatibiliteit 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 verzonden met PowerShell.
In PowerShell 7.1 is het gedrag gewijzigd, zodat de volgende PowerShell-kernmodules niet worden geknoegd:
- 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 extra modules weer te geven die niet moeten worden geknobbeld 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 Windows PowerShell compatibiliteitsfunctionaliteit:
- Werkt alleen lokaal op Windows-computers
- Vereist dat Windows PowerShell 5.1
- Werkt op geserialiseerde cmdlet-parameters en retourwaarden, niet op live-objecten
- Alle modules die in de Windows PowerShell externe sessie zijn geïmporteerd, delen dezelfde runspace.
Trefwoorden
about_Windows_PowerShell_Compatibility