Удаленное взаимодействие PowerShell: управление целевой версией (PowerShell Core или Windows PowerShell); состояние кроссплатформенного удаленного взаимодействия
Этот вопрос с самоответом, посвященный Windows [1], рассматриваются следующие аспекты:
Теперь, когда существует две версии PowerShell - устаревшая Windows PowerShell только для Windows и кроссплатформенная оболочка PowerShell Core, обе можно установить на конкретном компьютере с Windows:
Как узнать, какая версия PowerShell будет выполнять удаленную команды, например через
Invoke-Command -ComputerName
?Как я могу настроить таргетинг на конкретную версию, как разовую, так и постоянную, с помощью конфигурации?
Примечание:
Чтобы выпуск можно было настроить для удаленного взаимодействия на данном компьютере, необходимо настроить его для удаленного взаимодействия:
Только Windows PowerShell будет автоматически настроен на ремоутинга, но только на серверах под управлением Windows Server 2012 или более поздней версии.
Начиная с версии 7, PowerShell Core еще не поставляется с Windows; если вы используете официальный установщик, вам предоставляется возможность включить удаленное взаимодействие во время установки.
В любом случае вы можете использовать Enable-PSRemoting
для (повторного) включения удаленного взаимодействия PowerShell по запросу, что:
должен запускаться из соответствующей редакции.
должен запускаться с правами администратора
[1] То есть вопрос касается удаленного взаимодействия на основе WinRM (WinRM - это специфичная для Windows реализация стандарта DTMF WSMan (WS-Management)).
Что касается межплатформенного удаленного взаимодействия с PowerShell Core:
Вы уже можете использовать удаленное взаимодействие на основе SSH на всех платформах:
Использование удаленного взаимодействия на основе SSH включает в себя в основном те же командлеты, что и удаленное взаимодействие на основе WinRM, хотя используемые параметры различаются; в частности, вы указываете целевой компьютер (ы) через
-HostName
параметр, а не-ComputerName
параметр.Ограничения (начиная с версии 7): "Удаленное взаимодействие на основе SSH в настоящее время не поддерживает конфигурацию удаленной конечной точки и достаточно администрирования (JEA)".
Для удаленного взаимодействия Unix -Windows (Unix относится к Unix-подобным платформам, таким как macOS и Linux), то есть удаленного взаимодействия с Windows-машиной с Unix-подобной машины, в качестве альтернативы можно использовать удаленное взаимодействие на основе WinRM с дополнительной конфигурацией:
На машине с Windows:
- SSL-соединения необходимо включить, настроив WinRM для HTTPS.
- Учетные записи пользователей, которые будут использоваться на Unix-подобных машинах, должны быть определены как локальные учетные записи пользователей в локальной группе администраторов - учетные записи домена не будут работать.
Unix-подобные машины должны использовать командлеты удаленного взаимодействия с
-Authentication Basic -UseSsl
параметры.
Реализация Unix WSMan на основе прорабатывается на в хранилище PSL-оми-провайдера, который уже позволяет Linux машины действовать как ремоутинга цели (то есть сервер компонент уже годный к употреблению - это не для меня ясно, может ли это быть установлен на macOS); однако на момент написания этой статьи клиентский компонент еще не готов к работе.
Как только клиентский клиентский компонент станет доступен, станет возможным равномерное межплатформенное удаленное взаимодействие на основе WSMan как между Unix-подобными машинами (Linux, macOS), так и между Unix-подобными машинами и машинами Windows.
1 ответ
Примечание. Рассматривается возможность изменения целевой удаленной конечной точки PowerShell [Core] по умолчанию - которая с версии 7.0 все еще является Window PowerShell - рассматривается: см. Эту проблему GitHub.
Это локально указанная конфигурация сеанса удаленного взаимодействия, которая определяет, какая редакция PowerShell и, возможно, версия будут использоваться на удаленном компьютере:
Специально вы можете использовать
-ConfigurationName
параметр командлетов удаленного взаимодействия, напримерInvoke-Command
,New-PSSession
, а такжеEnter-PSSession
чтобы явно указать конфигурацию сеанса.Постоянно, через конфигурацию, вы можете установить конфигурацию сеанса по умолчанию через
$PSSessionConfigurationName
переменная предпочтений (связанный раздел справки также обсуждает другие предпочтительные переменные, связанные с удаленным сеансом, а именно$PSSessionApplicationName
а также$PSSessionOption
)- По умолчанию клиенты подключаются к конфигурации сеанса
microsoft.powershell
на удаленной машине (см. ниже). Следовательно, вы можете в качестве альтернативы изменить определение этой конфигурации на удаленной целевой машине, но обратите внимание, что это означает, что все клиенты, которые используют значения по умолчанию, будут использовать переопределенную конфигурацию - см. Внизу, как добиться этого переопределения.
- По умолчанию клиенты подключаются к конфигурации сеанса
На целевом компьютере операции удаленного взаимодействия,Get-PSSessionConfiguration
командлет перечисляет все зарегистрированные конфигурации сеанса, которые клиенты могут использовать для подключения и которыми вы можете управлять с помощью Register-PSSessionConfiguration
а также Unregister-PSSessionConfiguration
:
Предостережение:
Get-PSSessionConfiguration
должен быть запущен в сеансе с повышенными привилегиями (как администратор), и из-за ошибки в Windows PowerShell 5.1 вам может потребоваться сначала выполнить следующую фиктивную команду:$null = Get-Command Test-WSMan
, чтобы гарантировать, чтоwsman:
диск определяется).Конфигурации сеанса, имена которых начинаются с префикса
'microsoft.powershell
' принадлежат Windows PowerShell.Префикс
'PowerShell.'
относится к PowerShell Core.
$PSSessionConfigurationName
по умолчанию 'http://schemas.microsoft.com/powershell/Microsoft.PowerShell'
в обоих выпусках, что означает, что Windows PowerShell по умолчанию нацелена на удаленные машины, даже если вы работаете из PowerShell Core:
В
Microsoft.PowerShell
часть относится к (64-разрядной) конфигурации сеанса Windows PowerShell, как указаноGet-PSSessionConfiguration
(строчными буквами).В
http://schemas.microsoft.com/powershell/
префикс не является обязательным и может быть опущен; обратите внимание, что использованиеhttps:
в префиксе не работает и автоматически не переключается на транспорт на основе SSL; для последнего требуется явная конфигурация. Обратите внимание, что удаленное взаимодействие на основе HTTPS/SSL не обязательно, если все ваше удаленное взаимодействие происходит в домене Windows.
Чтобы настроить таргетинг PowerShell Core (PowerShell v6+) на удаленном компьютере:
Как правило, конфигурации сеанса PowerShell Core зависят от версии, и у вас есть два варианта:
Нацельтесь на основную версию PowerShell Core - например,
PowerShell.7
- используя последнюю версию v7.x, установленную на целевой машине.- Это предпочтительнее, потому что ваш код не требует обновления каждый раз, когда вы устанавливаете исправление или обновление младшей версии на целевой машине.
Ориентируйтесь на конкретную версию, например
PowerShell.7.1.2
- Делайте это только в том случае, если у вас есть несколько параллельных установок с одной и той же основной версией, и вам явно нужно настроить таргетинг на одну из них.
Опять бег
Get-PSSessionConfiguration
на целевой машине из сеанса с повышенными привилегиями сообщает вам имена всех зарегистрированных конфигураций сеанса.
Чтобы настроить таргетинг на PowerShell Core ad hoc, используйте
-ConfigurationName PowerShell.7
, например:
# Connect to computer $comp and make it execute $PSVersionTable
# in PowerShell Core v7.x, which tells you what PowerShell edition
# and version is running.
Invoke-Command -ComputerName $comp -ConfigurationName PowerShell.7 { $PSVersionTable }
- Для постоянного нацеливания на PowerShell Core по умолчанию с заданного клиентского компьютера, добавьте в свой
$PROFILE
файл:
# When remoting, default to running PowerShell Core v7.x on the
# the target machines:
$PSSessionConfigurationName = 'PowerShell.7'
- Чтобы все клиенты данного удаленного серверного компьютера по умолчанию постоянно работали с PowerShell Core, необходимо переопределить серверный
microsoft.powershell
конфигурация сеанса, требующая прав администратора; вы можете адаптировать следующий фрагмент:
# Run WITH ELEVATION (as administrator) and
# ONLY IF YOU UNDERSTAND THE IMPLICATIONS.
$ErrorActionPreference = 'Stop'
# The configuration whose definition you want to make the new default.
$newDefaultConfigSource = 'PowerShell.7'
# Standard registry locations and names.
$defaultConfigName = 'Microsoft.PowerShell'
$configXmlValueName = 'ConfigXml'
$configRootKey = 'registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Plugin'
# Rename the current default configuration XML to "ConfigXml.OLD" to keep a backup.
Rename-ItemProperty $configRootKey\$defaultConfigName $configXmlValueName -NewName "$configXmlValueName.OLD"
# Get the configuration XML from the configuration that should become the new default.
# Modify it to replace the source configuration name with the default configuration name.
$xmlText = (Get-ItemPropertyValue $configRootKey\$newDefaultConfigSource $configXmlValueName) -replace
('\b{0}\b' -f [regex]::Escape($newDefaultConfigSource)), $defaultConfigName
# Save the modified XML as the default configuration's config XML.
Set-ItemProperty $configRootKey\$defaultConfigName $configXmlValueName $xmlText
# Restart the WinRM service for changes to take effect.
Restart-Service WinRM