about_Remote_FAQ

Краткое описание

Содержит вопросы и ответы о выполнении удаленных команд в PowerShell.

Подробное описание

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

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

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

Да. Для удаленной работы локальные и удаленные компьютеры должны иметь 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 PowerShell 3.0 удаленные сеансы хранятся на удаленном компьютере. Это позволяет отключиться от сеанса и повторно подключиться к другому сеансу или другому компьютеру без прерывания команд или потери состояния.

Является ли удаленное взаимодействие PowerShell безопасным?

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

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

Требуются ли удаленные команды удаленного взаимодействия PowerShell?

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

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

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

  • Get-Process
  • Get-Service
  • Get-WinEvent
  • Get-EventLog
  • Test-Connection

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

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

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

Get-Help <cmdlet-name> -Parameter ComputerName

Пример:

Get-Help Get-Process -Parameter ComputerName

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

Разделы справки выполнить команду на удаленном компьютере?

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

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

Параметр ComputerNameInvoke-Command можно использовать для указания удаленного компьютера. Кроме того, можно создать постоянное подключение к удаленному компьютеру (сеансу), а затем использовать параметр session для Invoke-Command выполнения команды в сеансе.

Например, следующие команды выполняются 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), подключенный к удаленному компьютеру.

При использовании параметра Invoke-CommandComputerName или Enter-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_Jobs.md)] и [about_Remote_Jobs(about_Remote_Jobs.md)].

Можно ли запускать программы Windows на удаленном компьютере?

Удаленные команды 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-CommandNew-PSSessionEnter-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-CommandNew-PSSessionCredential (Учетные данные) или 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?

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

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

about_Remote

about_Profiles

about_PSSessions

about_Remote_Jobs

about_Remote_Variables

Invoke-Command

New-PSSession