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:
- Только локально работает на компьютерах Windows
- Требуется Windows PowerShell 5.1
- Работает с сериализованными параметрами командлета и возвращаемыми значениями, а не в динамических объектах.
- Общий доступ к одному пространству выполнения для всех модулей, импортированных в сеанс удаленного взаимодействия Windows PowerShell
Временные файлы
Функция совместимости Windows PowerShell использует неявное удаленное взаимодействие, чтобы сделать модули Windows PowerShell 5.1 доступными в PowerShell 7. Неявное удаленное взаимодействие создает временные файлы в каталоге $env:Temp
. Каждый прокси-модуль хранится в отдельной папке со следующим соглашением об именовании:
remoteIpMoProxy_<ModuleName>_<ModuleVersion>_localhost_<SessionGuid>
.
PowerShell удаляет временные файлы при удалении последнего прокси-модуля из сеанса или закрытия сеанса.
См. также
PowerShell