Powershell удаленный запуск программ. Знакомимся с удаленным управлением в PowerShell – Hey, Scripting Guy! Blog. в чем же разница

Удаленное управление с помощью PowerShell

Существует довольно много методов для работы с удаленными компьютерами. Есть Windows Management Instrumentation (WMI), широко используемый в VBScript. Есть различные утилиты, которые позволяют осуществлять удаленное управление, типа от Sysinternals. Даже многие командлеты PowerShell имеют параметр ComputerName для выполнения на удаленных компьютерах.

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

PowerShell Remoting решает большинство описанных проблем. Он основан на Microsoft реализации протокола Web Services for Management (WS-Management), а для связи использует службу (WinRM). Связь между компьютерами осуществляется по HTTP (по умолчанию) или HTTPS. Весь трафик между двумя компьютерами шифруется на уровне протокола (за исключением случаев, когда используется SSL). Поддерживаются несколько методов аутентификации, включая NTLM и Kerberos.

В отличие от утилит, использующих различные программные интерфейсы, PS Remoting работает следующим образом: команды, вводимые на локальном компьютере, передаются на удаленный компьютер и там выполняются, затем результат передается обратно. Поскольку все команды выполняются локально, нет необходимости заботится о совместимости. Кроме того, для работы PS Remoting нужен всего один открытый порт на брандмауэре.

Есть несколько способов управления с помощью PowerShell Remoting.

Управление «один к одному»

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

Enter-PSSession -ComputerName SRV4
Restart-Service -Name spooler

Посмотрим состояние сервиса и закроем удаленную сессию:

Get-Service -Name spooler
Exit-PSSession

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

Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName SRV4

Эта команда откроет удаленную сессию на SRV4, выполнит блок команд, указанный в параметре -ScriptBlock , и закроет сессию. А чтобы задание выполнялось в фоновом режиме, дополнительно можно указать параметр -AsJob .

Cледует помнить о том, что при работе в фоновом режиме PowerShell не возвращает результат. Для его получения придется воспользоваться командлетом Receive-Job .

Для того, чтобы выполнить не пару-тройку команд, а какой либо скрипт, у Invoke-Command есть параметр –FilePath , который можно использовать вместо –ScriptBlock для определения файла сценария. Для примера я создал скрипт, который выводит список остановленных служб и запустил его на удаленной машине SRV4:

Invoke-Command -FilePath .\script.ps1 -ComputerName SRV4

Управление «один ко многим»

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

Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName SRV4,SRV5

Поместить в переменную:

$servers = @(″SRV1″,″SRV2″,″SRV3″)
Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName $servers

Или взять из файла:

Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName`
(Get-Content .\servers.txt)

Примечание: у Invoke-Command есть параметр ThrottleLimit , ограничивающий максимальное количество компьютеров, которыми можно управлять одновременно. По умолчанию этот параметр равен 32. При необходимости его можно изменить, но учтите, что повышение этого параметра увеличит нагрузку на процессор и память вашего компьютера, поэтому эту операцию нужно выполнять с большой осторожностью.

Сессии

Каждый раз при выполнении Invoke-Command создается новая сессия, на создание которой тратится время и ресурсы. Чтобы этого избежать мы можем открыть одну сессию, в которой и выполнять все команды. Например, откроем сессию с именем SRV4 на компьютер SRV4 и поместим ее в переменную $session, а затем этой сессии выполним нашу задачу (остановим многострадальный spooler):

$session = New-PSSession -ComputerName SRV4 -Name SRV4
Invoke-Command -ScriptBlock {Get-Service spooler | Stop-Service}`
-Session $session

Сессия будет активна до того момента, пока мы не выйдем из консоли PowerShell. Также сессию можно закрыть — Disconnect-PSSession или удалить — Remove-PSSession .

А теперь несколько интересных возможностей, появившихся в PowerShell 3.0. Если раньше при выходе из сессии или закрытии консоли сессия удалялась, то в PS 3.0 при закрытии сессия переходит в состояние disconnected . Мы можем открыть новый сеанс на этом же (или любом другом) компьютере и выполнить команду прямо в этой отключенной сессии. В качестве примера стартуем на компьютере SRV4 сервис печати, остановленный в прошлый раз:

Invoke-Command -ScriptBlock {Start-Service spooler}`
-ComputerName SRV4 -Disconnected

Еще один вариант использования отключенных сессий — запуск длительных по времени задач. Для примера откроем сессию c именем LongJob на SRV4 и запустим в ней фоновое задание, которое будет выводить список сервисов с интервалом в 1 минуту:

$session = New-PSSession -ComputerName SRV4 -Name LongJob
Invoke-Command -Session $session -ScriptBlock`
{Get-Service | foreach {$_;sleep 60} } -AsJob

Посмотрим, как выполняется задача и закроем сессию:

Receive-Job -Name Job2
Disconnect-PSSession $session

Идем на другой компьютер и открываем консоль, Подключаемся к сессии LongJob и с помощью командлета Receive-PSSession получаем результат выполнения задания:

Connect-PSSession -Name LongJob -ComputerName SRV4
Receive-PSSession -Name LongJob

Или еще вариант, без явного подключения к сессии с помощью Connect-PSSession :

$session = Get-PSSession -Name LongJob -ComputerName SRV4
$job = Receive-PSSession $session -OutTarget Job
Receive-Job $job

Примечание: для того, чтобы результат остался в системе, Receive-Job надо использовать с параметром -Keep .

Неявное удаленное управление

Еще один, довольно нестандартный способ удаленного управления — неявное удаленное управление (Implicit remoting). Используя его можно, не создавая удаленной сессии, локально выполнять командлеты, находящиеся на удаленном компьютере.

Для примера берем обычную рабочую станцию, без установленных средств удаленного администрирования. Создаем удаленную сессию с контроллером домена SRV4 и импортируем в эту сессию модуль Active Directory:

$session = New-PSSession -ComputerName SRV4
Invoke-Command {Import-Module ActiveDirectory} -Session $session

Затем экспортируем из удаленной сессии командлеты Active Directory и помещаем их в локальный модуль RemoteAD:

Export-PSSession -Session $session -CommandName *-AD* -OutputModule RemoteAD`
-AllowClobber

Эта команда создаст в папке WindowsPowerShell\Modules\RemoteAD новый модуль PowerShell. Загружены будут только командлеты с именами, соответствующими шаблону *-AD*. При этом сами командлеты не копируются на локальный компьютер. Локальный модуль служит своего рода ярлыком, а сами команды будут выполняться на удаленном контроллере домена.

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

Импортируем новый модуль в текущий сеанс (в PS 3.0 можно этот шаг пропустить):

Import-Module RemoteAD

А теперь внимание — мы не открываем удаленную сессию с контроллером домена, где расположены командлеты. Не нужно явно запускать этот сеанс - это можно сделать неявно , попытавшись выполнить удаленные командлеты:

New-ADUser -Name BillGates -Company Microsoft
Get-ADUser BillGates

При этом будет восстановлено удаленное подключение к контроллеру домена, после чего команда будет передана на контроллер домена и там выполнена. Результат выполнения будет сериализован в XML и передан по сети на локальный компьютер, где будет выполнена десериализация в объекты, с которыми может работать PowerShell.

Удаленный сеанс будет активным до тех пор, пока вы не закроете консоль или не удалите модуль RemoteAD.

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

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

Резюме : Знакомство с удаленным управлением в Windows PowerShell.

Weekend Scripter: Включаем удаленное управление Windows.

Microsoft Scripting Guy, Ed Wilson на связи. Сегодня я собираюсь опубликовать отрывок из моей новой книги Windows PowerShell 3.0 Step by Step , издаваемой Microsoft Press. Сейчас эта книга доступна для предварительного заказа.

WinRM – Удаленное управление Windows

В Windows Server 2012 WinRM запущен по умолчанию для поддержки выполнения удаленных команд Windows PowerShell. WinRM это имплементация корпорацией Microsoft промышленного стандарта WS-Management Protocol. Поэтому WinRM предоставляет удобный способ доступа к удаленным системам с точки зрения требований к настройке файрвола. Это тот механизм, который используют новые CIM-командлеты. Таким образом, вы можете в любое время подключиться к работающей машине на Windows Server 2012 для запуска команд или открытия интерактивной консоли Windows PowerShell. На Windows 8, с другой стороны, WinRM по умолчанию отключена. Это означает, что первое, что необходимо сделать, это запустить командлет Enable-PSRemoting . При запуске этого командлета происходят следующие шаги:

1. Запускается или перезапускается служба WinRM.

2. Тип запуска службы WinRM устанавливается в автоматический.

3. Создается прослушиватель (listener) для приема подключений по всем IP-адресам.

4. Включается исключение файрвола для трафика WS-Man.

5. Активируется конфигурация Microsoft.powershell

6. Активируется конфигурация Microsoft.powershell.workflow

7. Активируется конфигурация Microsoft.powershell32

В течение этого процесса, функция запрашивает подтверждения на выполнение каждого из действий. Если вы знакомы с действиями, выполняемыми функцией и не собираетесь вносить в ее работу каких-либо изменений, вы можете запустить эту команду с ключом –Force и в этом случае запросы подтверждений выводиться не будут. Синтаксис этой команды приведен ниже.

Enable-PSRemoting –Force

Теперь приведем пример использования функции Enable-PSRemoting в интерактивном режиме, включая всю выводимую информацию.

PS C:\> Enable-PSRemoting

WinRM Quick Configuration

Running command «Set-WSManQuickConfig» to enable remote management of this computer by using the Windows Remote Management (WinRM) service. This includes:

1. Starting or restarting (if already started) the WinRM service

2. Setting the WinRM service startup type to Automatic

3. Creating a listener to accept requests on any IP address

4. Enabling Windows Firewall inbound rule exceptions for WS-Management traffic (for http only).

Do you want to continue?

WinRM has been updated to receive requests.

WinRM service type changed successfully.

WinRM service started.

WinRM has been updated for remote management.

Created a WinRM listener on HTTP://* to accept WS-Man requests to any IP on this machine.

WinRM firewall exception enabled.

microsoft.powershell SDDL:

[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is «Y»):y

Are you sure you want to perform this action?

Performing operation «Set-PSSessionConfiguration» on Target «Name:

microsoft.powershell.workflow SDDL:

O:NSG:BAD:P(A;;GA;;;BA)(A;;GA;;;RM)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD). This will

allow selected users to remotely run Windows PowerShell commands on this computer».

[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is «Y»):y

Are you sure you want to perform this action?

Performing operation «Set-PSSessionConfiguration» on Target «Name:

microsoft.powershell32 SDDL:

O:NSG:BAD:P(A;;GA;;;BA)(A;;GA;;;RM)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD). This will

allow selected users to remotely run Windows PowerShell commands on this computer».

[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is «Y»):y

После того как конфигурация выполнена, можно проверить работоспособность WinRM при помощи командлета Test-WSMan . Если система сконфигурирована верно, выводится информация, подобная следующей.

PS C:\> Test-WSMan -ComputerName w8c504

ProductVersion: OS: 0.0.0 SP: 0.0 Stack: 3.0

Этот командлет также работает с компьютерами с Windows PowerShell 2.0. Пример, приведенный ниже, иллюстрирует запрос к контроллеру домена на Windows Server 2008 с установленным Windows PowerShell 2.0, на котором был сконфигурирован WinRM.

PS C:\> Test-WSMan -ComputerName dc1

wsmid: http: //schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd

ProtocolVersion: http: //schemas.dmtf.org/wbem/wsman/1/wsman.xsd

ProductVendor: Microsoft Corporation

ProductVersion: OS: 0.0.0 SP: 0.0 Stack: 2.0

Если WinRM не сконфигурирован, будет возвращено сообщение об ошибке. В случае операционной системы Windows 8, сообщение будет следующим.

PS C:\> Test-WSMan -ComputerName w8c10

Test-WSMan:

xmlns:f=»http: //schemas.microsoft.com/wbem/wsman/1/wsmanfault» Code=»2150859046″

Machine=»w8c504.iammred.net»>WinRM cannot complete the operation. Verify

that the specified computer name is valid, that the computer is accessible over the

network, and that a firewall exception for the WinRM service is enabled and allows

access from this computer. By default, the WinRM firewall exception for public

profiles limits access to remote computers within the same local subnet.

At line:1 char:1

Test-WSMan -ComputerName w8c10

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CategoryInfo: InvalidOperation: (w8c10:String) , InvalidOperationException

FullyQualifiedErrorId: WsManError,Microsoft.WSMan.Management.TestWSManCommand

Стоит помнить о том, что включение удаленного управления командлетом Enable-PSRemoting не активирует исключение файрвола Remote Management, поэтому попытка пропинговать машину с Windows 8 успехом не увенчается.

PS C:\> ping w8c504

Pinging w8c504.iammred.net with 32 bytes of data:

Request timed out.

Request timed out.

Request timed out.

Request timed out.

Ping statistics for 192.168.0.56:

Packets: Sent = 4, Received = 0, Lost = 4 (100% loss).

В случае же с Windows Server 2012 все работает.

PS C:\> ping w8s504

Pinging w8s504.iammred.net with 32 bytes of data:

<1ms TTL=128

Reply from 192.168.0.57: bytes=32 time<1ms TTL=128

Reply from 192.168.0.57: bytes=32 time<1ms TTL=128

Reply from 192.168.0.57: bytes=32 time<1ms TTL=128

Ping statistics for 192.168.0.57:

Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

Minimum = 0ms, Maximum = 0ms, Average = 0ms

Это все, что касается включения WinRM.

Ed Wilson, Microsoft Scripting Guy

Оригинал:

В данной статье подробно объясняется тема удалённого взаимодействия с использованием PowerShell 2.0. Первым делом нам необходимо запустить службу, с помощью которой будет осуществляться удалённое взаимодействие.

Запускаем службу WinRm
Для удалённого взаимодействия в PowerShell 2.0 используется служба WinRM, которая по умолчанию предустановлена на Windows 7 и Windows 2008 R2. Для более ранних версий операционной системы её требуется устанавливать дополнительно. Указанная служба устанавливается на машину при установке PowerShell 2.0. Для того, чтобы убедиться, в наличии WinRM, запустите консоль PowerShell 2.0 и выполните в ней команду:
Get-Service WinRm
Результат будет выглядеть следующим образом:

Status Name DisplayName ------ ---- ----------- Stopped winrm Windows Remote Management (WS-Manag...

Как видим – служба присутствует, однако не запущена. Для того, чтобы запустить WinRm, необходимо с правами администратора, из консоли PowerShell 2.0, выполнить команду:
Enable-PSRemoting
На запрос о подтверждении запуска службы, нажимаем кнопку «Y». Теперь службе WinRM назначен тип запуска «Автоматический», т.е. она будет запускаться каждый раз при старте компьюрета. Команда Enable-PSRemoting не только запускает службу и меняет её тип запуска, но и настраивает должным образом брандмауэр, для её корректной работы. Служба WinRm принимает запросы с любого IP-адреса.

Запрашиваем имена всех подключенных провайдеров:
Get-PSProvider
Как видим, у нас теперь появился ещё один провайдер под именем WSMan.
Назначение доверенных узлов

В консоли PowerShell 2.0 запускаем с правами администратора команды:

Set-Location –Path WSMan: Set-Location –Path localhost\client Get-ChildItem

Примечание
Обратите внимание на то, что в первой команде значение параметра –Path завершается двоеточием, поскольку это провайдер.

На том компьютере, с которым вы желаете удалённо работать, следует указать, каким серверам позволено подключение к этой машине. Такие серверы известны как "доверенные узлы". Таким образом, если вы находитесь на сервере "MyServer", то прежде чем вы сможете удалённо работать с компьютером "MyComputer", следует настроить доверенные узлы (TrustedHosts). Указанный ниже способ назначения доверенных узлов используется в том случае, когда компьютер не входит в состав домена Active Directory. Если же компьютер входит в состав домена Active Directory, то настройки TrustedHosts можно сконфигурировать через групповую политику (Group Policy).

Важно!
Приведённая ниже команда не будет работать, если текущим каталогом не установлен WSMan:\localhost\client (см. вызов команд, выполненный нами выше).

Set-Item TrustedHosts *

Можно запустить команду из другого каталога, но тогда потребуется указать полный путь к TrustedHosts:

Set-Item WSMan:\localhost\Client\TrustedHosts *

На запрос о подтверждении жмём клавишу «Y».

Для того, чтобы PowerShell увидел изменения, выполненные нами в настройках TrustedHosts - необходимо перезапустить службу WSMan. Это делается с помощью следующей команды:
Restart-Service winrm

Аналогичное действие можно выполнить из под DOS. Запустите команду winrm -?. Вы увидите общую справку по команде. Для того, чтобы посмотреть текущее значение TrustedHosts, следует выполнить команду:

winrm get winrm/config/client

а для того, чтобы установить значение - следует выполнить:

winrm set winrm/config/client/ @{TrustedHosts="*"}

В приведённых выше командах, для TrustedHosts, в качестве значения указывался символ «*», однако, вместо него можно указывать имена конкретных серверов. Управление TrustedHosts является классическим случаем, для применения PowerShell-глаголов "Get" и "Set" в связке: вы используете Get-Item и Set-Item.
Создание и завершение удалённого сеанса PowerShell 2.0
В приведённых ниже командах, вместо "IpAddress" следует указывать нужный IP-адрес, а вместо "FQDN " - полностью определённое имя домена (Fully Qualified Domain Name):

Enter-PSSession IpAddress

Enter-PSSession FQDN

Для завершения сеанса удалённой работы, следует выполнить команду:

Команде Enter-PSSession требуется полностью.определённое.доменное.имя. Например, в случае MyServer.domain.local, простое указание MyServer не сработало бы, однако использование IP-адреса всегда хорошо работает в подобных ситуациях. Альтернативный метод PSSession:

New-PSSession -computername testMachine2 Get-PSSession

Завершить работу этой сессии можно так:

Get-PSSession | remove-PSSession

Если вы хотите протестировать удалённую работу, но не имеете второй машины, тогда создайте "удалённое подключение" вашего компьюетера к себе самому. Например, если ваша машина называется "MyMachine", тогда попробуйте это:

New-PSSession -computername MyMachine

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

Работа в удалённом сеансе PowerShell 2.0
После создания удалённого подключения, вы можете организовывать конвейры команд, запуская их в консоли PowerShell 2.0, но при этом выполняться они будут на удалённой машине, как будто вы находитесь за её клавиатурой и набираете команды там, а не здесь. Например, запустите такую команду и посмотрите результат её работы:

Set-Location c:\ | Get-childitem

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

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

Как только удалённое подключение у вас заработает, это сразу даёт вам возможность использовать PowerShell 2.0 для управления компьютерами, подключенными к вашей сети. Теперь вы можете выполнять сценарии на других машинах. В PowerShell 2.0 многие командлеты поддерживают параметр "-computerName", но удалённое подключение позволяет вам использовать команды семейства PSSession, а так же вызывать Invoke-Command (т.е. вы можете делать всё что угодно).

Поиск и устранение проблем, возникающих в процессе удалённой работы PowerShell 2.0

Одна типичная проблема – ОШИБКА «Access is denied» (доступ запрещён).

Решение:
Запустите PowerShell 2.0 с правами администратора. Попробуйте на обоих машинах (на той, с которой подключаетесь, и на той, к которой подключаетесь) задать настройке "TrustedHosts" значение * (звёздочка). Только не забывайте, что такой вариант разрешает подключения отовсюду.
Не забудьте перезапустить службу WinRm, иначе выполненные вами для "TrustedHosts" изменения не вступят в силу. Для перезапуска службы следует в консоли PowerShell 2.0 выполнить команду: Restart-Service WinRm
Кроме того, будьте внимательней и не путайте имя провайдера WSMan с именем службы WinRm.
Ещё один странный, но порой помогающий совет: Попытайтесь повторить попытку удалённого подключения. Странно, но это может не сработать с первой попытки, но сработать со второй или третьей. Т.е. вам нужно повторно выполнить команду: Enter-PSSession -computerName myOtherMachineName

Брандмауэры, PowerShell 2.0 и «The rpc server is unavailable» (Сервер RPC не доступен)
Специалисты по безопасности в ужасе поднимут руки от такого предложения, однако в случае получения указанной выше ошибки, я предлагаю вам отключить брандмауэр на обоих компьютерах. Если после отключения всё заработает - это хорошо, значит нужно проверить задействованность портов 135 и 445. Настройте для этих портов исключения в брандмауэрах - это даст возможность PowerShell 2.0 работать удалённо и при этом брандмауэр защитит компьютер от угроз.

P.S. я читал, что команда Enable-PSRemoting должна брать на себя автоматическое внесение изменений в настройки брандмауэра, но по моему опыту это не всегда так.
О том, как с помощью групповой политики отключить брандмауэр в Windowws 8, читайте .

Два типа, использующихся для удалённой работы в PowerShell 2.0
Пора сообщить, что существуют два варианта удалённой работы в PowerShell 2.0.
Первый способ - это более изощрённая вариация, в которой используются командлеты, создавая устойчивый канал ко второй машине. Имена таких команд содержат в качестве существительного слово "PSSession" (напоминаю, что имена командлетов строятся по правилу "Глагол-Существительное"). Получить перечень этих командлет можно с помощью такой команды:

Get-Command -noun PSSession

Второй способ - это так же более каноническая форма удалённой работы PowerShell 2.0. Данный способ просто расширяет локальные команды, добавляя к ним параметр "-computerName", с помощью которого указывается удалённо расположенный компьютер, на котором необходимо выполнить операцию. В результате, такие команды будут запущены на другой машине, находящейся в сети:

Get-Process -computerName machine2

Перечень командлет, которые можно использовать таким простым способом (т.е. тех, что имеют в своём составе параметр "-computerName") можно получить с помощью такой команды:

Get-command | where { $_.parameters.keys -contains "ComputerName"}

Полный же перечень командлет, которые могут работать по второму способу, можно получить так:

Get-command | where { $_.parameters.keys -contains "ComputerName" -and ($_.parameters.keys -notContains "Session")}

Подводим итог об удалённой работе в PowerShell 2.0
Секрет в том, чтобы удалённо работать с помощью PowerShell 2.0 в том, что нужно понять основные вещи:
Следует установить WinRm.
С помощью команды Enable-PSRemoting необходимо разрешить удалённое взаимодействие.
Нужно выполнить настройку TrustedHosts (например задать ей в качестве значения *).
В случае использования команды Enter-PSSession, следует не забывать указывать полностью определённое имя узла или же его IP-адрес.

Англоязычный источник изложенной и немного переработанной мною информации .

# Создаём новую сессию подключения к удалённой машине $s = New-PSSession -computername TestComputer

# Выполняем на удалённой машине произвольные действия, например - смотрим содержимое каталога C:
Invoke-Command -Session $s -ScriptBlock {ls c:\}

# Создаём на удалённой машине каталог "%ProgramFiles%\MyCompany\MySoft"
Invoke-Command -Session $s -ScriptBlock {New-Item -Path "$env:ProgramFiles\MyCompany\MySoft" -ItemType directory}

# Однако, гораздо удобней не вручную вбивать команды, а запускать на удалённой машине уже готовый скрипт:
Invoke-Command -Session $s -FilePath "\\ServerDir\Common Scripts\MyScript.ps1"

# Завершаем сессию
$s | remove-PSSession

04.03.2011 Билл Стюарт

В версии Windows PowerShell 2.0 реализован альтернативный механизм подключения к удаленным компьютерам, именуемый remoting (удаленное взаимодействие). Этот механизм использует средства службы дистанционного управления Windows (Windows Remote Management, WinRM). Он обеспечивает подключение к удаленному компьютеру, а также запуск команд, выполняемых на этом удаленном компьютере

Разработка оболочки PowerShell 1.0 стала настоящим прорывом в развитии средств управления и автоматизации Windows XP, а также более поздних версий платформы ОС Windows. Базирующаяся на платформе. NET Framework технология PowerShell 1.0 включает в себя единообразную структуру команд (cmdlets), она наделена мощными встроенными средствами форматирования выходных данных и обеспечивает значительное повышение доступности других технологий, и прежде всего - инструментария управления Windows (WMI). Однако, хотя некоторые составные команды PowerShell 1.0 и объекты. NET могут подключаться к удаленным компьютерам, эта функция реализуется дифференцированно, в зависимости от конкретного случая. Команды, поддерживающие удаленные соединения, имеют параметр -ComputerName; кроме того, при установлении соединений они используют либо вызовы удаленных процедур (RPC), либо модель DCOM.

Во многих ситуациях RPC и DCOM хорошо справляются с задачами управления, однако при выполнении процедур диагностики и при выявлении причин неполадок порой возникают проблемы. К примеру, команда Get-Service может считывать данные служб с удаленного компьютера с помощью параметра -ComputerName, однако эта команда не имеет параметра -Credential, и потому для ее выполнения следует зарегистрироваться с учетной записью, имеющей разрешение на доступ к удаленной системе.

Но уже в версии Windows PowerShell 2.0 реализован альтернативный механизм подключения к удаленным компьютерам, именуемый remoting (удаленное взаимодействие). Этот механизм использует средства службы дистанционного управления Windows (Windows Remote Management, WinRM). Он обеспечивает подключение к удаленному компьютеру, а также запуск команд, выполняемых на этом удаленном компьютере. Поясню сказанное на примере. Средства подключения к удаленному рабочему столу относятся к графическому интерфейсу пользователя так же, как удаленное взаимодействие к командной строке оболочки PowerShell. Когда вы запускаете составную команду с использованием механизма удаленного взаимодействия, команда фактически выполняется на удаленном компьютере, но полученные результаты вы можете видеть на локальной машине.

Где можно получить Windows PowerShell 2.0

Оболочка PowerShell 2.0 и служба WinRM входят в состав систем Windows 7 и Windows Server 2008 R2, так что, если вы используете эти операционные системы, нет необходимости устанавливать данные компоненты. Если же вы работаете с системами Windows Vista SP2, Windows XP SP3, Windows Server 2008 SP2 или Windows Server 2003 SP2, вам придется загрузить и установить пакет Windows Management Framework Core (support.microsoft.com/kb/968930).

Включение функции удаленного взаимодействия

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

  1. Должна быть активирована служба WinRM.
  2. Должен быть установлен прослушиватель WinRM, который принимает соединения с одного или нескольких IP-адресов.
  3. Сетевой экран Windows должен быть сконфигурирован таким образом, чтобы появилась возможность установления соединений через WinRM.
  4. Должен быть включен и надлежащим образом сконфигурирован сеанс PowerShell.

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

Чтобы пользователи могли как можно скорее приступить к работе, разработчики Microsoft PowerShell создали команду Enable-PSRemoting, обеспечивающую автоматическую настройку упомянутых компонентов. Эту настройку нужно выполнять не на машине, с которой вы будете осуществлять удаленное взаимодействие, а на компьютере, к которому вы будете обращаться дистанционно. Выполнять команду Enable-PSRemoting можно лишь в в том случае, если вы работаете с оболочкой PowerShell с правами администратора. Если вы работаете с машинами Windows Vista, Server 2008 и более поздних версий, правой кнопкой мыши щелкните на значке PowerShell и в раскрывшемся меню выберите пункт Run as administrator. Если вы запустите команду Enable-PSRemoting с параметром -Force, при ее выполнении система не будет обращаться к вам за разрешением на выполнение каждого этапа конфигурации. Чтобы получить более подробные сведения о составной команде Enable-PSRemoting, выполните команду

Get-Help Enable-PSRemoting

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

Самый простой способ подключиться к среде PowerShell на удаленном компьютере - воспользоваться командой Enter-PSSession. По умолчанию эта команда выполняется с параметром -ComputerName, поэтому при ее вводе с клавиатуры данный параметр можно не указывать. К примеру, для установления соединения с удаленным компьютером с именем rigel надо ввести с клавиатуры

PS C:\> Enter-PSSession rigel

Обратите внимание: для полноты картины я включаю в текст приглашение. Вам же не нужно вводить приглашение как часть команды.

После того как вы введете дистанционный сеанс, синтаксис приглашения PowerShell изменится. Теперь оно будет включать в себя заключенное в квадратные скобки имя удаленного компьютера; это будет означать, что вы установили соединение с удаленным компьютером. В данном случае приглашение будет выглядеть так:

: PS C:\>

После установления дистанционного подключения все команды, введенные вами в командной строке, будут выполняться на удаленной машине. Так, если вы введете команду

: PS C:\> Get-ChildItem C:\

команда Get-ChildItem будет выполнена на удаленной машине. Ее выходные данные будут содержать имена файлов и папок, хранимых в накопителе C удаленного компьютера. Чтобы завершить сеанс удаленного взаимодействия, воспользуйтесь командой Exit-PSSession

: PS C:\> Exit-PSSession

Выполнение блока сценария (Scriptblock) на удаленном компьютере

Удаленное взаимодействие с помощью PowerShell позволяет выполнять на удаленном компьютере блок сценария, или scriptblock (то есть блок кода PowerShell, заключенный в фигурные скобки). Для этого нужно воспользоваться командой Invoke-Command с параметром -ComputerName. К примеру, в команде, отображенной на экране 1, я использовал команду Invoke-Command, с тем чтобы выполнить Get-ChildItem на удаленном компьютере. Просматривая экран 1, обратите внимание на то, что для установления соединения с удаленным компьютером перед тем, как запустить блок сценария, я не использовал команду Enter-PSSession. Команды Enter-PSSession и Invoke-Command - это два различных метода удаленного взаимодействия.

Первым параметром команды Invoke-Command является параметр -ScriptBlock; он указывает на код, который вы собираетесь выполнить. На экране 1 я опустил имя параметра -ScriptBlock, поскольку указывать его необязательно. Параметр -ComputerName содержит имя удаленного компьютера. Как можно увидеть в выходных данных команды Get-ChildItem, среда PowerShell для удобства оператора даже указывает имя удаленного компьютера в столбце PSComputerName выходных данных.

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

Блок сценария можно выполнять и на нескольких удаленных компьютерах. Это называется конфигурацией «один ко многим» или веерным развертыванием. На экране 1 параметр -ComputerName команды Invoke-Command содержит одно имя, однако в него можно включать и несколько имен компьютеров. Так, команда

PS C:\> Invoke-Command {Get-ChildItem env: co*} -Computer titan, rigel

обеспечивает выполнение команды Get-ChildItem на двух удаленных компьютерах. В тексте статьи данная команда разбита на несколько строк, однако в консоли PowerShell ее следует вводить одной строкой. То же касается и других команд, разделенных на несколько строк. Так же, как и на экране 1, столбец PSComputerName в выходных данных будет содержать имена компьютеров.

Выполнение блока сценария в фоновом режиме

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

Чтобы запустить фоновое задание на локальном компьютере, можно воспользоваться командой Start-Job. Но надо сказать, что данная команда не имеет параметра -ComputerName, а это значит, что ее нельзя использовать для выполнения фонового задания на удаленной машине. Вместо этого вам нужно будет выполнить команду Invoke-Command с параметром -AsJob. Так, верхняя команда на экране 2 инициирует выполнение блока сценария в виде фонового задания на удаленном компьютере titan. После того как я ввел эту команду, на экране сразу же появилось приглашение: оболочка PowerShell отправила блок сценария для выполнения на удаленный компьютер и после этого вернула мне управление. В предупреждении говорится, что выполненная команда не уместилась в окне консоли и потому не была включена в выходные данные. Если бы окно консоли у меня было шире, средство форматирования оболочки PowerShell включило бы команду в перечень выходных данных. В столбцах Id и Name указывается задание (его идентификатор и понятное имя соответственно), а в столбце State указывается, в каком состоянии находится задание: выполняется, приостановлено или завершено. В столбце HasMoreData содержится информация, свидетельствующая о том, что извлечены все данные, касающиеся того или иного задания, или что задание содержит больший объем сведений, которые следует извлечь.

Чтобы установить, завершено ли выполнение фонового задания, вы можете выполнить команду Get-Job, как показывает вторая команда на экране 2. Если при этом вы не используете каких-либо параметров, Get-Job проверяет состояние всех заданий, запущенных в ходе текущего сеанса. Если у вас выполняется несколько заданий одновременно, можете использовать такие параметры, как -Id или -Name, для указания на то, какое именно задание вы хотите проверить. Когда выполнение фонового задания завершится, столбец State выходных данных будет иметь значение Completed.

Для считывания результатов выполнения фонового задания можно использовать команду Receive-Job. Эта команда, как и команда Get-Job, возвращает выходные данные всех заданий, запущенных в ходе текущего сеанса, если вы не использовали параметр для указания на то, какое именно задание вас интересует. Так, последняя команда на экране 2 включает в себя параметр -Id, который указывает на то, что необходимо получить выходные данные о задании с идентификатором 9. Я опустил имя параметра -Id, поскольку его указывать необязательно. На экране 3 отображены последние строки выходных данных, касающихся выполнения рассматриваемого дистанционного фонового задания.

Создание сеансов PowerShell

Приведенные выше примеры показывают, как получить доступ к приглашению PowerShell на удаленной машине и как выполнять команды на удаленных компьютерах. Но я пока не упоминал о том, что удаленное взаимодействие всегда осуществляется в контексте сеанса. Сеанс - это, скажем так, место обитания PowerShell. Когда вы открываете окно консоли PowerShell или окно интегрированной среды сценариев (ISE) PowerShell, вы создаете сеанс. Без использования средств удаленного взаимодействия все сеансы выполняются на локальном компьютере и не зависят друг от друга. Во всех приведенных выше примерах удаленного взаимодействия создаются временные сеансы, которые автоматически прекращаются по завершении удаленного взаимодействия. Кроме того, существует возможность создавать экземпляры сеансов удаленного взаимодействия и повторно использовать их. Такой подход гораздо эффективнее в случаях, когда необходимо обращаться к удаленным компьютерам более одного раза.

Для создания новых сеансов используется команда New-PSSession с параметром -ComputerName. Имя этого параметра в командах можно опускать. Так, команда

C:\> $sessions = New-PSSession phineas, ferb, perry

создает три сеанса на трех компьютерах с именами phineas, ferb и perry. Вы можете просмотреть эти сеансы, создав переменную $sessions. Для этого в командной строке нужно ввести имя

$sessions

и нажать клавишу ввода. Параметр -Session команды Invoke-Command поддерживает объекты session, созданные с помощью команды New-PSSession, поэтому далее вы можете использовать команду, подобную следующей:

C:\> Invoke-Command {Get-ChildItem} -session $sessions

Эта команда выполняет команду Get-ChildItem на машинах phineas, ferb и perry, но не разрывает соединения. Вы можете добавить параметр -AsJob и выполнить команду в фоновом режиме:

C:\> Invoke-Command {Get-ChildItem} -session $sessions -asjob

Новый подход к работе

Удаленное взаимодействие с помощью средств PowerShell - это новый мощный механизм выполнения команд на удаленных компьютерах. Надеюсь, эта статья подвигнет вас на исследование новых возможностей. Более подробные сведения об удаленном взаимодействии, включая проблемы диагностики, можно найти в справочных темах PowerShell about_Remote по адресу technet.microsoft.com/en-us/library/dd347616.aspx .

Билл Стюарт ([email protected]) - системный и сетевой администратор компании French Mortuary, Нью-Мехико



powershell удаленный запуск приложения

Запуск интерактивного сеанса

Чтобы запустить интерактивный сеанс с одним удаленным компьютером, используйте командлет Enter-PSSession. Например, чтобы запустить интерактивный сеанс с удаленным компьютером Server01, введите:
enter-pssession Server01
В командной строке отобразится имя компьютера, к которому вы подключены. В дальнейшем все команды, введенные в командной строке, будут запускаться на удаленном компьютере, а результаты отобразятся на локальном компьютере.
Чтобы завершить интерактивный сеанс, введите:
exit-pssession

Выполнение удаленной команды

Чтобы выполнить любую команду на одном или нескольких удаленных компьютерах, используйте командлет Invoke-Command. Например, чтобы выполнить команду Get-UICulture на удаленных компьютерах Server01 и Server02, введите:

Invoke-command -computername Server01, Server02 {get-UICulture}
Выходные данные будут возвращены на ваш компьютер.
Чтобы запустить сценарий на одном или нескольких удаленных компьютерах, используйте параметр FilePath командлета Invoke-Command. Сценарий должен быть включен или доступен для локального компьютера. Результаты будут возвращены на локальный компьютер.
Например, следующая команда выполняет сценарий DiskCollect.ps1 на удаленных компьютерах Server01 и Server02.
invoke-command -computername Server01, Server02 -filepath c:\Scripts\DiskCollect.ps1

Установка постоянного подключения
Чтобы выполнить ряд связанных команд с общими данными, создайте сеанс на удаленном компьютере, а затем используйте командлет Invoke-Command для выполнения команд в созданном сеансе. Чтобы создать удаленный сеанс, используйте командлет New-PSSession.
Например, следующая команда создает удаленный сеанс на компьютере Server01 и другой удаленный сеанс на компьютере Server02. Она сохраняет объекты сеанса в переменной $s.
$s = new-pssession -computername Server01, Server02
После установки сеансов в них можно выполнить любую команду. Так как сеансы являются постоянными, вы можете собирать данные в одной команде и использовать их в последующей.
Например, следующая команда выполняет команду Get-Hotfix в сеансах в переменной $s и сохраняет результаты в переменной $h. Переменная $h создается в каждом сеансе в $s, но она не существует в локальном сеансе.
invoke-command -session $s {$h = get-hotfix}
Теперь данные в переменной $h можно использовать в последующих командах, таких как следующая. Результаты отобразятся на локальном компьютере.

Invoke-command -session $s {$h | where {$_.installedby -ne "NTAUTHORITY\SYSTEM"}

Всё взято с https://technet.microsoft.com/ru-ru/library/dd819505.aspx

Подключение