Freigeben über


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 %windir%\system32\WindowsPowerShell\v1.0\Modules im 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 namensWinPSCompatSession, die in einem Hintergrundprozess 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 (mit Remove-Module) oder wenn der PowerShell-Prozess beendet wird.

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

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

Nachdem die Sitzung erstellt wurde, kann sie für Vorgänge verwendet werden, die bei deserialisierten Objekten 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 mithilfe des UseWindowsPowerShell-Parameters

    Import-Module -Name ScheduledTasks -UseWindowsPowerShell
    
  • Implizit durch Importieren eines Windows PowerShell Moduls nach Modulname, Pfad oder automatischem Laden per 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 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 des Windows PowerShell Kompatibilitätsfeatures zu deaktivieren, verwenden Sie die DisableImplicitWinCompat Einstellung in einer PowerShell-Konfigurationsdatei. 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 von 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 Kompatibilitätsliste für PowerShell 7-Module .

Verwalten des Klonens von Cmdlets

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

In PowerShell 7.1 wurde das Verhalten geändert, sodass die folgenden PowerShell-Kernmodule nicht geklont 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 durch den Kompatibilitätsmodus geklont werden sollten.

Sie können die Einstellung der 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. Arbeitet mit serialisierten Cmdletparametern und Rückgabewerten, nicht mit Liveobjekten
  4. Alle Module, die in die Windows PowerShell Remotingsitzung importiert werden, verwenden den gleichen Runspace.

Schlüsselwörter

about_Windows_PowerShell_Compatibility

Weitere Informationen