about_Windows_PowerShell_Compatibility

Kurze Beschreibung

Beschreibt die Windows PowerShell Kompatibilitätsfunktionalität für PowerShell 7.

Lange Beschreibung

Sofern das Modulmanifest nicht angibt, dass das Modul mit PowerShell Core kompatibel ist, werden Module im %windir%\system32\WindowsPowerShell\v1.0\Modules Ordner in einem Hintergrund Windows PowerShell 5.1-Prozesses geladen, indem Windows PowerShell Kompatibilitätsfeature verwendet wird.

Verwenden des Kompatibilitätsfeatures

Wenn das erste Modul mithilfe Windows PowerShell Kompatibilitätsfeatures importiert wird, erstellt PowerShell eine Remotesitzung namens WinPSCompatSession , die in einem Hintergrundprozess Windows PowerShell 5.1 ausgeführt wird. Dieser Prozess wird erstellt, wenn das Kompatibilitätsfeature das erste Modul importiert. Der Prozess wird geschlossen, wenn das letzte modul dieser Art entfernt wird Remove-Module (mithilfe von ) oder wenn der PowerShell-Prozess beendet wird.

Die in der Sitzung geladenen Module WinPSCompatSession werden über implizites Remoting verwendet und in der aktuellen PowerShell-Sitzung widergespiegelt. Dies ist die gleiche Transportmethode, die auch für PowerShell-Aufträge verwendet wird.

Wenn ein Modul in die Sitzung importiert WinPSCompatSession wird, generiert implizites Remoting ein Proxymodul im Verzeichnis des Benutzers und importiert dieses Proxymodul in die $env:Temp aktuelle PowerShell-Sitzung. Dadurch kann PowerShell erkennen, dass das Modul mithilfe Windows PowerShell Kompatibilitätsfunktionalität geladen wurde.

Nachdem die Sitzung erstellt wurde, kann sie für Vorgänge verwendet werden, die für deserialisierte Objekte nicht ordnungsgemäß funktionieren. Die gesamte Pipeline wird in Windows PowerShell ausgeführt, und nur das Endergebnis wird zurückgegeben. Beispiel:

$s = Get-PSSession -Name WinPSCompatSession
Invoke-Command -Session $s -ScriptBlock {
  "Running in Windows PowerShell version $($PSVersionTable.PSVersion)"
}

Das Kompatibilitätsfeature kann auf zwei Arten aufgerufen werden:

  • Explizit durch Importieren eines Moduls mit dem UseWindowsPowerShell-Parameter

    Import-Module -Name ScheduledTasks -UseWindowsPowerShell
    
  • Implizit durch Importieren eines Windows PowerShell Moduls nach Modulname, Pfad oder automatischem Laden über die Befehlsermittlung.

    Import-Module -Name ServerManager
    Get-AppLockerPolicy -Local
    

    Wenn nicht bereits geladen, wird das AppLocker-Modul automatisch geladen, wenn Sie Get-AppLockerPolicy ausführen.

Windows PowerShell Kompatibilität blockiert das Laden von Modulen, die in der Einstellung in der WindowsPowerShellCompatibilityModuleDenyList PowerShell-Konfigurationsdatei aufgeführt sind.

Der Standardwert dieser Einstellung lautet:

"WindowsPowerShellCompatibilityModuleDenyList":  [
   "PSScheduledJob","BestPractices","UpdateServices"
]

Verwalten des impliziten Ladens von Modulen

Um das implizite Importverhalten der Windows PowerShell-Kompatibilitätsfunktion zu deaktivieren, verwenden Sie die DisableImplicitWinCompat Einstellung in einer PowerShell-Konfigurationsdatei. Diese Einstellung kann der Datei hinzugefügt powershell.config.json werden. Weitere Informationen finden Sie unter about_powershell_config.

In diesem Beispiel wird gezeigt, wie Sie eine Konfigurationsdatei erstellen, die das implizite Modulladefeature von Windows PowerShell Compatibility deaktiviert.

$ConfigPath = "$PSHOME\DisableWinCompat.powershell.config.json"
$ConfigJSON = ConvertTo-Json -InputObject @{
  "DisableImplicitWinCompat" = $true
  "Microsoft.PowerShell:ExecutionPolicy" = "RemoteSigned"
}
$ConfigJSON | Out-File -Force $ConfigPath
pwsh -settingsFile $ConfigPath

Weitere Informationen zur Modulkompatibilität finden Sie in der PowerShell 7-Modulkompatibilitätsliste.

Verwalten von Cmdlet-Clobbering

Die Windows PowerShell-Kompatibilitätsfunktion verwendet implizites Remoting, um Module im Kompatibilitätsmodus zu laden. Das Ergebnis ist, dass vom Modul exportierte Befehle in der aktuellen PowerShell 7-Sitzung Vorrang vor Befehlen mit dem gleichen Namen haben. Im PowerShell 7.0.0-Release umfasste dies die Kernmodule, die mit PowerShell geliefert werden.

In PowerShell 7.1 wurde das Verhalten geändert, sodass die folgenden PowerShell-Kernmodule nicht vertauscht werden:

  • Microsoft.PowerShell.ConsoleHost
  • Microsoft.PowerShell.Diagnostics
  • Microsoft.PowerShell.Host
  • Microsoft.PowerShell.Management
  • Microsoft.PowerShell.Security
  • Microsoft.PowerShell.Utility
  • Microsoft.WSMan.Management

PowerShell 7.1 hat auch die Möglichkeit hinzugefügt, zusätzliche Module aufzulisten, die nicht vom Kompatibilitätsmodus verdeckt werden sollten.

Sie können die WindowsPowerShellCompatibilityNoClobberModuleList Einstellung der PowerShell-Konfigurationsdatei hinzufügen. Der Wert dieser Einstellung ist eine durch Trennzeichen getrennte Liste von Modulnamen. Der Standardwert dieser Einstellung lautet:

"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]

Einschränkungen

Die Windows PowerShell-Kompatibilitätsfunktionalität:

  1. Funktioniert nur lokal auf Windows Computern
  2. Erfordert, dass Windows PowerShell 5.1
  3. Arbeitet mit serialisierten Cmdlet-Parametern und Rückgabewerten, nicht mit Liveobjekten.
  4. Alle in die Windows PowerShell Remotingsitzung importierten Module verwenden denselben Runspace.

Keywords

about_Windows_PowerShell_Compatibility

Weitere Informationen

about_Modules

Import-Module