Удаленное взаимодействие 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 параметры.

    • См. About_Remote_Requirements

  • Реализация 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
Другие вопросы по тегам