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
という名前のリモート セッションを作成します。 互換性機能が最初のモジュールをインポートすると、PowerShell によってこのプロセスが作成されます。 プロセスは、最後のモジュールが削除されたとき ( 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 では、互換性モードによって、より多くのモジュールをクロベリングから除外する機能も追加されました。
WindowsPowerShellCompatibilityNoClobberModuleList
設定を PowerShell 構成ファイルに追加できます。 この設定の値は、モジュール名のコンマ区切りのリストです。 この設定の既定値は次のとおりです。
"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]
制限事項
Windows PowerShell 互換性機能:
- Windows コンピューターでのみローカルに動作する
- Windows PowerShell 5.1 が必要
- ライブ オブジェクトではなく、シリアル化されたコマンドレット パラメーターと戻り値を操作します
- Windows PowerShell リモート処理セッションにインポートされたすべてのモジュールに対して 1 つの実行空間を共有します
一時ファイル
Windows PowerShell 互換性機能では、暗黙的なリモート処理を使用して、Windows PowerShell 5.1 モジュールを PowerShell 7 で使用できるようにします。 暗黙的なリモート処理により、 $env:Temp
ディレクトリに一時ファイルが作成されます。 プロキシされた各モジュールは、次の名前付け規則を使用して個別のフォルダーに格納されます。
remoteIpMoProxy_<ModuleName>_<ModuleVersion>_localhost_<SessionGuid>
.
セッションから最後にプロキシされたモジュールを削除するか、セッションを閉じると、PowerShell によって一時ファイルが削除されます。
関連項目
PowerShell