次の方法で共有


about_Windows_PowerShell_Compatibility

簡単な説明

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

長い説明

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

互換性機能の使用

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

こちらもご覧ください