about_Windows_PowerShell_Compatibility

Краткое описание

Описывает функции совместимости Windows PowerShell для PowerShell 7.

Подробное описание

Если манифест модуля не указывает, что модуль совместим с PowerShell Core, модули в %windir%\system32\WindowsPowerShell\v1.0\Modules папке загружаются в фоновом процессе Windows PowerShell 5.1 с помощью функции совместимости Windows PowerShell.

Использование функции совместимости

Когда первый модуль импортируется с помощью функции совместимости Windows PowerShell, PowerShell создает удаленный сеанс с именем WinPSCompatSession , который выполняется в фоновом процессе Windows PowerShell 5.1. 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)"
}

Функция совместимости может вызываться двумя способами:

  • Явно импортируйте модуль с помощью параметра UseWindowsPowerShell

    Import-Module -Name ScheduledTasks -UseWindowsPowerShell
    
  • Неявно путем импорта модуля Windows PowerShell по имени модуля, пути или автоматической загрузке с помощью обнаружения команд.

    Import-Module -Name ServerManager
    Get-AppLockerPolicy -Local
    

    Если модуль AppLocker еще не загружен, при запуске Get-AppLockerPolicyмодуль AppLocker автоматически загружается.

Совместимость Windows PowerShell блокирует загрузку модулей, перечисленных в параметре WindowsPowerShellCompatibilityModuleDenyList в файле конфигурации PowerShell.

Значение по умолчанию этого параметра:

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

Управление неявной загрузкой модуля

Чтобы отключить неявное поведение импорта функции совместимости Windows PowerShell, используйте DisableImplicitWinCompat параметр в файле конфигурации PowerShell. Этот параметр можно добавить в 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 также добавил возможность исключения дополнительных модулей из clobbering в режиме совместимости.

Можно добавить параметр в WindowsPowerShellCompatibilityNoClobberModuleList файл конфигурации PowerShell. Значение этого параметра — это разделенный запятыми список имен модулей. Значение по умолчанию этого параметра:

"WindowsPowerShellCompatibilityNoClobberModuleList": [ ]

Ограничения

Функции совместимости Windows PowerShell:

  1. Только локально работает на компьютерах Windows
  2. Требуется Windows PowerShell 5.1
  3. Работает с сериализованными параметрами командлета и возвращаемыми значениями, а не в динамических объектах.
  4. Общий доступ к одному пространству выполнения для всех модулей, импортированных в сеанс удаленного взаимодействия Windows PowerShell

Временные файлы

Функция совместимости Windows PowerShell использует неявное удаленное взаимодействие, чтобы сделать модули Windows PowerShell 5.1 доступными в PowerShell 7. Неявное удаленное взаимодействие создает временные файлы в каталоге $env:Temp . Каждый прокси-модуль хранится в отдельной папке со следующим соглашением об именовании:

  • remoteIpMoProxy_<ModuleName>_<ModuleVersion>_localhost_<SessionGuid>.

PowerShell удаляет временные файлы при удалении последнего прокси-модуля из сеанса или закрытия сеанса.

См. также