about_Windows_PowerShell_Compatibility

簡単な説明

PowerShell 7 の Windows PowerShell 互換性機能について説明します。

詳細な説明

モジュール マニフェストでモジュールが PowerShell Core と互換性があることを示していない限り、フォルダー内 %windir%\system32\WindowsPowerShell\v1.0\Modules のモジュールは、Windows PowerShell 互換性機能によってバックグラウンドの Windows PowerShell 5.1 プロセスに読み込まれます。

互換性機能の使用

Windows PowerShell 互換性機能を使用して最初のモジュールをインポートすると、PowerShell によって、バックグラウンドの Windows PowerShell 5.1 プロセスで実行されているリモート セッションが WinPSCompatSession 作成されます。 このプロセスは、互換性機能が最初のモジュールをインポートするときに作成されます。 このプロセスは、最後のモジュールが削除されたとき (使用) Remove-Moduleまたは PowerShell プロセスが終了したときに閉じられます。

セッションに WinPSCompatSession 読み込まれたモジュールは、暗黙的なリモート処理によって使用され、現在の PowerShell セッションに反映されます。 これは、PowerShell ジョブに使用されるのと同じトランスポート方法です。

モジュールがセッションに WinPSCompatSession インポートされると、暗黙的なリモート処理によってユーザーの $env:Temp ディレクトリにプロキシ モジュールが生成され、このプロキシ モジュールが現在の PowerShell セッションにインポートされます。 これにより、PowerShell は、Windows PowerShell 互換性機能を使用してモジュールが読み込まれたことを検出できます。

セッションが作成されると、逆シリアル化されたオブジェクトで正しく動作しない操作に使用できます。 パイプライン全体が Windows PowerShell で実行され、最終的な結果のみが返されます。 次に例を示します。

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

互換性機能は、次の 2 つの方法で呼び出すことができます。

  • UseWindowsPowerShell パラメーターを使用してモジュールをインポートすることで明示的に

    Import-Module -Name ScheduledTasks -UseWindowsPowerShell
    
  • モジュール名、パス、またはコマンド検出による自動読み込みによって、Windows PowerShell モジュールを暗黙的にインポートします。

    Import-Module -Name ServerManager
    Get-AppLockerPolicy -Local
    

    まだ読み込まれていない場合は、実行時 Get-AppLockerPolicyに AppLocker モジュールが自動的に読み込まれます。

Windows PowerShell 互換性により、PowerShell 構成ファイルの設定に WindowsPowerShellCompatibilityModuleDenyList 記載されているモジュールの読み込みがブロックされます。

この設定の既定値は次のとおりです。

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

暗黙的なモジュールの読み込みの管理

Windows PowerShell 互換性機能の暗黙的なインポート動作を無効にするには、PowerShell 構成ファイルの設定を使用 DisableImplicitWinCompat します。 この設定はファイルに powershell.config.json 追加できます。 詳細については、「about_powershell_config」を参照してください

この例では、Windows PowerShell 互換性の暗黙的なモジュール読み込み機能を無効にする構成ファイルを作成する方法を示します。

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

モジュールの互換性に関する最新情報については、PowerShell 7 モジュールの互換性の一覧を参照してください。

コマンドレットの clobbering の管理

Windows PowerShell 互換性機能では、暗黙的なリモート処理を使用して、互換モードでモジュールを読み込みます。 その結果、モジュールによってエクスポートされたコマンドは、現在の PowerShell 7 セッションの同じ名前のコマンドよりも優先されます。 PowerShell 7.0.0 リリースでは、これには PowerShell に付属するコア モジュールが含まれていました。

PowerShell 7.1 では、次のコア PowerShell モジュールが互換性を持たないように動作が変更されました。

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

また、PowerShell 7.1 では、互換モードでは使用できない追加のモジュールを一覧表示する機能も追加されました。

PowerShell 構成ファイルに WindowsPowerShellCompatibilityNoClobberModuleList 設定を追加できます。 この設定の値は、モジュール名のコンマ区切りのリストです。 この設定の既定値は次のとおりです。

"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]

制限事項

Windows PowerShell 互換性機能:

  1. Windows コンピューターでのみローカルに動作する
  2. Windows PowerShell 5.1 が必要
  3. ライブ オブジェクトではなく、シリアル化されたコマンドレット パラメーターと戻り値を操作します
  4. Windows PowerShell リモート処理セッションにインポートされるすべてのモジュールは、同じ実行空間を共有します。

キーワード

about_Windows_PowerShell_Compatibility

関連項目