Не удается подключиться к удаленному компьютеру с помощью PowerShell. Powershell подключение к удаленному компьютеру


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

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

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

PowerShell Remoting решает большинство описанных проблем. Он основан на Microsoft реализации протокола Web Services for Management (WS-Management), а для связи использует службу  Windows Remote 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 spoolerExit-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 SRV4Invoke-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 SRV4Receive-PSSession -Name LongJob

 

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

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

 

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

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

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

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

$session = New-PSSession -ComputerName SRV4Invoke-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 MicrosoftGet-ADUser BillGates

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

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

 

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

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

windowsnotes.ru

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

Ниже приведён список командлетов имеющих параметр ComputerName:Clear-EventLogGet-CounterGet-EventLogGet-HotFixGet-ProcessGet-ServiceGet-WinEventGet-WmiObjectLimit-EventLogNew-EventLogRemove-EventLogRestart-ComputerStop-ComputerShow-EventLogTest-ConnectionWrite-EventLog

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

Get-Service -ComputerName Server01

Get-Service -ComputerName Server01

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

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.

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.

$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.

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

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

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

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

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

 

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

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

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

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 в каждом из сеансов.

$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.

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:

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

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

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

 

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

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

coolcode.ru

PowerShell Remoting — настройка и удаленное управление / Хабр

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

Наиболее простой путь сконфигурировать удаленное управление это выполнить Enable-PSRemoting в оболочке powershell с правами администратора. При этом произойдет следущее:

  • запустится служба WinRM (если запущена перезапустится)
  • служба WinRM перейдет в состояние — автоматический запуск при старте
  • будет создан прослушиватель WinRM для HTTP трафика на порту 5985 для всех локальных IP адресов
  • будет создано правило файрвола для прослушивателя WinRM. Внимание, этот пункт завершится с ошибкой если любая из сетевых карточек имеет тип сети «публичная», т.к. открывать порт на такой карточке не хорошо. Если у вас при конфигурировании вышла такая ошибка измените профиль это сетевушки командлетом Set-NetConnectionProfile и после этого запустите Enable-PSRemoting снова. Если вам нужна сетевая карточка с профилем «Публичная сеть» запустите Enable-PSRemoting с параметром -SkipNetworkProfileCheck в этом случае будут созданы правила файрвола только из локальной сети.
После этого нужно разрешить подключаться к удаленной машине с той машины с которой будет происходить управление. Сделано это в целях безопасности для того чтобы уменьшить риск взлома сессии удаленного управления или DNS с подстановкой себя вместо удаленной машины и предотвратить исполнение скриптов на машинах которые вы принудительно не разрешили.

для проверки куда можно подключаться используем:

get-item wsman:\localhost\Client\TrustedHosts для разрешения подключаться ко всемset-item wsman:localhost\client\trustedhosts -value * Если вы открываете доступ для всех указав * то WinRM будет подключаться ко ВСЕМ машинам без проверки. Помните, что вы открываете самого себя для потенциального взлома из локальной сети. Лучше указывать адреса хостов куда вам нужно подключится, тогда WinRM будет отклонять все остальные адреса или имена. Если машина с которой ведется управление находится в домене она будет доверять всем машинам этого домена. Если она не в домене, или в другом домене, то нужно указать в TrustedHosts адрес или имя машины на которую мы будем подключаться. Добавлять себя на машине к которой мы подключаемся не нужно.

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

###################################################################################### # добавляет NewHost в список TrustedHost с фильтрацией если такая строка уже есть # можно дергать из командной строки указывая параметр напрямую например # .\Add-TrustedHost.ps1 192.168.2.1 ###################################################################################### param ( $NewHost = '192.168.2.89' ) Write-Host "adding host: $NewHost" $prev = (get-item WSMan:\localhost\Client\TrustedHosts).value if ( ($prev.Contains( $NewHost )) -eq $false) { if ( $prev -eq '' ) { set-item WSMan:\localhost\Client\TrustedHosts -Value "$NewHost" } else { set-item WSMan:\localhost\Client\TrustedHosts -Value "$prev, $NewHost" } } Write-Host '' Write-Host 'Now TrustedHosts contains:' (get-item WSMan:\localhost\Client\TrustedHosts).value он проверяет на есть ли такая запись, если нет то добавляет в список. Вызывать можно из командной строки указав адрес или имя.

Есть разница указывать имя или адрес. Если в TrustedHosts будет только адрес то открыть сессию по имени не получится, и наоборот — если указать имя то прицепится по адресу не получится. Учитывайте это.

Часто встречается ссылка на команду

WinRM quickconfig это не тоже самое что Enable-PSRemotingв чем же разницаEnable-PSRemoting делает больше действий чем «winrm quickconfig». Командлет Set-WSManQuickConfig делает точно такие же действия как «winrm quickconfig». Enable-PSRemoting запускает Set-WSManQuickConfig когда ведет настройку системы

Set-WSManQuickConfig делает следущие действия:

  1. запускат WinRM сервис
  2. устанавливает автостарт службы WinRM в автоматический
  3. создает прослушиватель
  4. добавляет исключения файрвола
Enable-PSRemoting кроме этого делает еще следущее
  1. включает все зарегистрированные конфигурации сессий PowerShell для получения инструкций от удаленных машин
  2. регистрирует конфигурацию если она не зарегистрирована «Microsoft.PowerShell»
  3. регистрирует конфигурацию если она не зарегистрирована «Microsoft.PowerShell32» на 64 битных машинах
  4. убирает запрет «Deny Everyone» из дескриптора безопасности всех конфигураций сессий
  5. перезапускает сервис WinRM
источникEnable-PSRemoting TechNetSet-WSManQuickConfig TechNetУдаленные подключения1. Сессии 1-to-1 открываются командойEnter-PSSession -ComputerName Test Вы получите оболочку на удаленной машине. Подключится можно к самому себе указав localhost. Альтернативные кредиталы указываются с параметром -Credential, выход происходит командлетом Exit-PSSession

Ограничения следующие:

  • нельзя сделать второй прыжок — только 1 сессия, внутри сессии подключиться дальше нельзя
  • вы не можете использовать команды имеющие графический интерфейс. Если вы это сделаете оболочка повиснет, нажмите Ctrl+C чтобы отвисло
  • вы не можете запускать команды имеющие свой собственый шел, например nslookup, netsh
  • вы можете запускать скрипты если политика запуска на удаленной машине позволяет их запускать
  • нельзя прицепится к интерактивной сессии, вы заходите как «network logon», как будто прицепились к сетевому диску. Поэтому не запустятся логон скрипты, и вы можете не получить домашнюю папку на удаленной машине (лишний довод чтобы не мапать хом фолдеры логон скриптами)
  • вы не сможете взаимодействовать с юзером на удаленной машине даже если он туда залогинен. Не получится показать ему окошко или попечатать чтонибудь ему.
этот способ лучше всего для простых операций, зашел, подергал сервер и отключился. Если нужно удержать переменные в скопе, нужна длительная операция (много часов или дней), нужно больше возможностей по администрированию то нужно использовать технику попродвинутее.Комментарий. объекты переданные по сети обрезаются и перестают быть живыми. У них удаляются методы, свойства остаются. Вытащить объект на свою машину, поколдовать и засунуть обратно не получится. Если нужно больше пишите, допишу отдельно.

2. Сессии 1-to-many

Invoke-Command определяем что будем исполнять так:$sb = { команды для удаленной машины разделенные точкой с запятой } передаем на удаленные машины Test1 и Test2Invoke-Command -ComputerName Test1, Test2 -ScriptBlock $sb за раз можно забросить на 32 машины. Если альтернативные кредиталы то используем параметр -Credential

Чтобы передать целиком скрипт вместо параметра -ScriptBlock пишем -FilePath, удаленной машине НЕ нужно иметь доступ к файлу, он будет разобран на запчасти, передан через HTTP и выполнен с той стороны.

Запомним что на той стороне будет новый скоп, так что ваш скрипт не получит значений из вашей консоли, а переменные скрипта могут оказаться на той стороне пустыми. Поэтому передавайте сразу целиком готовые инструкции и скрипты с параметрами. для полноценного использования Invoke-Command надо уметь превращать строки в скрипт блоки. Например у вас есть команды которые зависят от какогото списка, вам нужно сгенерировать строку, превратить ее в ScriptBlock и отправить на удаленный комп:$sb = [Scriptblock]::Create( $SomeString ) kuda78 В статье пропущен очень важный момент — передача параметров в скрипт на удаленной машине.

$deployRemote = { param( [string]$targetEnvName, [string]$targetUsername) $Global:ErrorActionPreference = «Stop» #… }

Invoke-Command -Session $session -ScriptBlock $deployRemote -ArgumentList ($targetEnvName, $targetUsername)

Да действительно пропущен. Сделал сознательно чтобы не загромождать обзор параметрами и описаниями. Спасибо. Параметр -ArgumentList работает как со скрипт блоками так и со сценариями

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

Создание сессии происходит командлетом New-PSSession, результат можно поместить в переменную

$DC01 = New-PSSession -ComputerName DC01 $Controllers = New-PSSession DC01, DC02, DC03 использовать можно такие же параметры подключения как в Invoke-Command

Как использовать: если 1-to-1

Enter-PSSession -Session $DC01 если 1-to-manyInvoke-Command -Sessions $Controllers -ScriptBlock {get-eventlog -logname security -newest 50} посмотреть какие сессии открыты можно с помощью Get-PSSession, закрыть Remove-PSSession закрыть вообще все сессииGet-PSSession | Remove-PSSession прицепится к сессии можно с помощью Connect-PSSession, отключиться через Disconnect-PSSession

Invoke-Command может создать сразу disconnected сессию, он отправляет команды на исполнение и отключатся, позже можно подключится и сгрузить результаты работы. Делается это параметром -Disconnected. Получение результатов через командлет Recieve-PSSession.

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

habr.com

powershell - Не удается подключиться к удаленному компьютеру с помощью PowerShell

Я подключаюсь с одного компьютера на другой удаленный компьютер с powershell.

Для этого я сделал некоторую конфигурацию на обоих компьютерах в соответствии с этим видео:

https://technet.microsoft.com/en-us/itmanagement/ff765030.aspx

Но все-таки я получаю сообщение об ошибке при попытке сделать это на локальном компьютере:

enter-pssession -comp remotePC -credential domain\username

Затем введите пароль и нажмите enter.

Я получаю эту ошибку:

Подключение к удаленному серверу Ошибка LocalPC произошла со следующим сообщением об ошибке:

The WS-Management service cannot process the request. The service is configured to not accept any remote shell requests. For more CategoryInfo : OpenError: (LocalPC:String) [], PSRemotingTrans portException + FullyQualifiedErrorId : RemoteSessionDisallowed,PSSessionStateBroken

"Удаленное управление Windows" -Услуги запускается на удаленном ПК.

Я полностью отключил брандмауэр для цели тестирования на удаленном ПК.

Я также сделал enable-psremoting и Set-Item WSMan:\localhost\Client\TrustedHosts *

Когда я выполняю на удаленном ПК:

winrm config говорится:

WinRM service is already running on this machine. WinRM is already set up for remote management on this computer.

Что еще из 1000 вещей мне еще нужно включить, чтобы я мог подключиться к удаленному компьютеру с помощью powershell?

UPDATE

PS C:\Windows\system32> winrm get winrm/config/service Service RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;; MaxConcurrentOperations = 4294967295 MaxConcurrentOperationsPerUser = 1500 EnumerationTimeoutms = 240000 MaxConnections = 300 MaxPacketRetrievalTimeSeconds = 120 AllowUnencrypted = false Auth Basic = false Kerberos = true Negotiate = true Certificate = false CredSSP = false CbtHardeningLevel = Relaxed DefaultPorts HTTP = 5985 HTTPS = 5986 IPv4Filter = * IPv6Filter = * EnableCompatibilityHttpListener = false EnableCompatibilityHttpsListener = false CertificateThumbprint AllowRemoteAccess = true PS C:\Windows\system32> winrm e winrm/config/listener Listener Address = * Transport = HTTP Port = 5985 Hostname Enabled = true URLPrefix = wsman CertificateThumbprint ListeningOn = xx.xx.xx.xx, 127.0.0.1, ::1, fe80::4c2c:a8d0:6046:764d%11

ОБНОВЛЕНИЕ 2

PS C:\Windows\system32> dir WSMan:\localhost\Shell\ WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Shell Type Name SourceOfValue Value ---- ---- ------------- ----- System.String AllowRemoteShellAccess GPO false System.String IdleTimeout 7200000 System.String MaxConcurrentUsers 10 System.String MaxShellRunTime 2147483647 System.String MaxProcessesPerShell 25 System.String MaxMemoryPerShellMB 1024 System.String MaxShellsPerUser 30

qaru.site

Как правильно организовать удаленное подключение к компьютеру с помощью PowerShell Remoting (RPC, WMI, WinRM)?

Есть два компьютера (оба под учетными записями Microsoft). Один подключен напрямую к роутеру (Win 10), второй через WIFI (Win 8.1 (Admin-pc)). Оба компьютера находятся в рамках одной подсети. Сетевой профиль на обоих компьютерах выбран Частные. Пытаюсь сделать так, чтобы была возможность управлять удаленно компьютером на базе Win 8.1 с помощью Powershell (то есть выполнять команды удаленно). На Win 8.1 воспользовался командлетом Enable-PSRemoting.

Затем на основном ПК с Win 10 выполнил команду

Set-Item WSMan:\localhost\Client\TrustedHosts -Value 'Имя компьютера с Win 10, Локальный IP компьютера с Win 10' При попытке выполнить команду на компьютере с Win 10Enter-PSSession Admin-pc -Credential Адрес электронной почты от учетной записи в Win 8.1 появляется окно Запрос учетных данных Windows Powershell.

После ввода соответствующих данных аккаунта открывается доступ к командной строке компьютера с Win 8.1 (вроде как все работает), но кириллица отображается некорректно.

Когда выполняю командлет Restart-computer Admin-pc, то возникает ошибка:

Не удалось перезагрузить компьютер Admin-pc со следующим сообщение об ошибке: Сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA). Собственно, возникло несколько вопросов.
  1. Как можно подключатся удаленно не вводя данные от аккаунта или, вводя, но не каждый раз, или сделать так, чтобы администратор компьютера с Win 10 был членом группы администраторов на удаленном компьютере (Win 8.1)?
  2. Возможно можно сразу отправлять данные от учетной записи удаленного компьютера (адрес электронной почты и пароль), чтобы не появлялось окошко Запрос учетных данных Windows Powershell)? То есть, можно ли как-то подключатся, вводя команду без дополнительных параметров, как на этом изображении: Разумеется, сейчас выскакивает вот такая ошибка, так как я нигде не вводил данные от аккаунта удаленного компьютера.
  3. Как исправить отображение кириллицы (возможно следует установить версию Powershell 5.1, так как на компьютере с Win 8.1 стоит более ранняя)?
  4. Правильно ли все это организовано (настроено)? Возможно есть еще что-то, что я не учел?
  5. Как исправить ошибку Сервер RPC недоступен...?

toster.ru

Powershell: использование командлета Invoke-Command | Виртуализация и облачные решения

На сегодняшний день PowerShell Remoting является основным инструментом удаленного управления операционными системами Windows. Поэтому, знать о его возможностях и использовать в своих повседневных задачах должен каждый системный администратор Windows. Для запуска команд на удаленных компьютерах с помощью PowerShell Remoting, можно использовать командлет Powershell Invoke-Command (псевдоним icm).

Функционал командлета Invoke-Command основан на протоколе Web Services for Management (WS-Management) и службе Windows Remote Management (WinRM), используемой для связи. Связь между компьютерами выполняется по протоколу HTTP (по умолчанию) или HTTPS. Весь трафик между двумя компьютерами зашифрован на уровне протокола. Поддерживаются несколько методов аутентификации, включая NTLM и Kerberos. Возможность создания удаленных сеансов появилась в версии Powershell 2.0.

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

  1. Нужно разрешить удаленные подключения: Enable-PSRemoting -Force
  2. Запустить службу WinRM: Start-Service WinRM
  3. Создать правило Брандмауэра Windows, разрешающее входящие подключения по этому протоколу.

Компьютер, с которого планируется удаленно управлять другими компьютерами/серверами через PowerShell Remoting также нужно донастроить:

  1. Необходимо разрешить подключения к удаленным системам. Для предоставления доступа ко всем удаленным компьютерам, воспользуйтесь командой: Set-Item wsman:\localhost\client\trustedhosts * -Force
  2. Убедитесь, что файервол не блокирует исходящие подключения.

Теперь, чтобы выполнить команду на удаленном компьютере через Powershell Remoting (например, вы хотите перезапустить службу печати Spooler), вам нужно выполнить такую команду:Invoke-Command -computername server1 -credential domain\user1 -scriptblock { Restart-Service spooler}

Эта команда выполняет команду Restart-Service spooler на удаленном компьютере с именем server1. Параметр Credential используется для выполнения команды в контексте безопасности доменного пользователя domain\user1.

При указании имени пользователя, Windows PowerShell отобразит диалоговое окно, в котором нужно указать пароль учетной записи user1. Затем указанная в фигурных скобках команда выполняется на удаленном компьютере и возвращает результаты в консоль. После выполнения команды удаленный сеанс PoSh завершается.

Чтобы запустить задачу в фоновом режиме, вы можете указать параметр -AsJob.

При запуске команды в фоновом режиме PowerShell не возвращает ее результаты. Чтобы получить их, нужно использовать командлет Receive-Job.

Get-job –id 3 |Receive-Job

Для запуска не одной команды, а целого скрипта PowerShell, командлет Invoke-Command имеет специальный аргумент -FilePath, который нужно использовать вместо -ScriptBlock для указания пути к файлу скрипта. Например, я создал небольшой скрипт PoSh, который отображает список остановленных служб. Выполним данный скрипт на удаленном компьютере:Invoke-Command -computername server1 -FilePath .\list.ps1

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

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

Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName server1,server2,server3

Либо поместить из в массив:

$srv_list = @(″server4″,″server5″,″server6″)Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName $servers

Или загрузить из тестового файла:

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

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

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

Если установлен модуль ActiveDirectory для PowerShell, становится возможным одновременно запускать команды на множестве компьютеров, выбираемых из AD с использованием конвейеров:Get-ADComputer -Filter * -properties name | select {Name="computername";Expression={$_."name"}}| Invoke-Command -ScriptBlock {hostname}

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

$session = New-PSSession -ComputerName computer1  -Name sess1Invoke-Command -ScriptBlock { Restart-Service spooler } -Session $session

Данный Сеанс будет активен, пока вы не закроете консоль PowerShell. Вы также можете закрыть сеанс (Disconnect-PSSession) или удалить его (Remove-PSSession).

vmblog.ru

PowerShell: Удалённое взаимодействие с помощью PowerShell 2.0 | VR-online

В данной статье подробно объясняется тема удалённого взаимодействия с использованием 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

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

Exit-PSSession

Команде 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-адрес.

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

UPD

Далее покажу маленькие примеры удалённой работы:

# Создаём новую сессию подключения к удалённой машине $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

www.vr-online.ru