Удаленное взаимодействие PowerShell: управление целевой версией (PowerShell Core или Windows PowerShell); состояние кроссплатформенного удаленного взаимодействия

Этот вопрос с самостоятельным ответом, посвященный Windows [1], касается следующих аспектов:

Теперь, когда существует две версии PowerShell - устаревшая, только для Windows Windows PowerShell и перекрестная -платформа PowerShell Core, оба могут быть установлены на данном компьютере с Windows:

  • Как узнать, какая версия PowerShell будет выполнять удаленные команды, например через Invoke-Command -ComputerName?

  • Как с помощью конфигурации настроить таргетинг на конкретную версию, как ad hoc, так и постоянно?

Примечание:

Чтобы выпуск можно было настраивать с помощью удаленного взаимодействия на данном компьютере, он должен быть настроить для удаленного взаимодействия:

  • Только Windows PowerShell автоматически настраивается для удаленного взаимодействия, но только на серверах под управлением Windows Server 2012 или новее.

  • Начиная с версии 7, PowerShell Core еще не поставляется с Windows; если вы используете официальный установщик, вам предоставляется возможность включить удаленное взаимодействие во время установки.

В любом случае вы можете использовать _ 2_, чтобы (повторно) включить удаленное взаимодействие 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 connections must be enabled by configuring WinRM for HTTPS.
      • Учетные записи пользователей, которые будут использоваться на Unix-подобных машинах, должны быть определены как локальные учетные записи пользователей в локальной группе администраторов - учетные записи домена работать не будут.
    • Unix-подобные машины должны использовать командлеты удаленного взаимодействия с параметрами -Authentication Basic -UseSsl.

    • См. about_Remote_Requirements

  • Реализация на основе WSMan для Unix разрабатывается в репозитории psl-omi-provider, который уже позволяет машинам Linux выступать в качестве целей удаленного взаимодействия (то есть компонент server уже можно использовать - мне не ясно, также может быть установлен на macOS); однако на момент написания этой статьи клиентский компонент еще не был готов к производству.
    Как только клиентский компонент станет доступен, станет возможным равномерное межплатформенное удаленное взаимодействие на основе WSMan, как между Unix-подобными машинами (Linux, macOS ) и между Unix-подобными машинами и машинами Windows.


person mklement0    schedule 04.10.2019    source источник


Ответы (1)


Примечание. Рассматривается возможность изменения целевой удаленной конечной точки PowerShell [Core] по умолчанию - которая с версии 7.0 все еще является Window PowerShell: см. этот выпуск GitHub.


Это локально указанная конфигурация сеанса удаленного взаимодействия, которая определяет, какая редакция PowerShell и, возможно, версия будут использоваться на удаленном компьютере:

  • Ad hoc, вы можете использовать -ConfigurationName параметр командлетов удаленного взаимодействия, таких как Invoke-Command, New-PSSession и Enter-PSSession, чтобы явно указать конфигурацию сеанса.

  • Постоянно, через конфигурацию, вы можете установить по умолчанию конфигурацию сеанса через $PSSessionConfigurationName предпочтительная переменная (связанный раздел справки также обсуждает другие удаленные -сессионные переменные предпочтений, а именно $PSSessionApplicationName и $PSSessionOption)

    • By default, clients connect to session configuration microsoft.powershell on the remote machine (see below). Therefore, you can alternatively change the definition of this configuration on the remote target machine, but note that this means that all clients that use the defaults will use the redefined configuration - see bottom for how to achieve this redefinition.

На целевом компьютере операции удаленного взаимодействия командлет 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 < / em>:

  • Часть 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, установленную на целевой машине.

      • This is preferable, because your code then doesn't require updating every time you install a patch or minor version update on the target machine.
    • Настройте таргетинг на конкретную версию - например, PowerShell.7.1.2

      • Do this only if you have multiple, side-by-side installations that share the same major version, and you explicitly need to target one of them.
    • Опять же, запуск 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
person mklement0    schedule 04.10.2019