Вопросы и ответы об удаленном взаимодействии 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-Commandкомандлетов New-PSSessionи Enter-PSSession командлетов при установке подключения. Этот параметр использует более безопасный канал HTTPS вместо HTTP.

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

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

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

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

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

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

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

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

Get-Help <cmdlet-name> -Parameter ComputerName

Например:

Get-Help Get-Hotfix -Parameter ComputerName

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

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

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

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

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

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

Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-Process}

#  - OR -

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

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

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

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

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

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

Enter-PSSession <ComputerName>

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

<ComputerName>\C:>

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

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

Exit-PSSession

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

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

Можно ли создать постоянное подключение?

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

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

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

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

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

Можно ли выполнять команды на нескольких компьютерах одновременно?

Да. Параметр Invoke-Command ComputerName командлета принимает несколько имен компьютеров, а параметр сеанса принимает несколько 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 вы отправляете и получаете объекты live платформа .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.

Можно ли запускать программы 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задает дескриптор безопасности для конфигурации, чтобы разрешить им использовать только члены группы Администратор istrator на компьютере.

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

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

Когда пользователи используют командлеты New-PSSessionили командлеты, они могут использовать Invoke-Commandпараметр ConfigurationName, чтобы указать конфигурацию сеанса, используемую для сеансаEnter-PSSession. Кроме того, они могут изменить конфигурацию по умолчанию, используемую сеансами, изменив значение переменной $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:

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

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

Да. Как правило, команды выполняются без ошибок, хотя может потребоваться использовать параметр Credential объекта Invoke-CommandNew-PSSessionили Enter-PSSession командлетов для предоставления учетных данных члена группы Администратор istrators на удаленном компьютере. Это иногда требуется, даже если текущий пользователь является членом группы Администратор istrators на локальных и удаленных компьютерах.

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

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