выполнение powershell скрипта на удаленной машине
PowerShell Remoting — настройка и удаленное управление
Здесь минимум теории, в основном практическая часть. Описывается как настроить WinRM, как изменить профиль сетевого адаптера, дается скрипт по добавлению в TrustedHosts с фильтрацией, объясняется зачем нужны доверенные хосты, и рассматриваются поверхностно удаленные подключения так чтобы можно было сесть и сразу админить удаленные машины.
для проверки куда можно подключаться используем:
для разрешения подключаться ко всем
Если вы открываете доступ для всех указав * то WinRM будет подключаться ко ВСЕМ машинам без проверки. Помните, что вы открываете самого себя для потенциального взлома из локальной сети. Лучше указывать адреса хостов куда вам нужно подключится, тогда WinRM будет отклонять все остальные адреса или имена. Если машина с которой ведется управление находится в домене она будет доверять всем машинам этого домена. Если она не в домене, или в другом домене, то нужно указать в TrustedHosts адрес или имя машины на которую мы будем подключаться. Добавлять себя на машине к которой мы подключаемся не нужно.
в хелпе указаны команды, я их чуть чуть переделал в скрипт
он проверяет на есть ли такая запись, если нет то добавляет в список. Вызывать можно из командной строки указав адрес или имя.
Есть разница указывать имя или адрес. Если в TrustedHosts будет только адрес то открыть сессию по имени не получится, и наоборот — если указать имя то прицепится по адресу не получится. Учитывайте это.
Часто встречается ссылка на команду
это не тоже самое что Enable-PSRemoting
Enable-PSRemoting делает больше действий чем «winrm quickconfig». Командлет Set-WSManQuickConfig делает точно такие же действия как «winrm quickconfig». Enable-PSRemoting запускает Set-WSManQuickConfig когда ведет настройку системы
Удаленные подключения
1. Сессии 1-to-1
открываются командой
Вы получите оболочку на удаленной машине. Подключится можно к самому себе указав localhost. Альтернативные кредиталы указываются с параметром -Credential, выход происходит командлетом Exit-PSSession
Комментарий.
объекты переданные по сети обрезаются и перестают быть живыми. У них удаляются методы, свойства остаются. Вытащить объект на свою машину, поколдовать и засунуть обратно не получится. Если нужно больше пишите, допишу отдельно.
определяем что будем исполнять так:
передаем на удаленные машины Test1 и Test2
Запомним что на той стороне будет новый скоп, так что ваш скрипт не получит значений из вашей консоли, а переменные скрипта могут оказаться на той стороне пустыми. Поэтому передавайте сразу целиком готовые инструкции и скрипты с параметрами.
для полноценного использования Invoke-Command надо уметь превращать строки в скрипт блоки. Например у вас есть команды которые зависят от какогото списка, вам нужно сгенерировать строку, превратить ее в ScriptBlock и отправить на удаленный комп:
kuda78
В статье пропущен очень важный момент — передача параметров в скрипт на удаленной машине.
$deployRemote = <
param(
[string]$targetEnvName,
[string]$targetUsername)
$Global:ErrorActionPreference = «Stop»
#…
>
3. Сессии
Это когда с той стороны создается копия пошика постоянно висящая в памяти, и в нее отправляются команды. Как результат к ней можно переподключится, ченить долгое запустить на исполнение, цепляться из разных скриптов или разными юзерами. Например у вас есть набор скриптов решающих одну задачу по частям, каждый из них поочереди может подключатся к одной удаленной сессии, видеть результаты работы предыдущих команд, иметь одни загруженные модули, общие переменные, общее окружение, до тех пор пока сессия не будет принудительно закрыта.
Создание сессии происходит командлетом New-PSSession, результат можно поместить в переменную
использовать можно такие же параметры подключения как в Invoke-Command
Как использовать:
если 1-to-1
посмотреть какие сессии открыты можно с помощью Get-PSSession, закрыть Remove-PSSession
закрыть вообще все сессии
прицепится к сессии можно с помощью Connect-PSSession, отключиться через Disconnect-PSSession
Сессии имеют очень много настроек, возможно даже создание сессий с обрезаным набором команд, модулей и т.п. Называется custom endpoints
Удаленное управление через Powershell
В Powershell есть несколько методов удаленного подключения. Это через:
Этот командлет устанавливает сессию c удаленным компьютером и мы сможем работать прям на нем. Если сравнивать с Linux, то это почти одно и то же:
И второй командлет, который нужен для удаленного выполнения команд как на одном, так и сотни компьютеров:
Если опять же сравнить с Linux ssh, то это почти одно и то же:
Как настроить удаленное управление через Powershell?
Для того что бы суметь настроить нужно понять как это работает. Команды выше могут работать по протоколу HTTP (по порту 5985) и HTTPS (5986), за исключением версии Powershell 1.0, который работал в XP (там порт 80/443). По умолчанию у нас стоит HTTP, но и эти данные шифруются используя симметричный ключ AES-256. Сама аутентификация работает в 2 режимах NTLM и Kerberos(по умолчанию стоит он). Если у вас сеть с домен контроллером, т.е. есть Kerberos, то у вас должны работать команды выше. Если компьютеры в Workgroup, то они используют NTLM и для этого нужна дополнительная настройка. Кроме того, если вы вместо имен используете IP, то вы в любом случае используете NTLM и это по умолчанию не работает.
Если у вас не работают команды выше нужно проверить запущен ли сервис WinRM на том компьютере, к которому мы хотим подключиться:
В этом случае мы ставим запуск сервиса автоматически и настраиваем winrm в дефолтной конфигурации. Этот сервис дает возможность принимать команды Powershell и устанавливать сеансы.
Если вы работаете под профилем сети «Public» (не «Domain» или «Private»), то нужно выполнить еще один командлет, разрешающий работать в таких сетях:
Если мы выполним такую команду:
Получим ошибку:
Connecting to remote server 192.168.3.100 failed with the following error message : The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: the transport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided.
Которая говорит, что мы можем подключится по IP если используем HTTPS (для этого нужен сертификат) или добавить хост, к которому подключаемся в TrustedHost компьютера с которого хотим запустить команду. Для этого делаем:
После этого все будет работать, но команды должны исполняться с переменной, в которой будут лежать учетные данные пользователя. Т.е. так:
Так же отмечу, что все команды, которые мы запускаем для удаленного выполнения через Poweshell, должны происходить от члена группы Администратора того хоста, к которому мы подключаемся.
Теперь мы можем устанавливать множество сессий с помощью командлета:
Получать ID этих сессий:
И подключаться по этим ID:
Или использовать с invoke существующую сессию, а командлет для удаленного компьютера запускать с файла:
Или же использовать методы описанные выше.
Дополнительные ключи мы можем узнать по командлетам:
Удаленное взаимодействие с PowerShell через SSH
Обзор
Функция удаленного взаимодействия PowerShell обычно использует WinRM для согласования соединения и передачи данных. Теперь протокол SSH доступен на платформах Linux и Windows, что позволяет осуществлять многоплатформенное удаленное взаимодействие с PowerShell.
Служба удаленного управления Windows обеспечивает надежную модель поддержки удаленных сеансов PowerShell. Удаленное взаимодействие по протоколу SSH сейчас не поддерживает настройку удаленных конечных точек и функцию JEA (Just Enough Administration).
Удаленное взаимодействие по SSH позволяет осуществлять базовое удаленное взаимодействие между компьютерами с Windows и Linux в рамках сеансов PowerShell. Функция удаленного взаимодействия по SSH создает хост-процесс PowerShell на целевом компьютере в качестве подсистемы SSH. Со временем для поддержки настройки удаленных конечных точек и функции JEA мы реализуем общую модель размещения, похожую на службе удаленного управления Windows.
Чтобы создать удаленный сеанс, укажите целевой компьютер с помощью параметра HostName и имя пользователя с помощью параметра UserName. При интерактивном выполнении командлетов отображается запрос на ввод пароля. Вы также можете использовать проверку подлинности ключа SSH с помощью файла закрытого ключа с параметром KeyFilePath. Способ создания ключей для проверки подлинности по протоколу SSH зависит от платформы.
Общие сведения об установке
PowerShell 6 или более поздней версии, и на всех компьютерах должен быть установлен SSH. Установите клиент ( ssh.exe ) и сервер ( sshd.exe ) SSH, чтобы осуществлять удаленное взаимодействие между компьютерами. Решение OpenSSH для Windows теперь доступно в Windows 10 сборки 1809 и Windows Server 2019. Дополнительные сведения см. в статье Управление Windows через OpenSSH. В Linux нужно реализовать поддержку SSH (включая установку сервера sshd) в соответствии с используемой платформой. Также для поддержки удаленного взаимодействия по SSH нужно установить PowerShell с сайта GitHub. Для сервера SSH нужно настроить возможность создать подсистему SSH для размещения процесса PowerShell на удаленном компьютере. Также нужно активировать проверку подлинности на основе пароля или ключа.
Настройка на компьютере с Windows
Установите последнюю версию PowerShell. Дополнительные сведения см. в статье Установка PowerShell Core в Windows.
Установите последнюю версию Win32 OpenSSH. Инструкции по установке см. в разделе Начало работы с OpenSSH.
Если вы хотите задать PowerShell в качестве оболочки по умолчанию для OpenSSH, см. раздел Настройка Windows для OpenSSH.
Включите проверку подлинности с помощью пароля:
Создайте подсистему SSH, в которой размещается процесс PowerShell на удаленном компьютере:
Расположение исполняемого файла PowerShell по умолчанию — c:/progra
Необходимо использовать краткое имя 8.3 для всех путей к файлам, содержащим пробелы. В OpenSSH для Windows обнаружена ошибка, блокирующая работу пробелов в путях к исполняемым файлам подсистемы. См. дополнительные сведения на сайте GitHub.
Обычно краткое имя 8.3 для папки Program Files в Windows — это Progra
При необходимости включите проверку подлинности на основе ключа:
Дополнительные сведения см. в статье Управление ключами OpenSSH.
Перезапустите службу sshd.
Настройка на компьютере с Ubuntu 16.04 Linux
Установите последнюю версию PowerShell, см. раздел Установка PowerShell Core в Linux.
Включите проверку подлинности с помощью пароля:
При необходимости включите проверку подлинности на основе ключа:
Дополнительные сведения о создании ключей SSH в Ubuntu см. на странице справки по ssh-keygen.
Добавьте запись подсистемы PowerShell:
Перезапустите службу ssh.
Настройка на компьютере с macOS
Установите последнюю версию PowerShell. Дополнительные сведения см. в статье Установка PowerShell Core в macOS.
Убедитесь, что удаленное взаимодействие SSH включено, выполните следующие действия:
Используйте текстовый редактор, например nano:
Включите проверку подлинности с помощью пароля:
Добавьте запись подсистемы PowerShell:
При необходимости включите проверку подлинности на основе ключа:
Перезапустите службу sshd.
Аутентификация
При удаленном взаимодействии с PowerShell через SSH используется обмен данными для проверки подлинности между клиентом SSH и службой SSH. Схемы проверки подлинности в его рамках не реализуются. Это означает, что любые настроенные схемы проверки подлинности, включая многофакторную проверку подлинности, обрабатываются протоколом SSH независимо от PowerShell. Например, в службе SSH можно настроить обязательное применение проверки подлинности на основе открытых ключей, а также разовых паролей для усиления безопасности. Настройка многофакторной проверки подлинности выходит за рамки настоящего документа. Сведения о том, как правильно настроить многофакторную проверку подлинности и проверить ее работу вне PowerShell, прежде чем пытаться использовать ее для удаленного взаимодействия с PowerShell, см. в документации по SSH.
Пользователи сохраняют те же привилегии в удаленных сеансах. Это означает, что администраторы имеют доступ к оболочке с повышенными правами, а обычные пользователи — нет.
Пример удаленного взаимодействия PowerShell
Проще всего проверить удаленное взаимодействие на одном компьютере. В этом примере мы создадим удаленный сеанс с одним и тем же компьютером Linux. Командлеты PowerShell мы выполняем в интерактивном режиме, поэтому мы увидим запрос от SSH на проверку удаленного компьютера, а также запрос на ввод пароля. Чтобы убедиться, что удаленное взаимодействие работает, те же операции можно выполнить на компьютере Windows. Затем установите удаленное подключение между компьютерами, изменив имя узла.
Ограничения
Команда sudo не работает в рамках сеанса удаленного взаимодействия с компьютером Linux.
До PowerShell 7.1 удаленное взаимодействие по SSH не поддерживало удаленные сеансы со вторым прыжком. Эта возможность была ограничена сеансами через WinRM. PowerShell 7.1 позволяет Enter-PSSession и Enter-PSHostProcess работать в любом интерактивном удаленном сеансе.
PowerShell: используем Invoke-Command для запуска команд/скриптов на удаленных компьютерах
В этой статье мы рассмотрим особенности использования командлета Invoke-Command для удаленного выполнения команд и скриптов. Возможно запускать команды удаленно на одном компьютере, или параллельно на множестве компьютерах в вашей сети. Командлет Invoke-Command использует возможности удаленного управления, заложенные в PowerShell Remoting. PowerShell Remoting позволяет удаленно подключаться к PowerShell сессиям на компьютерах через службу WinRM (Windows Remote Management) через протокол Web Services for Management (WS-Management). Этот сервис дает возможность принимать команды Powershell и устанавливать сеансы.
Настройка WinRM для PowerShell Remoting
Для связи между компьютерами в PowerShell Remoting используется протокол HTTP (порт TCP/5985) или HTTPS (порт TCP/5986). По умолчанию используется протокол HTTP, но даже этот трафик шифруется с помощью ключа AES-256 (впрочем, есть угроза атак man-in-the middle). Возможна аутентификация через Kerberos (в домене) или NTLM.
На удаленных компьютерах, к которым вы планируете подключаться должен быть запущена служба WinRM. Проверить это можно так:
Если служба не запущена, запустите ее:
Данная команда запустит службу WinRM (установит автоматический запуск), выставит настройки winrm по-умолчанию и добавит исключение в Windows Firewall. Команда Enable-PSRemoting –Force включает WinRM без запроса пользователя.
Теперь к компьютеру можно подключиться удаленно через PowerShell Remoting.
Также нужно включить правило Window Defender Firewall, которое разрешает доступ к WinRM в общедоступных сетях. Вы можете включить правило брандмауэра с помощью GPO или PowerShell:
Чтобы проверить подключение к удаленному компьютер через PowerShell Remoting используется команда:
Если у вас нет домена, или вы обращаетесь к компьютерам через PowerShell Remoting по IP адресам, в этом случае используется для аутентификации используется протокол NTLM. При использовании NTLM, при выполнении команду Invoke-Command появится ошибка:
Для корректной работы NTLM аутентификации, на компьютере, с которого вы будете устанавливать подключения нужно выполнить дополнительные действия: выпустить SSL сертификат и исопльзовать его для шифрования HTTPS трафика winrm, или добавить имя/IP адрес хоста в доверенные:
Либо можно разрешить подключение ко все компьютерам (не рекомендуется, т.к. один из главных недостатков NTLM – он не осуществляет проверку подлинности).
Аналогичные настройки нужно сделать на удаленных хостах.
Чтобы вывести список доверенных хостов, выполните команду:
Чтобы применить изменения, перезапустите службу WinRM:
Удаленное выполнение PowerShell с помощью Invoke-Command
Командлет Invoke-Command позволяет выполнить команду на одном или нескольких удаленных компьютерах.
Например, для запуска одиночной команды на удаленном компьютере можно использовать такую команду:
По-умолчанию команда, посланная через Invoke-Command выполняется на удалённом компьютере от текущего пользователя. Если нужно выполнить команду от имени другого пользователя, сначала нужно запросить учетные данные пользователя и сохранить их в переменную:
Можно задать несколько команд в блоке ScriptBlock, их нужно разделить точкой с запятой. Например следующая команда выведет текущий часовой пояс и изменит его на другой:
Используем Invoke-Command для параллельного запуска команд на нескольких компьютерах
Командлет Invoke-Command можно использовать для параллельного выполнения команд на нескольких удаленных компьютерах.
В самом просто случае имена компьютеров, на которых нужно выполнить команды указываются через запятую:
Список компьютеров можно поместить в переменную (массив):
Или получить из текстового файла:
Также можно получить список компьютеров в ADс помощью командлета Get-ADComputer из модуля AD PowerShell:
Чтобы выполнить команду на всех Windows Server в домене, исопльзуйте такой код:
Если компьютер выключен, или недоступен, благодаря параметру SilentlyContinue скрипт не будет остановлен и продолжит выполнение на других компьютерах.
Чтобы понять с какого компьютера получены результаты, нужно использовать специальную переменную окружения PSComputerName.
При запуске команды через Invoke-Command на нескольких компьютерах она выполняется параллельно. В Invoke-Command есть ограничение на максимальное количество компьютеров, которыми можно управлять одновременно (ограничение на количество одновременных PSSession). Оно определяется параметром ThrottleLimit (по умолчанию 32). Если вам нужно выполнить команду одновременно более чем на 32 компьютерах (например, на 128), используйте параметр –ThrottleLimit 128 (но это вызывает повышенную нагрузку на ваш компьютер).
Если вы хотите запускать команды на удаленном компьютере интерактивно, используйте командлет Enter-PSSession.
Как запустить скрипт PowerShell на удаленном компьютере👨⚕️
Функциональность удаленного выполнения команд в PowerShell называется PowerShell Remoting (появилась в PowerShell 2.0) и основана на возможностях протокола Web Services for Management (WS-Management). С PowerShell Remoting вы можете запускать команды на одном или нескольких удаленных компьютерах. Вы можете использовать интерактивный режим сеанса с удаленными компьютерами, временным или постоянным соединением. В этой статье мы рассмотрим несколько примеров использования PowerShell для запуска сценария на удаленном компьютере.
Для удаленного подключения к компьютеру через PowerShell на нем должна быть включена и настроена WinRM (служба удаленного управления Windows) (по умолчанию она отключена). Связь между компьютерами осуществляется по протоколам HTTP или HTTPS, а весь сетевой трафик между компьютерами зашифрован. Вы можете использовать NTLM и Kerberos для аутентификации на удаленном компьютере.
Чтобы проверить состояние службы WinRM, выполните следующую команду:
Как видите, служба WS-Management работает.
Чтобы интерактивно подключиться к удаленному компьютеру Server1 через PowerShell, выполните следующую команду:
Представление CLI PoSh изменится.
В начале строки будет указано имя удаленного компьютера, к которому вы подключены через WinRM.
После того как сеанс установлен, все команды, которые вводятся в консоли PowerShell, выполняются на удаленном компьютере.
PS Remoting работает следующим образом: команды, введенные на локальном компьютере, передаются на удаленный компьютер и выполняются там, затем результат передается обратно.
Поскольку все команды выполняются локально, нет необходимости беспокоиться о совместимости с версией и модулями PoSh.
Для завершения интерактивного сеанса выполните команду:
Только простые задачи удаленного управления обычно выполняются на компьютерах в интерактивном режиме.
Чтобы выполнить сложную команду или запустить скрипт PowerShell удаленно, используйте командлет Invoke-Command.
Следующая команда создаст удаленное соединение с компьютером Server1 и запустит блок команд, указанный в параметре ScriptBlock. После этого удаленный сеанс автоматически закроется.
PowerShell позволяет запускать локальные скрипты PS1 на удаленных компьютерах.
Основным преимуществом этого способа запуска скриптов PowerShell является то, что вам не нужно копировать файл скрипта на удаленные компьютеры.
Вы можете использовать не только локальный скрипт, но также скрипт PS в общей сетевой папке, доступ к которой можно получить с локального компьютера.
Вы можете сохранить список компьютеров в текстовом файле и удаленно выполнить скрипт PS на всех компьютерах:
По умолчанию он отправляет скрипт PS1 одновременно 32 удаленным компьютерам из списка.
Если имеется более 32 компьютеров, то PoSh отслеживает состояние выполнения скриптов на первых 32 компьютерах, а если скрипт завершен, команда выполняется на следующем компьютере.
С параметром ThrottleLimit вы можете увеличить этот предел, но будьте осторожны, чтобы не перегружать вашу сеть.