Delen via


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. Dit proces wordt gemaakt 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. Hierdoor kan PowerShell detecteren dat de module is geladen met 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. 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 kernmodules van PowerShell 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 mogen 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 compatibiliteitsfunctionaliteit van Windows PowerShell:

  1. Werkt alleen lokaal op Windows-computers
  2. Vereist dat Windows PowerShell 5.1
  3. Werkt op geserialiseerde cmdlet-parameters en retourwaarden, niet op live-objecten
  4. Alle modules die zijn geïmporteerd in de externe windows PowerShell-sessie, delen dezelfde runspace.

Trefwoorden

about_Windows_PowerShell_Compatibility

Zie ook