about_Windows_PowerShell_Compatibility

Kurze Beschreibung

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

Lange Beschreibung

Es sei denn, das Modulmanifest gibt an, 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-Prozess durch Windows PowerShell Kompatibilitätsfeature geladen.

Verwenden des Kompatibilitätsfeatures

Wenn das erste Modul mithilfe Windows PowerShell Kompatibilitätsfeatures importiert wird, erstellt PowerShell eine Remotesitzung mit dem NamenWinPSCompatSession, die in einem Hintergrund Windows PowerShell 5.1-Prozess ausgeführt wird. Dieser Prozess wird erstellt, wenn das Kompatibilitätsfeature das erste Modul importiert. Der Prozess wird geschlossen, wenn das letzte solche Modul entfernt wird (mithilfe von Remove-Module) oder wenn Der PowerShell-Prozess beendet wird.

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

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

Sobald die Sitzung erstellt wurde, kann sie für Vorgänge verwendet werden, die nicht ordnungsgemäß für deserialisierte Objekte funktionieren. Die gesamte Pipeline wird in Windows PowerShell ausgeführt, und es wird nur das endgültige Ergebnis zurückgegeben. Zum 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 mithilfe des UseWindowsPowerShell-Parameters

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

    Import-Module -Name ServerManager
    Get-AppLockerPolicy -Local
    

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

Windows PowerShell Kompatibilitätsblöcke beim 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 ladens impliziten Moduls

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

In diesem Beispiel wird gezeigt, wie Sie eine Konfigurationsdatei erstellen, die das implizite Modulladefeature Windows PowerShell Kompatibilität 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

Das Feature Windows PowerShell Kompatibilität verwendet implizites Remoting zum Laden von Modulen im Kompatibilitätsmodus. Das Ergebnis ist, dass von dem Modul exportierte Befehle Vorrang vor Befehlen desselben Namens in der aktuellen PowerShell 7-Sitzung haben. In der PowerShell 7.0.0-Version enthält dies die Kernmodule, die mit PowerShell ausgeliefert werden.

In PowerShell 7.1 wurde das Verhalten geändert, sodass die folgenden PowerShell-Kernmodule nicht geknäuscht 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 außerdem die Möglichkeit hinzugefügt, zusätzliche Module auflisten zu können, die nicht durch den Kompatibilitätsmodus verworfen werden sollten.

Sie können die Einstellung zur WindowsPowerShellCompatibilityNoClobberModuleList 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. Betreibt serialisierte Cmdlet-Parameter und Rückgabewerte, nicht für Liveobjekte
  4. Alle in die Windows PowerShell Remotingsitzung importierten Module teilen denselben Runspace.

Keywords

about_Windows_PowerShell_Compatibility

Siehe auch