Подключение Powershell к удаленному компьютеру
Обновлено: 21.11.2024
Локальный запуск команд на удаленных компьютерах — обычная задача, которую многие ИТ-администраторы должны выполнять каждый день. Вот как это можно сделать в PowerShell.
Иногда недостаточно использовать DCOM, RPC и другие удаленные протоколы для выполнения задач на удаленных компьютерах. Для запуска команд на реальном удаленном компьютере требуется другой подход. Администратор должен создать какой-либо сеанс и отправлять команды по сети, которые затем используются удаленным компьютером.
Поскольку это статья о PowerShell, а не о telnet (вы же не используете telnet, не так ли?), мы будем придерживаться технологии под названием PowerShell Remoting. PowerShell Remoting — это функция PowerShell, представленная в Windows PowerShell v2. Это позволяет пользователям открывать, управлять и закрывать сеансы на удаленных компьютерах и взаимодействовать с ними так же, как если бы они сидели на локальной консоли.
Предполагая, что на удаленном компьютере включено удаленное взаимодействие PowerShell, давайте сначала попробуем выполнить простые команды на удаленном компьютере. В качестве теста, чтобы убедиться, что код работает на удаленном компьютере, я всегда предпочитаю использовать команду hostname, которая возвращает имя компьютера.
Существует два способа запуска удаленных команд через PowerShell Remoting; мы можем выдавать команды в интерактивном или неинтерактивном режиме. Интерактивно означает, что нам нужно находиться за нашим компьютером, чтобы физически запускать команды. Начнем с неинтерактивного примера.
Чтобы запускать удаленные команды не в интерактивном режиме, мы используем команду Invoke-Command. Эта команда имеет параметр ComputerName, который позволяет нам указать компьютер для запуска команды. У нас также есть параметр ScriptBlock, в котором мы будем инкапсулировать команды, которые собираемся запускать на удаленном компьютере. Ниже вы можете увидеть, как это работает в действии. Я запускаю команду hostname локально на своем компьютере, а затем запускаю ее удаленно с помощью Invoke-Command. Вы можете видеть, что он возвращает разные результаты.
Теперь вы запустили свою первую удаленную команду! Что угодно может войти в параметр ScriptBlock. Ниже я создаю оператор if/then внутри $scriptblock в качестве теста, чтобы убедиться, что код работает удаленно.
Возможно, вы не заметили, но команда Invoke-Command создала упрощенный сеанс в фоновом режиме для запуска этой команды, а когда команда была завершена, она разрушила его. Это более очевидно, когда вы выбираете интерактивный запуск команд с помощью команды Enter-PSSession.
Команда Enter-PSSession позволяет войти в удаленный сеанс, выполнять команды, получать выходные данные и работать так же, как если бы вы вводили команды в локальной консоли. Однако для этого сначала необходимо установить сеанс. Один из способов сделать это — использовать параметр ComputerName. Обратите внимание, что я вошел в удаленный сеанс и получил новое приглашение PowerShell, которому предшествует имя компьютера, на котором выполняется сеанс.
С этого момента я могу запускать любые команды, которые захочу, и они будут выполняться на удаленном компьютере. Нам не нужно использовать Invoke-Command для этого. Мы просто запускаем команды как есть. Когда мы закончим, мы должны закрыть сессию. Для этого мы используем ключевое слово exit, которое отключает нас от сеанса и закрывает его.
Вы можете видеть ниже, как только мы вводим exit и нажимаем Enter, мы немедленно возвращаемся к нашей локальной консоли.
Удаленное взаимодействие PowerShell — это удобный способ выполнения команд на удаленных компьютерах. Пока удаленный компьютер настроен для удаленного взаимодействия PowerShell, что является одноразовой настройкой, на клиентском компьютере требуется минимальная настройка, если она вообще требуется, чтобы это работало. Особенно, если в среде Active Directory этот процесс не вызывает затруднений, и это отличный способ избежать необходимости лазить по всему офису только для того, чтобы запускать сценарии и команды на всех ваших компьютерах! Не останавливайтесь здесь; прочтите нашу электронную книгу «Как автоматизировать использование PowerShell», чтобы узнать о других хитростях PowerShell.
Крис Хоффман
Крис Хоффман
Главный редактор
Крис Хоффман – главный редактор How-To Geek. Он писал о технологиях более десяти лет и два года был обозревателем PCWorld. Крис писал для The New York Times, давал интервью в качестве эксперта по технологиям на телевизионных станциях, таких как NBC 6 в Майами, и освещал свою работу в таких новостных агентствах, как BBC.С 2011 года Крис написал более 2000 статей, которые были прочитаны почти миллиард раз — и это только здесь, в How-To Geek. Подробнее.
Удаленное взаимодействие с PowerShell позволяет запускать команды PowerShell или получать доступ к полным сеансам PowerShell в удаленных системах Windows. Это похоже на SSH для доступа к удаленным терминалам в других операционных системах.
PowerShell по умолчанию заблокирован, поэтому перед его использованием необходимо включить PowerShell Remoting. Этот процесс настройки немного сложнее, если вы используете рабочую группу вместо домена (например, в домашней сети), но мы пошагово пошагово рассмотрим его.
Включите удаленное взаимодействие PowerShell на ПК, к которому вы хотите получить удаленный доступ
Ваш первый шаг — включить удаленное взаимодействие PowerShell на ПК, к которому вы хотите установить удаленные подключения. На этом ПК вам потребуется открыть PowerShell с правами администратора.
В Windows 10 нажмите Windows+X, а затем выберите PowerShell (Администратор) в меню опытных пользователей.
В Windows 7 или 8 нажмите "Пуск" и введите "powershell". Щелкните результат правой кнопкой мыши и выберите «Запуск от имени администратора».
В окне PowerShell введите следующий командлет (имя PowerShell для команды) и нажмите Enter:
Эта команда запускает службу WinRM, настраивает ее на автоматический запуск вместе с вашей системой и создает правило брандмауэра, разрешающее входящие подключения. Часть командлета -Force указывает PowerShell выполнять эти действия, не запрашивая у вас каждый шаг.
Если ваши компьютеры являются частью домена, это все, что вам нужно сделать. Вы можете перейти к тестированию соединения. Если ваши компьютеры входят в рабочую группу (а они, вероятно, находятся в домашней сети или сети малого бизнеса), у вас будет немного больше работы по настройке.
Примечание. Успех настройки удаленного взаимодействия в среде домена полностью зависит от настройки вашей сети. Удаленное взаимодействие может быть отключено или даже включено автоматически с помощью групповой политики, настроенной администратором. У вас также может не быть разрешений, необходимых для запуска PowerShell в качестве администратора. Как всегда, проконсультируйтесь со своими администраторами, прежде чем пытаться сделать что-то подобное. У них могут быть веские причины не разрешать практику, или они могут захотеть настроить ее для вас.
Настройте рабочую группу
Если ваши компьютеры не входят в домен, вам нужно выполнить еще несколько шагов, чтобы все настроить. Вы уже должны были включить удаленное взаимодействие на ПК, к которому хотите подключиться, как мы описали в предыдущем разделе.
Примечание. Чтобы удаленное взаимодействие PowerShell работало в среде рабочей группы, вы должны настроить свою сеть как частную, а не общедоступную сеть. Чтобы узнать больше о разнице и о том, как перейти на частную сеть, если у вас уже настроена общедоступная сеть, ознакомьтесь с нашим руководством по частным и общедоступным сетям.
Затем вам нужно настроить параметр TrustedHosts как на компьютере, к которому вы хотите подключиться, и на компьютере (или компьютерах), с которого вы хотите подключиться, чтобы компьютеры доверяли друг другу. Вы можете сделать это одним из двух способов.
Если вы находитесь в домашней сети и хотите доверить удаленное подключение любому компьютеру, вы можете ввести следующий командлет в PowerShell (опять же, вам нужно будет запустить его от имени администратора).
Звездочка – это подстановочный знак для всех ПК. Если вместо этого вы хотите ограничить компьютеры, которые могут подключаться, вы можете заменить звездочку списком IP-адресов или имен компьютеров, разделенных запятыми, для утвержденных ПК.
После выполнения этой команды вам потребуется перезапустить службу WinRM, чтобы новые настройки вступили в силу. Введите следующий командлет и нажмите Enter:
И помните, вам нужно будет запустить эти два командлета на компьютере, к которому вы хотите подключиться, а также на любых компьютерах, с которых вы хотите подключиться.
Проверка соединения
Теперь, когда вы настроили свои компьютеры для удаленного взаимодействия PowerShell, пришло время проверить соединение. На ПК, с которого вы хотите получить доступ к удаленной системе, введите следующий командлет в PowerShell (заменив «КОМПЬЮТЕР» на имя или IP-адрес удаленного ПК), а затем нажмите Enter:
Эта простая команда проверяет, запущена ли служба WinRM на удаленном ПК.Если он завершится успешно, вы увидите в окне информацию о службе WinRM на удаленном компьютере, что означает, что WinRM включен и ваш компьютер может обмениваться данными. Если команда не удалась, вместо этого вы увидите сообщение об ошибке.
Выполнить одну удаленную команду
Чтобы запустить команду в удаленной системе, используйте командлет Invoke-Command со следующим синтаксисом:
«КОМПЬЮТЕР» представляет собой имя или IP-адрес удаленного ПК. «КОМАНДА» — это команда, которую вы хотите запустить. «ИМЯ ПОЛЬЗОВАТЕЛЯ» — это имя пользователя, под которым вы хотите запустить команду на удаленном компьютере. Вам будет предложено ввести пароль для имени пользователя.
Вот пример. Я хочу просмотреть содержимое каталога C:\ на удаленном компьютере с IP-адресом 10.0.0.22. Я хочу использовать имя пользователя «wjgle», поэтому я бы использовал следующую команду:
Начать удаленный сеанс
Если у вас есть несколько командлетов, которые вы хотите запустить на удаленном ПК, вместо повторного ввода командлета Invoke-Command и удаленного IP-адреса вы можете запустить удаленный сеанс. Просто введите следующий командлет и нажмите Enter:
Снова замените «КОМПЬЮТЕР» на имя или IP-адрес удаленного ПК и замените «ПОЛЬЗОВАТЕЛЬ» на имя учетной записи пользователя, которую вы хотите вызвать.
Ваш запрос изменится, чтобы указать удаленный компьютер, к которому вы подключены, и вы можете выполнить любое количество командлетов PowerShell непосредственно в удаленной системе.
- › Как проверить, включена ли безопасная загрузка на вашем ПК
- ›5 шрифтов, которые следует прекратить использовать (и лучшие альтернативы)
- › Как установить Google Play Маркет в Windows 11
- › Что означает XD и как вы его используете?
- › Почему прозрачные чехлы для телефонов желтеют?
- › Как восстановить метки панели задач в Windows 11
- › Худшее, что есть в телефонах Samsung, — это программное обеспечение Samsung.
В PowerShell есть много разных способов запуска команд на удаленных компьютерах. В предыдущей главе вы увидели, как удаленно запрашивать WMI с помощью командлетов CIM. PowerShell также включает несколько командлетов со встроенным параметром ComputerName.
Как показано в следующем примере, Get-Command можно использовать с параметром ParameterName, чтобы определить, какие команды имеют параметр ComputerName.
Команды, такие как Get-Process и Get-Hotfix, имеют параметр ComputerName. Это не то долгосрочное направление, в котором Microsoft движется к запуску команд на удаленных компьютерах. Даже если вы найдете команду с параметром ComputerName, есть вероятность, что вам потребуется указать альтернативные учетные данные, и у нее не будет параметра Credential. А если вы решили запустить PowerShell из учетной записи с повышенными правами, брандмауэр между вами и удаленным компьютером может заблокировать запрос.
Чтобы использовать команды удаленного взаимодействия PowerShell, которые демонстрируются в этой главе, на удаленном компьютере должно быть включено удаленное взаимодействие PowerShell. Используйте командлет Enable-PSRemoting, чтобы включить удаленное взаимодействие PowerShell.
Удаленное взаимодействие один на один
Если вы хотите, чтобы ваш удаленный сеанс был интерактивным, то удаленное взаимодействие один на один — это то, что вам нужно. Этот тип удаленного взаимодействия предоставляется с помощью командлета Enter-PSSession.
В предыдущей главе я сохранил свои учетные данные администратора домена в переменной с именем $Cred . Если вы еще этого не сделали, сохраните учетные данные администратора домена в переменной $Cred.
Это позволяет вам ввести учетные данные один раз и использовать их для каждой команды, пока ваш текущий сеанс PowerShell активен.
Создайте индивидуальный сеанс удаленного взаимодействия PowerShell с контроллером домена с именем dc01.
Обратите внимание, что в предыдущем примере приглашению PowerShell предшествует [dc01] . Это означает, что вы находитесь в интерактивном сеансе PowerShell с удаленным компьютером с именем dc01. Любые выполняемые вами команды выполняются на dc01, а не на вашем локальном компьютере. Кроме того, имейте в виду, что у вас есть доступ только к командам PowerShell, которые существуют на удаленном компьютере, а не на вашем локальном компьютере. Другими словами, если вы установили на свой компьютер дополнительные модули, они недоступны на удаленном компьютере.
Когда вы подключаетесь к удаленному компьютеру с помощью индивидуального интерактивного сеанса удаленного взаимодействия PowerShell, вы фактически сидите за удаленным компьютером. Это обычные объекты, такие же, как те, с которыми вы работали на протяжении всей книги.
После завершения работы с удаленным компьютером выйдите из сеанса удаленного взаимодействия один на один с помощью командлета Exit-PSSession.
Удаленное взаимодействие "один ко многим"
Иногда вам может потребоваться выполнить задачу в интерактивном режиме на удаленном компьютере. Но удаленное взаимодействие гораздо эффективнее при одновременном выполнении задачи на нескольких удаленных компьютерах. Используйте командлет Invoke-Command для одновременного выполнения команды на одном или нескольких удаленных компьютерах.
В предыдущем примере был запрошен статус службы времени Windows на трех серверах. Командлет Get-Service был размещен внутри блока сценария Invoke-Command. Get-Service фактически запускается на удаленном компьютере, а результаты возвращаются на локальный компьютер в виде десериализованных объектов.
Передача предыдущей команды в Get-Member показывает, что результаты действительно являются десериализованными объектами.
Обратите внимание, что в десериализованных объектах отсутствует большинство методов. Это означает, что они не живые объекты; они инертны. Вы не можете запустить или остановить службу с помощью десериализованного объекта, поскольку это моментальный снимок состояния этого объекта в момент выполнения команды на удаленном компьютере.
Это не означает, что вы не можете запустить или остановить службу, используя метод с Invoke-Command. Это просто означает, что метод должен вызываться в удаленном сеансе.
Я остановлю службу времени Windows на всех трех удаленных серверах, используя метод Stop(), чтобы доказать это.
Как упоминалось в предыдущей главе, если для выполнения задачи существует командлет, я рекомендую использовать его, а не метод. В предыдущем сценарии я рекомендую использовать командлет Stop-Service вместо метода остановки. Я решил использовать метод Stop(), чтобы доказать свою точку зрения, поскольку многие люди ошибочно полагают, что методы нельзя вызывать при использовании удаленного взаимодействия PowerShell. Их нельзя вызывать для возвращаемого объекта, поскольку он десериализован, но их можно вызывать в самом удаленном сеансе.
Сеансы PowerShell
В последнем примере из предыдущего раздела я выполнил две команды с помощью командлета Invoke-Command. Это означает, что для запуска этих двух команд нужно было установить и отключить два отдельных сеанса.
Подобно сеансам CIM, описанным в главе 7, сеанс PowerShell с удаленным компьютером можно использовать для выполнения нескольких команд на удаленном компьютере без накладных расходов на новый сеанс для каждой отдельной команды.
Создайте сеанс PowerShell для каждого из трех компьютеров, с которыми мы работали в этой главе: DC01, SQL02 и WEB01.
Теперь используйте переменную с именем $Session, чтобы запустить службу времени Windows с помощью метода и проверить состояние службы.
После создания сеанса с использованием альтернативных учетных данных больше нет необходимости указывать учетные данные при каждом запуске команды.
После завершения использования сеансов обязательно удалите их.
Обзор
В этой главе вы узнали об удаленном взаимодействии PowerShell, о том, как выполнять команды в интерактивном сеансе с одним удаленным компьютером и как запускать команды на нескольких компьютерах с помощью удаленного взаимодействия "один ко многим". Вы также узнали о преимуществах использования сеанса PowerShell при выполнении нескольких команд на одном и том же удаленном компьютере.
Вы можете использовать удаленное взаимодействие PowerShell (появившееся в PowerShell 2.0) для запуска команд на одном или нескольких удаленных компьютерах. PS Remoting основан на протоколе веб-служб для управления (WS-Management). Вы можете использовать режим интерактивного сеанса удаленного взаимодействия PS, временное или постоянное подключение к удаленному компьютеру. В этой статье мы рассмотрим несколько примеров удаленного выполнения сценария PowerShell.
Настройка WinRM для удаленного взаимодействия PowerShell
Чтобы проверить состояние службы WinRM, выполните команду Get-service:
Как видите, служба WS-Management запущена.
Если служба WinRM не запущена, необходимо включить ее на удаленном компьютере с помощью команды:
Эта команда подготавливает компьютер к удаленному управлению: запускает службу WinRM, изменяет тип запуска на автоматический и добавляет необходимые исключения в брандмауэр Защитника Windows.
Вы можете включить правила Защитника Windows из графической консоли или с помощью PowerShell:
Если удаленный компьютер находится в рабочей группе (не присоединен к домену Active Directory) и к нему применяется общедоступный сетевой профиль (вместо доменного или частного), необходимо явно разрешить входящий трафик WinRM в брандмауэре Windows:
Для проверки подключения к удаленному серверу через WinRM используйте следующую команду:
Если вы получили ответ, удаленный компьютер доступен через PowerShell Remoting.
Выполнение удаленных команд с удаленным взаимодействием PowerShell
Чтобы интерактивно подключиться к удаленному компьютеру (с именем хоста Server1) через PowerShell, выполните следующую команду:
Представление интерфейса командной строки PowerShell изменится. В начале строки будет имя удаленного компьютера, к которому вы подключены через WinRM. После установления удаленного сеанса все команды, которые вводятся в консоли PowerShell, выполняются на удаленном компьютере. PS Remoting работает следующим образом: команды, введенные на локальном компьютере, передаются на удаленный компьютер и выполняются там, затем результат передается обратно. Поскольку все команды выполняются локально, о совместимости с версией и модулями PoSh можно не беспокоиться.
Чтобы завершить удаленный интерактивный сеанс, выполните команду:
На удаленных компьютерах в интерактивном режиме обычно выполняются только простые задачи управления. Чтобы выполнить сложную команду или запустить сценарий PowerShell удаленно, используйте командлет Invoke-Command.
Использование Invoke-Command для удаленного запуска сценариев PowerShell
Следующая команда создаст удаленное соединение с компьютером Server1 и запустит блок команд, указанный в параметре ScriptBlock. После этого удаленный сеанс автоматически закроется.
Если вам нужно выполнить несколько последовательных команд PowerShell на удаленном компьютере, разделите команды в ScriptBlock точкой с запятой:
Вы можете запустить задачу в фоновом режиме, запустив Invoke-Command с параметром -AsJob. Но в этом случае команда не вернет результат в консоль PoSh. Чтобы получить подробную информацию о фоновом задании, используйте командлет Receive-Job.
PowerShell позволяет запускать локальные сценарии PS1 на удаленных компьютерах. Идея состоит в том, что вы храните все инструкции PowerShell в локальном файле .PS1 на вашем компьютере. С помощью PowerShell Remoting вы можете передать файл PS1 на удаленный компьютер и выполнить его там.
Для этого используйте параметр -FilePath в командлете Invoke-Command вместо -ScriptBlock. Например, для запуска сценария c:\ps\tune.ps1 на трех удаленных серверах можно использовать следующую команду:
Файл сценария PowerShell можно поместить на локальный диск или в общую сетевую папку. В этом случае для запуска файла скрипта PS1 необходимо указать полный UNC-путь:
Основное преимущество этого способа запуска сценариев PowerShell заключается в том, что вам не нужно копировать файл сценария PS1 на удаленные компьютеры. Вы можете использовать не только локальный сценарий, но и сценарий PS в общей сетевой папке, доступ к которой возможен с локального компьютера.
Если скрипты PowerShell не разрешены для запуска на удаленном компьютере, появится сообщение об ошибке:
.Invoke-Command: файл c:\Share\pstune.ps1 не может быть загружен, так как в этой системе отключены запуск сценариев. Дополнительные сведения см. в разделе about_Execution_Policies
Вы можете изменить параметры политики выполнения PowerShell на удаленном компьютере в соответствии с этим руководством или подписать файл сценария PowerShell с помощью сертификата.
Если вам нужно запускать сценарии PowerShell с учетными данными, отличными от текущего пользователя, необходимо использовать параметр Credential.
Во-первых, вам нужно получить учетные данные и сохранить их в переменной:
Теперь вы можете запускать скрипт PS на удаленных компьютерах с сохраненными учетными данными:
Вы можете сохранить список компьютеров в текстовом файле и запустить скрипт PowerShell удаленно на всех компьютерах одновременно:
По умолчанию командлет Invoke-Command одновременно отправляет сценарий PS1 на 32 удаленных компьютера из списка.Если компьютеров больше 32, то PoSh проверяет статус выполнения скрипта на первых 32 компьютерах. Если сценарий завершен, команда выполняется на следующем компьютере. С помощью параметра ThrottleLimit вы можете увеличить это ограничение, но будьте осторожны, чтобы не перегрузить сеть.
При запуске командлета Invoke-Command на нескольких компьютерах можно предварительно проверить, доступен ли удаленный компьютер через WinRM. Если компьютер доступен, вы можете запустить на нем код PowerShell с помощью Invoke-Command:
Если вы хотите передать локальные переменные сеанса в удаленный сеанс PowerShell, используйте модификатор $Using:
Вы можете использовать параметр ConnectionUri в Invoke-Command, чтобы выполнить команду для серверных приложений, таких как Exchange или облачные службы Azure/AWS. Например:
Использование постоянных подключений PowerShell (сеансов)
Каждый раз, когда вы запускаете Invoke-Command, создается новый сеанс с удаленным компьютером. Это требует времени и системных ресурсов. В PowerShell можно создать один сеанс и выполнять в нем все команды и сценарии.
С помощью командлета New-PSSession можно создавать постоянные сеансы PowerShell с удаленными компьютерами.
Например, давайте создадим сеансы с тремя компьютерами и сохраним их в переменной $PSSess:
После установления сеанса вы можете использовать его для запуска команд и сценариев. Поскольку сеансы являются постоянными, вы можете получать данные из них и использовать их в других командах и сценариях.
Например, следующая команда получит список процессов на удаленных серверах и сохранит их в переменной $RemoteProcesses:
Теперь вы можете использовать эту переменную в других командах того же сеанса. В следующем примере мы используем командлет Where-Object для поиска процессов, использующих более 500 МБ ОЗУ):
Постоянный удаленный сеанс PowerShell будет оставаться активным до тех пор, пока вы не закроете консоль PowerShell или принудительно не закроете или не удалите сеанс с помощью командлетов Disconnect-PSSession или Remove-PSSession соответственно.
Как видите, PowerShell предоставляет широкие возможности для запуска скриптов и команд на удаленных компьютерах. Администраторы Windows, безусловно, могут использовать PowerShell Remoting в дополнение к классическому инструменту PsExec от Sysinternals.
Читайте также: