Powershell подключиться к другому компьютеру: Вопросы и ответы об удаленном взаимодействии PowerShell — PowerShell

Содержание

Вопросы и ответы об удаленном взаимодействии PowerShell — PowerShell






Изменить





Twitter




LinkedIn




Facebook




Адрес электронной почты










  • Вопросы и ответы

При удаленной работе вы вводите команды в PowerShell на одном компьютере (известном как «локальный компьютер»), но команды выполняются на другом компьютере (известном как «удаленный компьютер»). Работа в удаленном режиме должна быть как можно больше похожа на работу непосредственно на удаленном компьютере.

Примечание

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

Да. Для удаленной работы локальные и удаленные компьютеры должны иметь PowerShell, microsoft платформа .NET Framework и протокол веб-служб для управления (WS-Management). Все файлы и другие ресурсы, необходимые для выполнения определенной команды, должны находиться на удаленном компьютере.

Компьютеры под управлением Windows PowerShell 3.0 и компьютеры под управлением Windows PowerShell 2.0 могут удаленно подключаться друг к другу и выполнять удаленные команды. Однако некоторые функции, такие как возможность отключиться от сеанса и повторно подключиться к нему, работают только в том случае, если оба компьютера работают под управлением Windows PowerShell 3. 0.

Необходимо иметь разрешение на подключение к удаленному компьютеру, разрешение на запуск PowerShell и разрешение на доступ к хранилищам данных (например, файлам и папкам) и реестру на удаленном компьютере.

Дополнительные сведения см. в разделе about_Remote_Requirements.

При отправке удаленной команды команда передается по сети в подсистему PowerShell на удаленном компьютере и выполняется в клиенте PowerShell на удаленном компьютере. Результаты команды отправляются обратно на локальный компьютер и отображаются в сеансе PowerShell на локальном компьютере.

Для передачи команд и получения выходных данных PowerShell использует протокол WS-Management. Сведения о протоколе WS-Management см. в разделе Протокол WS-Management в документации Windows.

Начиная с Windows PowerShell 3.0 удаленные сеансы хранятся на удаленном компьютере.
Это позволяет отключиться от сеанса и повторно подключиться к другому сеансу или другому компьютеру без прерывания выполнения команд или потери состояния.

При подключении к удаленному компьютеру система использует учетные данные имени пользователя и пароля на локальном компьютере или учетные данные, которые вы указали в команде для входа на удаленный компьютер. Учетные данные и остальная часть передачи шифруются.

Чтобы добавить дополнительную защиту, можно настроить на удаленном компьютере использование ssl вместо HTTP для прослушивания запросов удаленного управления Windows (WinRM).
Затем при установке подключения пользователи могут использовать параметр Invoke-CommandUseSSL командлетов , New-PSSessionи Enter-PSSession . Этот параметр использует более безопасный канал HTTPS вместо HTTP.

Нет. Некоторые командлеты имеют параметр ComputerName , который позволяет получать объекты с удаленного компьютера.

Эти командлеты не используют удаленное взаимодействие PowerShell. Таким образом, их можно использовать на любом компьютере под управлением PowerShell, даже если компьютер не настроен для удаленного взаимодействия PowerShell или если компьютер не соответствует требованиям к удаленному взаимодействию PowerShell.

К этим командлетам относятся следующие:

  • Get-Hotfix
  • Rename-Computer
  • Restart-Computer
  • Stop-Computer

Чтобы найти все командлеты с параметром ComputerName , введите:

Get-Help * -Parameter ComputerName
# or
Get-Command -ParameterName ComputerName

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

Get-Help <cmdlet-name> -Parameter ComputerName

Пример:

Get-Help Get-Hotfix -Parameter ComputerName

Для всех остальных команд используйте Invoke-Command командлет .

Чтобы выполнить команду на удаленном компьютере, используйте Invoke-Command командлет .

Заключите команду в фигурные скобки ({}), чтобы сделать ее блоком скрипта. Используйте параметр ScriptBlock , Invoke-Command чтобы указать команду .

Чтобы указать удаленный компьютер, можно использовать параметр Invoke-CommandComputerName . Кроме того, можно создать постоянное подключение к удаленному компьютеру (сеансу), а затем использовать параметр Invoke-CommandSession для выполнения команды в сеансе.

Например, следующие команды выполняются Get-Process удаленно.

Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-Process}
#  - OR -
Invoke-Command -Session $s -ScriptBlock {Get-Process}

Чтобы прервать удаленную команду, введите CTRL+C. Запрос прерывания передается на удаленный компьютер, где завершается удаленная команда.

Дополнительные сведения об удаленных командах см. в about_Remote и разделах справки по командлетам, поддерживающим удаленное взаимодействие.

Командлет можно использовать для Enter-PSSession запуска интерактивного сеанса с удаленным компьютером.

В командной строке PowerShell введите следующее:

Enter-PSSession <ComputerName>

В командной строке появится сообщение о том, что вы подключены к удаленному компьютеру.

<ComputerName>\C:>

Теперь введенные вами команды выполняются на удаленном компьютере так же, как если бы вы ввели их непосредственно на удаленном компьютере.

Чтобы завершить интерактивный сеанс, введите:

Exit-PSSession

Интерактивный сеанс — это постоянный сеанс, использующий протокол WS-Management. Это не то же самое, что использование Telnet, но оно обеспечивает аналогичные возможности.

Для получения дополнительной информации см. Enter-PSSession.

Да. Удаленные команды можно выполнить, указав имя удаленного компьютера, его NetBIOS-имя или IP-адрес. Кроме того, можно выполнить удаленные команды, указав сеанс PowerShell (PSSession), подключенный к удаленному компьютеру.

При использовании параметра ComputerName или Invoke-CommandEnter-PSSessionPowerShell устанавливает временное подключение. PowerShell использует подключение для выполнения только текущей команды, а затем закрывает подключение. Это очень эффективный метод для выполнения одной команды или нескольких несвязанных команд, даже на многих удаленных компьютерах.

При использовании командлета New-PSSession для создания PSSession PowerShell устанавливает постоянное подключение для PSSession. Затем можно выполнить несколько команд в PSSession, включая команды, которые совместно используют данные.

Как правило, psSession создается для выполнения ряда связанных команд, которые совместно используют данные.
В противном случае для большинства команд достаточно временного подключения, созданного параметром ComputerName .

Дополнительные сведения о сеансах см. в разделе about_PSSessions.

Да. Параметр ComputerName командлета Invoke-Command принимает несколько имен компьютеров, а параметр Session принимает несколько PSSessions.

При выполнении Invoke-Command команды PowerShell выполняет команды на всех указанных компьютерах или во всех указанных PSSessions.

PowerShell может управлять сотнями параллельных удаленных подключений. Однако количество удаленных команд, которые можно отправить, может быть ограничено ресурсами компьютера и его емкостью для установки и обслуживания нескольких сетевых подключений.

Дополнительные сведения см. в примере в разделе справки Invoke-Command .

Профили PowerShell не запускаются автоматически в удаленных сеансах, поэтому команды, добавленные профилем, отсутствуют в сеансе. Кроме того, $profile автоматическая переменная не заполняется в удаленных сеансах.

Чтобы запустить профиль в сеансе, используйте Invoke-Command командлет .

Например, следующая команда выполняет профиль CurrentUserCurrentHost с локального компьютера в сеансе в $s.

Invoke-Command -Session $s -FilePath $profile

Следующая команда выполняет профиль CurrentUserCurrentHost с удаленного компьютера в сеансе в $s. $profile Так как переменная не заполнена, команда использует явный путь к профилю.

Invoke-Command -Session $s {
  . "$home\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"
}

После выполнения этой команды команды команды, добавленные профилем в сеанс, доступны в $s.

Вы также можете использовать скрипт запуска в конфигурации сеанса, чтобы запустить профиль в каждом удаленном сеансе, в котором используется конфигурация сеанса.

Дополнительные сведения о профилях PowerShell см. в разделе about_Profiles. Дополнительные сведения о конфигурациях сеансов см. в разделе Register-PSSessionConfiguration.

Чтобы упростить управление ресурсами на локальном компьютере, PowerShell включает функцию регулирования для каждой команды, которая позволяет ограничить количество параллельных удаленных подключений, установленных для каждой команды.

Значение по умолчанию — 32 одновременных подключения, но вы можете использовать параметр ThrottleLimit командлетов, чтобы задать пользовательское ограничение регулирования для определенных команд.

При использовании функции регулирования следует помнить, что она применяется к каждой команде, а не ко всему сеансу или компьютеру. Если команды выполняются параллельно в нескольких сеансах или сеансах PSSessions, количество одновременных подключений — это сумма одновременных подключений во всех сеансах.

Чтобы найти командлеты с параметром ThrottleLimit , введите:

Get-Help * -Parameter ThrottleLimit
-or-
Get-Command -ParameterName ThrottleLimit

При локальном использовании PowerShell вы отправляете и получаете «динамические» объекты платформа .NET Framework; «динамические» объекты — это объекты, связанные с фактическими программами или системными компонентами.
При вызове методов или изменении свойств динамических объектов изменения влияют на фактическую программу или компонент. При изменении свойств программы или компонента также изменяются свойства объекта, представляющего их.

Однако поскольку большинство динамических объектов не могут быть переданы по сети, PowerShell «сериализует» большинство объектов, отправленных в удаленных командах, то есть преобразует каждый объект в ряд элементов данных XML (язык ограничений в XML [CLiXML]) для передачи.

Когда PowerShell получает сериализованный объект, он преобразует XML-код в десериализованный тип объекта. Десериализованный объект является точной записью свойств программы или компонента в предыдущее время, но он больше не является «живым», то есть больше не связан напрямую с компонентом. Кроме того, методы удаляются, так как они больше не эффективны.

Как правило, десериализованные объекты можно использовать так же, как и динамические объекты, но необходимо учитывать их ограничения. Кроме того, объекты, возвращаемые командлетом Invoke-Command , имеют дополнительные свойства, которые помогают определить источник команды.

Некоторые типы объектов, такие как объекты DirectoryInfo и GUID, преобразуются обратно в динамические объекты при их получении. Эти объекты не нуждаются в специальной обработке или форматировании.

Сведения о интерпретации и форматировании удаленных выходных данных см. в разделе about_Remote_Output.

Да. Фоновое задание PowerShell — это команда PowerShell, которая выполняется асинхронно без взаимодействия с сеансом. При запуске фонового задания командная строка возвращается немедленно, и вы можете продолжить работу в сеансе во время выполнения задания, даже если оно выполняется в течение длительного периода времени.

Фоновое задание можно запустить даже при выполнении других команд, так как фоновые задания всегда выполняются асинхронно во временном сеансе.

Фоновые задания можно выполнять на локальном или удаленном компьютере. По умолчанию фоновое задание выполняется на локальном компьютере. Однако можно использовать параметр AsJob командлета Invoke-Command для выполнения любой удаленной команды в качестве фонового задания. Кроме того, можно использовать для Invoke-Command удаленного Start-Job выполнения команды.

Дополнительные сведения о фоновых заданиях в PowerShell см. в разделе about_Jobs и about_Remote_Jobs.

Удаленные команды PowerShell можно использовать для запуска программ windows на удаленных компьютерах.
Например, можно запустить Shutdown.exe или Ipconfig.exe на удаленном компьютере.

Однако нельзя использовать команды PowerShell для открытия пользовательского интерфейса для любой программы на удаленном компьютере.

При запуске программы Windows на удаленном компьютере команда не выполняется, и командная строка PowerShell не возвращается, пока программа не будет завершена или пока не будет выполнена команда нажатием клавиш CTRL+C , чтобы прервать выполнение команды. Например, если программа запускается Ipconfig.exe на удаленном компьютере, командная строка не возвращается Ipconfig.exe до завершения.

Если вы используете удаленные команды для запуска программы с пользовательским интерфейсом, процесс программы запускается, но пользовательский интерфейс не отображается. Команда PowerShell не завершена, и командная строка не возвращается, пока вы не остановите программный процесс или не нажмете клавиши CTRL+C, которая прервет команду и не остановит процесс.

Например, если вы используете команду PowerShell для запуска Notepad на удаленном компьютере, процесс Блокнота запускается на удаленном компьютере, но пользовательский интерфейс Блокнота не отображается. Чтобы прервать выполнение команды и восстановить командную строку, нажмите клавиши CTRL+C.

Да. Каждый удаленный сеанс должен использовать одну из конфигураций сеанса на удаленном компьютере. Вы можете управлять конфигурациями сеансов на компьютере (и разрешениями для этих конфигураций сеансов), чтобы определить, кто может выполнять команды удаленно на компьютере и какие команды они могут выполнять.

Конфигурация сеанса настраивает среду для сеанса. Конфигурацию можно определить с помощью сборки, реализующей новый класс конфигурации, или с помощью скрипта, который выполняется в сеансе. Конфигурация может определять команды, доступные в сеансе. Кроме того, конфигурация может включать параметры, защищающие компьютер, например параметры, ограничивающие объем данных, которые сеанс может получать удаленно в одном объекте или команде. Можно также указать дескриптор безопасности, который определяет разрешения, необходимые для использования конфигурации.

Командлет Enable-PSRemoting создает конфигурации сеанса по умолчанию на компьютере: Microsoft.PowerShell, Microsoft.PowerShell.Workflow и Microsoft.PowerShell32 (только 64-разрядные операционные системы). Enable-PSRemoting задает дескриптор безопасности для конфигурации, разрешая использовать их только членам группы «Администраторы» на компьютере.

Командлеты конфигурации сеанса можно использовать для изменения конфигураций сеансов по умолчанию, для создания новых конфигураций сеансов и для изменения дескрипторов безопасности всех конфигураций сеансов.

Начиная с Windows PowerShell 3.0, New-PSSessionConfigurationFile командлет позволяет создавать пользовательские конфигурации сеанса с помощью текстового файла. Файл содержит параметры для настройки языкового режима и указания командлетов и модулей, доступных в сеансах, использующих конфигурацию сеанса.

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

Дополнительные сведения о конфигурациях сеансов см. в справке по командлетам конфигурации сеанса. Чтобы найти командлеты конфигурации сеанса, введите:

Get-Command *PSSessionConfiguration

Наиболее распространенный сценарий удаленного взаимодействия PowerShell с несколькими компьютерами — это конфигурация «один ко многим», в которой один локальный компьютер (компьютер администратора) выполняет команды PowerShell на нескольких удаленных компьютерах. Это называется сценарием развертывания.

Однако на некоторых предприятиях используется конфигурация «многие к одному», при которой многие клиентские компьютеры подключаются к одному удаленному компьютеру под управлением PowerShell, например к файловму серверу или киоску. Это называется конфигурацией «вентилятора».

Удаленное взаимодействие PowerShell поддерживает конфигурации развертывания и развертывания.

Для развертывания конфигурации PowerShell использует протокол веб-служб для управления (WS-Management) и службу WinRM, которая поддерживает реализацию WS-Management майкрософт. Когда локальный компьютер подключается к удаленному компьютеру, WS-Management устанавливает подключение и использует подключаемый модуль для PowerShell для запуска хост-процесса PowerShell (Wsmprovhost.exe) на удаленном компьютере. Пользователь может указать альтернативный порт, конфигурацию альтернативного сеанса и другие функции для настройки удаленного подключения.

Для поддержки конфигурации «вентилятора» PowerShell использует службы IIS для размещения WS-Management, загрузки подключаемого модуля PowerShell и запуска PowerShell. В этом сценарии вместо запуска каждого сеанса PowerShell в отдельном процессе все сеансы PowerShell выполняются в одном хост-процессе.

Удаленное управление размещением и развертыванием IIS не поддерживается в Windows XP и Windows Server 2003.

В конфигурации развертывания пользователь может указать URI подключения и конечную точку HTTP, включая транспорт, имя компьютера, порт и имя приложения. IIS пересылает в приложение все запросы с указанным именем приложения. По умолчанию используется WS-Management, в котором может размещаться PowerShell.

Вы также можете указать механизм проверки подлинности и запретить или разрешить перенаправление с конечных точек HTTP и HTTPS.

Да. Удаленное взаимодействие PowerShell доступно, даже если локальный компьютер не входит в домен. Функции удаленного взаимодействия можно использовать для подключения к сеансам и создания сеансов на том же компьютере. Эти функции работают так же, как и при подключении к удаленному компьютеру.

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

Внимание! Эти параметры влияют на всех пользователей в системе и могут сделать систему более уязвимой для вредоносных атак. Соблюдайте осторожность при внесении этих изменений.

  • Windows Vista, Windows 7, Windows 8:

    Создайте следующую запись реестра, а затем присвойте ей значение 1: LocalAccountTokenFilterPolicy в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

    Для добавления этой записи можно использовать следующую команду PowerShell:

    $parameters = @{
      Path='HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System'
      Name='LocalAccountTokenFilterPolicy'
      propertyType='DWord'
      Value=1
    }
    New-ItemProperty @parameters
    
  • Windows Server 2003, Windows Server 2008, Windows Server 2012, Windows Server 2012 R2:

    Изменения не требуются, так как по умолчанию для политики «Сетевой доступ: модель общего доступа и безопасности для локальных учетных записей» задано значение «Классическая». Проверьте параметр, если он был изменен.

Да. Как правило, команды выполняются без ошибок, хотя может потребоваться использовать параметр Invoke-CommandCredential командлетов , New-PSSessionили Enter-PSSession , чтобы предоставить учетные данные члена группы администраторов на удаленном компьютере. Иногда это требуется, даже если текущий пользователь является членом группы «Администраторы» на локальном и удаленном компьютерах.

Однако если удаленный компьютер не входит в домен, которому он доверяет, удаленный компьютер может не пройти проверку подлинности учетных данных пользователя.

Чтобы включить проверку подлинности, используйте следующую команду, чтобы добавить удаленный компьютер в список доверенных узлов для локального компьютера в WinRM. Введите команду в командной строке PowerShell.

Set-Item WSMan:\localhost\Client\TrustedHosts -Value <Remote-computer-name>

Например, чтобы добавить компьютер Server01 в список доверенных узлов на локальном компьютере, введите следующую команду в командной строке PowerShell:

Set-Item WSMan:\localhost\Client\TrustedHosts -Value Server01

Да. Дополнительные сведения см. в статье Удаленное взаимодействие PowerShell по протоколу SSH.

См. также раздел

about_Remote

about_Profiles

about_PSSessions

about_Remote_Jobs

about_Remote_Variables

Invoke-Command

New-PSSession






Обратная связь







Просмотреть все отзывы по странице




PowerShell.

О удалённом подключении (about_Remote) — Клёвый код

С помощью PowerShell можно выполнить удаленные команды, как на одном компьютере, так и на нескольких компьютерах. Использовать как временное, так и постоянное подключение. Можно так же запустить интерактивный сеанс с одним удаленным компьютером.

В этом разделе приводится ряд примеров, показывающих, как работать с разными типами удаленных команд. Рекомендуется так же прочесть разделы справки, которые описывают каждый командлет, который используется в статье. Эта статья представляет подробную информацию и объясняет, как можно изменять команды под ваши потребности.

Примечание: Для использования Windows PowerShell Remoting, локальные и удаленные компьютеры должны быть настроены на удаленное взаимодействие. Для получения дополнительной информации см about_Remote_Requirements.

 

Как начать интерактивный сеанс (ENTER-PSSESSION)

Самый простой способ выполнять удаленные команды — это начать интерактивный сеанс с удаленным компьютером.
Когда начинается сессия, команды которые вы вводите, выполняются на удаленном компьютере, как если бы вы набрали их непосредственно на удаленном компьютере. Вы можете подключиться только к одному компьютеру в каждом интерактивном сеансе.

Чтобы начать интерактивный сеанс, используйте командлет Enter-PSSession.

Следующая команда начинает интерактивный сеанс с компьютером Server01:

PowerShell

Enter-PSSession Server01



Enter-PSSession Server01

Командная строка изменяется, чтобы указать, что вы подключены к компьютеру Server01.

PowerShell

Server01 \ PS>



Server01 \ PS>

Теперь можно вводить команды на компьютере Server01.
Чтобы завершить интерактивный сеанс, надо ввести:

PowerShell

Exit-PSSession



Exit-PSSession

Для получения дополнительной информации см Enter-PSSession.

Как работать с командлетами, которые имеют параметр ComputerName для дистанционного получения данных

Некоторые командлеты имеют параметр ComputerName, он позволяет получать объекты с удаленных компьютеров.

Поскольку эти командлеты не используют WS-Management на базе Windows PowerShell Remoting, вы можете использовать параметр ComputerName этих командлетов на любом компьютере под управлением Windows PowerShell. Компьютеры могут быть не настроены для работы Windows PowerShell Remoting, и компьютеры могут не отвечать требованиям к системам для удаленного доступа.

Ниже приведён список командлетов имеющих параметр ComputerName:
Clear-EventLog
Get-Counter
Get-EventLog
Get-HotFix
Get-Process
Get-Service
Get-WinEvent
Get-WmiObject
Limit-EventLog
New-EventLog
Remove-EventLog
Restart-Computer
Stop-Computer
Show-EventLog
Test-Connection
Write-EventLog

Для примера, следующая команда получает службы на удаленном компьютере Server01:

PowerShell

Get-Service -ComputerName Server01



Get-Service -ComputerName Server01

Обычно командлеты, поддерживающие удаленную работу без специальной настройки, имеют параметр ComputerName и не имеют параметра Session. Чтобы отобразить эти командлеты надо выполнить следующую команду:

PowerShell

Get-Command | where { $_.Parameters.Keys -contains «ComputerName» -and $_.Parameters.Keys -NotContains «Session»}



Get-Command | where { $_.Parameters.Keys -contains «ComputerName» -and $_.Parameters.Keys -NotContains «Session»}

 

Как запустить команды удалённо

Для запуска команд, не поддерживающих параметр ComputerName, на удаленных компьютерах. Можно использовать командлет Invoke-Command.

Для указания списка компьютеров или одного компьютера можно воспользоваться параметром ComputerName. Для задания одной или несколько команд надо воспользоваться парамертом ScriptBlock.

Например, следующая команда выполняет команду Get-Culture на компьютере Server01.

PowerShell

Invoke-Command -ComputerName Server01 -scriptblock {Get-Culture}



Invoke-Command -ComputerName Server01 -scriptblock {Get-Culture}

Параметр ComputerName предназначен для ситуаций, в которых выполняется одна команда или несколько несвязанных команд, на одном или нескольких компьютерах. Чтобы установить постоянное подключение к удаленному компьютеру, надо использовать параметр Session.

Как создать постоянное соединение (PSsession)

При использовании параметра ComputerName и командлета Invoke-Command, оболочка Windows PowerShell устанавливает подключение только для данной команды. Затем, когда команда завершена, оболочка закрывает соединение. Любые переменные или функции, которые были определены в команде, будут потеряны.

Чтобы создать постоянное подключение к удаленному компьютеру, надо воспользоваться командлетом New-PSSession. Например, следующая команда создает сеансы PSSession на компьютерах Server01 и Server02, а затем сохраняет эти сеансы в переменной $s.

PowerShell

$s = New-PSSession -ComputerName Server01, Server02



$s = New-PSSession -ComputerName Server01, Server02

Как выполнять команд в PSsession

Воспользовавшись PSSession, можно запустить серию удаленных команд, которые будут иметь одно общее окружение. И соответственно иметь общий доступ к таким данным, как функции, псевдонимы и значения переменных. Для запуска команды в PSSession, используется параметр Session в командлете Invoke-Command.

Например, следующая команда использует командлет Invoke-Command для выполнения командлета Get-Process в сеансах PSSession $s на компьютерах Server01 и Server02. Команда сохраняет процессы в переменной $р в каждом из сеансов PSSession.

PowerShell

Invoke-Command -Session $s -ScriptBlock {$p = Get-Process}



Invoke-Command -Session $s -ScriptBlock {$p = Get-Process}

Так как PSSession использует постоянное подключение, вы можете запустить другую команду в той же сессии PSSession, в которой уже задана переменная $р. Следующая команда подсчитывает количество процессов, сохраненных в переменной $р.

PowerShell

Invoke-Command -Session $s -ScriptBlock {$p.count}



Invoke-Command -Session $s -ScriptBlock {$p. count}

 

Как запустить удалённые команды на нескольких компьютерах

Для запуска удаленной команды на нескольких компьютерах, необходимо ввести все имена компьютеров в значении параметра ComputerName командлета Invoke-Command. Разделите имена компьютеров запятыми.

Например, следующая команда запускает команду Get-Culture на трех компьютерах:

PowerShell

Invoke-Command -ComputerName S1, S2, S3 -ScriptBlock {Get-Culture}



Invoke-Command -ComputerName S1, S2, S3 -ScriptBlock {Get-Culture}

Можно так же запустить команду в нескольких сеансах PSSession. Следующие команды создают сеансы PSSession на компьютерах Server01, Server02, Server03 и затем выполняется команда Get-Culture в каждом из сеансов.

PowerShell

$s = New-PSSession -ComputerName Server01, Server02, Server03
Invoke-Command -Session $s -ScriptBlock {Get-Culture}



$s = New-PSSession -ComputerName Server01, Server02, Server03

Invoke-Command -Session $s -ScriptBlock {Get-Culture}

Чтобы указать в списке компьютеров локальный компьютер надо ввести имя локального компьютера, точку (. ) или localhost.

PowerShell

Invoke-Command -ComputerName S1, S2, S3, localhost -ScriptBlock {Get-Culture}



Invoke-Command -ComputerName S1, S2, S3, localhost -ScriptBlock {Get-Culture}

 

Как запустить скрипт на удаленных компьютерах

Чтобы запустить скрипт с локального компьютера, на удаленных компьютерах, надо использовать параметр FilePath командлета Invoke-Command.
Например, следующая команда запускает сценарий sample.ps1 на компьютерах S1 и S2:

PowerShell

Invoke-Command -ComputerName S1, S2 -FilePath C:\Test\Sample.ps1



Invoke-Command -ComputerName S1, S2 -FilePath C:\Test\Sample.ps1

Результат работы скрипта отображается на локальном компьютере. Для выполнения данного скрипта нет необходимости распространять файлы скрипта.

 

Как остановить удалённые команды

Чтобы прервать команду, надо нажать «CTRL» + «C». Запрос прерывания передастся на удаленный компьютер и завершит работу удаленного управления.

Перезагрузите компьютер (Microsoft.PowerShell.Management) — PowerShell | Microsoft Learn

  • Справочник
Модуль:
Microsoft.PowerShell.Управление

Перезапускает операционную систему на локальном и удаленном компьютерах.

Синтаксис

 Перезагрузка компьютера
       [-WsmanAuthentication ]
       [[-ИмяКомпьютера] <Строка[]>]
       [[-Учетные данные]]
       [-Сила]
       [-Ждать]
       [-Тайм-аут ]
       [-Для ]
       [-Задержка ]
       [-Что, если]
       [-Подтверждать]
       [<Общие параметры>] 

Описание

Этот командлет доступен только на платформе Windows.

Командлет Restart-Computer перезапускает операционную систему на локальном и удаленном компьютерах.

Вы можете использовать параметры Restart-Computer для запуска операций перезагрузки, чтобы указать
уровни аутентификации и альтернативные учетные данные, чтобы ограничить операции, выполняемые одновременно,
и для принудительного немедленного перезапуска.

Начиная с Windows PowerShell 3.0, вы можете дождаться завершения перезапуска, прежде чем запускать следующий
команда. Укажите время ожидания и интервал запроса, а также подождите, пока определенные службы не будут
доступны на перезагруженном компьютере. Эта функция делает практичным использование Restart-Computer в
скрипты и функции.

Примеры

Пример 1: Перезагрузите локальный компьютер

Restart-Computer перезапускает локальный компьютер.

 Перезагрузка-Компьютер 

Пример 2: перезапуск нескольких компьютеров

Restart-Computer может перезапускать удаленные и локальные компьютеры. Параметр ComputerName принимает
массив имен компьютеров.

 Restart-Computer -ComputerName Server01, Server02, localhost 

Пример 3. Получение имен компьютеров из текстового файла

Restart-Computer получает список имен компьютеров из текстового файла и перезагружает компьютеры.
Параметр ComputerName не указан. Но поскольку это первый параметр позиции, он
принимает имена компьютеров из текстового файла, которые отправляются по конвейеру.

 Get-Content -Path C:\Domain01.txt | Restart-Computer 

Get-Content использует параметр Path для получения списка имен компьютеров из текстового файла,
Домен01.txt . Имена компьютеров передаются по конвейеру. Restart-Computer перезагружает каждый
компьютер.

Пример 4. Принудительный перезапуск компьютеров, перечисленных в текстовом файле

В этом примере выполняется принудительный перезапуск компьютеров, перечисленных в Domain01.txt 9файл 0028.
имена компьютеров из текстового файла сохраняются в переменной. Параметр Force заставляет
немедленный перезапуск.

 $Names = Get-Content-Path C:\Domain01.txt
$Creds = Получить учетные данные
Restart-Computer -ComputerName $Names -Credential $Creds -Force 

Get-Content использует параметр Path для получения списка имен компьютеров из текстового файла,
Домен01.txt . Имена компьютеров хранятся в переменной $Names . Запросы Get-Credential
вам имя пользователя и пароль и сохраняет значения в переменной $Creds . Перезагрузка-компьютер
использует параметры ComputerName и Credential с их переменными. Сила
параметр вызывает немедленную перезагрузку каждого компьютера.

Пример 6. Перезапустите удаленный компьютер и подождите, пока PowerShell

Restart-Computer перезагрузит удаленный компьютер, а затем подождет до 5 минут (300 секунд) для
PowerShell, чтобы он стал доступен на перезагруженном компьютере, прежде чем он продолжит работу.

 Restart-Computer -ComputerName Server01 -Wait -For PowerShell -Timeout 300 -Delay 2 

Restart-Computer использует параметр ComputerName для указания Server01 . Подождите
параметр ожидает завершения перезапуска. For указывает, что PowerShell может выполнять команды на
удаленный компьютер. Параметр Timeout задает пятиминутное ожидание. Параметр Задержка
опрашивает удаленный компьютер каждые две секунды, чтобы определить, перезапущен ли он.

Пример 7. Перезагрузите компьютер с помощью WsmanAuthentication

Restart-Computer перезапускает удаленный компьютер с помощью механизма WsmanAuthentication .
Аутентификация Kerberos определяет, есть ли у текущего пользователя разрешение на перезапуск удаленного компьютера.
компьютер. Для получения дополнительной информации см.
Механизм аутентификации.

 Restart-Computer -ComputerName Server01 -WsmanAuthentication Kerberos 

Restart-Computer использует ComputerName для указания удаленного компьютера, Server01 .
Параметр WsmanAuthentication указывает метод проверки подлинности как Kerberos .

Параметры

-ComputerName

-Подтвердить

-Учетные данные

-Задержка

-Для

-Принудительно

-Таймаут

-Подождите

-WhatIf

-WsmanAuthentication

Входы

Строка

В этот командлет можно передать строку, содержащую имя компьютера.

Выходные данные

Нет

Этот командлет не возвращает никаких выходных данных.

Примечания

  • В Windows Перезагрузка-компьютер использует метод Win32Shutdown
    инструментария управления Windows (WMI) Win32_OperatingSystem
    сорт. Этот метод требует, чтобы для учетной записи пользователя была включена привилегия SeShutdownPrivilege .
    используется для перезагрузки машины.
  • В Linux и Mac OS Restart-Computer использует /sbin/shutdown Баш-инструмент.
  • Об удаленном управлении Windows
  • Получить учетные данные
  • Протокол управления WS

Подробное руководство по началу работы с удаленной оболочкой PowerShell

Вы когда-нибудь хотели запускать команды PowerShell на удаленной машине, не выходя из своей рабочей станции? Что ж, с PowerShell Remoting вы можете это сделать. С удаленной оболочкой PowerShell вы можете надежно запускать команды и сценарии на нескольких удаленных системах.

Звучит интересно? Читайте дальше, чтобы узнать, как приручить эти удаленные машины с помощью PowerShell.

Предварительные условия

Это руководство представляет собой практическую демонстрацию. Если вы хотите продолжить, убедитесь, что у вас есть как минимум три компьютера с PowerShell 7. Один будет вашим управляющим компьютером, а два других — удаленными машинами.

В этом учебном пособии будут использоваться следующие компьютеры.

  • ПК с Windows 10 с PowerShell 7, установленным в качестве управляющего компьютера. Вы будете запускать удаленные команды с этой машины.
  • ПК с Windows 10 с установленным PowerShell 7. Этот компьютер будет конечной точкой для удаленного PowerShell через WinRM.
    • Учетная запись пользователя на удаленной машине Windows с правами локального администратора. В этом руководстве используется учетная запись пользователя с именем ma.
  • Компьютер Linux с включенным SSHD для использования в качестве удаленной конечной точки PowerShell через SSH. В этом руководстве используется Fedora 35.
    • Учетная запись пользователя для выполнения удаленных команд на машине Linux. Учетная запись должна иметь доступ к sudo и SSH. В этом руководстве используется учетная запись с именем test . Создайте учетную запись пользователя на этом этапе, если у вас ее нет на вашем компьютере с Linux

Включение удаленного взаимодействия PowerShell в Windows через WinRM

При установке PowerShell 7 есть возможность включить удаленное взаимодействие PowerShell, и вы могли включить его тогда. Но, чтобы быть уверенным, выполните следующие шаги, чтобы включить удаленную оболочку PowerShell.

1. Войдите на удаленный ПК с Windows 10.

2. Откройте PowerShell от имени администратора.

3. Запустите приведенную ниже команду, чтобы включить удаленную оболочку PowerShell.

 Enable-PSRemoting 

Команда выполняет несколько изменений конфигурации, которые вы увидите в консоли.

Включение удаленного PowerShell в Windows через WinRM

Включение удаленного PowerShell в Linux через SSH

WinRM является эксклюзивным для Windows, что означает, что с его помощью вы не можете включить удаленный PowerShell в Linux. Вместо этого вы можете включить удаленный PowerShell через SSH в Linux. Предполагая, что вы уже установили PowerShell, выполните следующие действия.

1. Войдите в удаленную систему Linux и откройте сеанс терминала.

2. Откройте файл конфигурации сервера SSH в текстовом редакторе. Используйте любой текстовый редактор, например Gedit, Sublime или Nano. В этом примере используется Gedit.

 sudo nano /etc/ssh/sshd_config 

3. Затем добавьте в файл приведенную ниже строку. Эта строка создает подсистему SSH, в которой размещается процесс PowerShell.

 Подсистема powershell /usr/bin/pwsh -sshs -NoLogo 

Создайте подсистему SSH для PowerShell в Linux

4. Закройте редактор.

5. Наконец, перезапустите сервер SSH, выполнив следующую команду.

 sudo systemctl перезапустить sshd 

Добавление удаленных доверенных хостов PowerShell на локальном компьютере

Теперь ваш удаленный компьютер готов принимать команды. Но ваш управляющий компьютер может отказаться подключаться к удаленным хостам PowerShell, если они не находятся в списке доверенных хостов. Чтобы избежать возможных проблем с удаленным взаимодействием, необходимо добавить удаленные узлы в список доверенных узлов.

Откройте PowerShell от имени администратора на управляющем компьютере.

Запустите приведенную ниже команду winrm . Эта команда добавляет ваш удаленный Windows ( 192.168.8.107 ) и Linux ().0027 192.168.8.171 ) машин в список доверенных хостов вашего компьютера.

 winrm set winrm/config/client '@{TrustedHosts=" 192.168.8.171,192.168.8.107"}' 

Добавление удаленных машин в качестве доверенных хостов

Запуск команд на удаленных компьютерах команды на удаленной машине в этом разделе.

1. Откройте новый сеанс PowerShell на управляющем компьютере.

2. Теперь выполните приведенную ниже команду Invoke-Command 9.0028, чтобы перечислить первые пять служб на удаленной машине от имени пользователя ma . Команда для запуска отображается между фигурными скобками переключателя ScriptBlock , как показано ниже.

 Вызов команды `
    -ИмяКомпьютера 192.168.8.107 `
    -Учетные данные «ма» `
    -ScriptBlock {Получить-Процесс | Select-Object -First 5 } 

Список процессов на удаленном хосте PowerShell Windows

3. Чтобы выполнить то же самое с удаленным хостом Linux, вместо этого выполните приведенную ниже команду. Обратите внимание, что -HostName заменил -ComputerName , а -UserName заменил -ComputerName . Эти параметры указывают командлету Invoke-Command , что целью является узел SSH.

 Вызов команды `
    -ИмяХоста 192.168.8.171 `
    -Имя пользователя 'тест' `
    -ScriptBlock {Получить-Процесс | Select-Object -First 5 } 

Список процессов на удаленном хосте PowerShell Linux

Выполнение сценариев на удаленных компьютерах

Вы также можете запустить файл сценария PowerShell на удаленном компьютере с помощью Командлет Invoke-Command . Но вместо указания параметра -ScriptBlock вы укажете параметр -FilePath , за которым следует локальный путь сценария.

1. Сначала создайте на локальном компьютере файл сценария PowerShell с именем nametime. ps1 .

2. Откройте сценарий в предпочитаемом вами редакторе сценариев и добавьте следующий код. Сохраните файл после этого.

 # имявремя.ps1
имя хоста
Get-Date 

Создайте сценарий PowerShell

3. Выполните командлет Invoke-command с параметром -FilePath . -FilePath должен указывать на файл сценария. В этом примере файл сценария находится в том же рабочем каталоге.

 # Вызов сценария на удаленном PowerShell через WinRM
Вызвать команду `
    -ИмяКомпьютера 192.168.8.107 `
    -Учетные данные «ма» `
    -FilePath .\nametime.ps1
# Вызов сценария на удаленном PowerShell через SSH
Вызвать команду `
    -ИмяХоста 192.168.8.171 `
    -Имя пользователя 'тест' `
    -FilePath .\nametime.ps1 

Вызов сценария на удаленных узлах PowerShell

Интерактивное управление удаленным компьютером

В предыдущем разделе вы видели, как выполнять отдельные команды на удаленном компьютере. В этом разделе вы научитесь открывать интерактивный сеанс, чтобы вы могли запускать несколько команд на удаленном компьютере, как если бы он был локальным.

1. Выполните команду Enter-PSSession , чтобы запустить удаленный сеанс на машине по адресу 192.168.8.107 от имени пользователя ma .

 Enter-PSSession -ComputerName 192.168.8.107 -Credential ma 

Введите пароль учетной записи удаленного пользователя, ma , в приглашении, как показано ниже.

Вход в интерактивный удаленный сеанс

Вы увидите новое приглашение, как показано ниже. IP-адрес в квадратных скобках указывает на удаленный узел PowerShell.

Просмотр удаленной подсказки

3. Выведите список файлов в текущем рабочем каталоге с помощью команды dir , как показано ниже. Вы можете выполнять столько команд PowerShell, сколько хотите в течение сеанса dir

Содержимое каталога должно быть на вашем экране, как на скриншоте ниже.

Линтинг файлов на удаленном компьютере

4. Выполните приведенный ниже командлет Exit-PSSession , чтобы выйти из сеанса после завершения управления удаленным компьютером.

 Exit-PSSession 

При выходе вы должны вернуться к локальному приглашению, как показано на снимке экрана ниже

Выход из удаленного сеанса

Отключение и повторное подключение удаленных сеансов PowerShell

Сеанс можно постоянно хранить в качестве альтернативы интерактивным сеансам или одноразовым командам. Сохранение сеанса позволяет переключаться между сеансами без потери контекста. В этом разделе вы научитесь создавать постоянные сеансы и управлять ими.

1. Запустите командлет New-PSSession для создания сеанса на удаленном компьютере 192.168.8.107 от имени пользователя ma ( -Credential ). Сохраните сессию в переменной $var следующим образом.

 $var = New-PSSession -ComputerName 192. 168.8.107 -Credential ma 

2. Запустите переменную $var , чтобы просмотреть ее содержимое следующим образом:

Как показано ниже, вы должны увидеть объект сеанса с RemoteMachine ComputerType и Состояние установлено на Opened .

Отображение сведений о сеансе

3. Запустите команду Enter-PSSession , чтобы войти в сеанс, сохраненный в $var .

 Enter-PSSession $var 

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

Вход в постоянный удаленный сеанс

4. Создайте переменную $rem1 внутри сеанса. Используйте любое имя переменной и строку идентификатора, которые вам подходят. Вы будете использовать эту переменную позже, чтобы определить, подключились ли вы к тому же сеансу.

 $rem1 = "тот же сеанс" 

5. Выполните приведенную ниже команду, чтобы выйти из удаленного сеанса PowerShell.

 Exit-PSSession 

Отключение от постоянного удаленного сеанса

6. Повторно установите удаленный сеанс PowerShell.

 Enter-PSSession $var 

7. Выполните переменную $rem1 в приглашении удаленного сеанса, как показано ниже, чтобы просмотреть ее значение.

Вы должны увидеть то же значение, которое вы установили ранее перед выходом из удаленного сеанса PowerShell, подтверждая, что вы повторно подключились к тому же сеансу.

Просмотр значения переменной сеанса

8. Запустите Команда Exit-PSSession для повторного выхода из сеанса следующим образом.

 Exit-PSSession 

9. Наконец, выполните Invoke-Command с переключателем сеанса , установленным на $var , чтобы отобразить имя хоста удаленного компьютера в том же удаленном сеансе. Этот метод представляет собой альтернативный способ запуска команд в одном сеансе без ручного подключения, отключения и повторного подключения к одному сеансу.