Удаленное взаимодействие windows powershell

Удаленное управление через Powershell

В Powershell есть несколько методов удаленного подключения. Это через:

Сегодня мы поговорим о PS remoting/WinRM. В его состав входит, в основном, два командлета — это:

Этот командлет устанавливает сессию c удаленным компьютером и мы сможем работать прям на нем. Если сравнивать с Linux, то это почти одно и то же:

И второй командлет, который нужен для удаленного выполнения команд как на одном, так и сотни компьютеров:

Где:
-ComputerName — имена компьютеров (или одного)
-Scriptblock — скрипт или командлет в скобках <>

Если опять же сравнить с Linux ssh, то это почти одно и то же:

Как настроить удаленное управление через Powershell?

Для того что бы суметь настроить нужно понять как это работает. Команды выше могут работать по протоколу HTTP (по порту 5985) и HTTPS (5986), за исключением версии Powershell 1.0, который работал в XP (там порт 80/443). По умолчанию у нас стоит HTTP, но и эти данные шифруются используя симметричный ключ AES-256. Сама аутентификация работает в 2 режимах NTLM и Kerberos(по умолчанию стоит он). Если у вас сеть с домен контроллером, т.е. есть Kerberos, то у вас должны работать команды выше. Если компьютеры в Workgroup, то они используют NTLM и для этого нужна дополнительная настройка. Кроме того, если вы вместо имен используете IP, то вы в любом случае используете NTLM и это по умолчанию не работает.

Если у вас не работают команды выше нужно проверить запущен ли сервис WinRM на том компьютере, к которому мы хотим подключиться:

Если не запушен:

В этом случае мы ставим запуск сервиса автоматически и настраиваем winrm в дефолтной конфигурации. Этот сервис дает возможность принимать команды Powershell и устанавливать сеансы.

Если вы работаете под профилем сети «Public» (не «Domain» или «Private»), то нужно выполнить еще один командлет, разрешающий работать в таких сетях:

Если мы выполним такую команду:

Получим ошибку:
Connecting to remote server 192.168.3.100 failed with the following error message : The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: the transport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided.

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

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

Где:
$cred — это переменная, куда мы сохраняем данные с формы Get-Credential
-Credential — сюда мы передаем переменную

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

Теперь мы можем устанавливать множество сессий с помощью командлета:

Получать ID этих сессий:

И подключаться по этим ID:

Или использовать с invoke существующую сессию, а командлет для удаленного компьютера запускать с файла:

А так же, т.к. WinRM настроен, выполнять командлеты где есть ключ -ComputerName, сразу на нескольких компьютерах. Этот командлет пропингует AD сразу с нескольких компьютеров:

Или же использовать методы описанные выше.

Дополнительные ключи мы можем узнать по командлетам:

Выполнение удаленных команд Running Remote Commands

Одна команда Windows PowerShell позволяет запускать команды на одном или сотнях компьютеров. You can run commands on one or hundreds of computers with a single PowerShell command. Windows PowerShell поддерживает удаленное вычисление с помощью разных технологий, включая WMI, RPC и WS-Management. Windows PowerShell supports remote computing by using various technologies, including WMI, RPC, and WS-Management.

PowerShell Core поддерживает инструментарий WMI, WS-Management и удаленное взаимодействие через SSH. PowerShell Core supports WMI, WS-Management, and SSH remoting. В PowerShell 6 RPC больше не поддерживается. In PowerShell 6, RPC is no longer supported. В PowerShell 7 и более поздних версиях RPC поддерживается только в Windows. In PowerShell 7 and above, RPC is supported only in Windows.

Дополнительные сведения об удаленном взаимодействии в PowerShell Core см. в следующих статьях: For more information about remoting in PowerShell Core, see the following articles:

Удаленное взаимодействие с Windows PowerShell без настройки Windows PowerShell Remoting Without Configuration

Многие командлеты Windows PowerShell имеют параметр ComputerName, который позволяет собирать данные и изменять параметры одного или нескольких удаленных компьютеров. Many Windows PowerShell cmdlets have the ComputerName parameter that enables you to collect data and change settings on one or more remote computers. Эти командлеты используют разные протоколы связи и работают во всех операционных системах Windows без специальной настройки. These cmdlets use varying communication protocols and work on all Windows operating systems without any special configuration.

В эти командлеты входят следующие: These cmdlets include:

Обычно командлеты, которые поддерживают удаленное взаимодействие без специальной настройки, имеют параметр ComputerName, но не имеют параметра Session. Typically, cmdlets that support remoting without special configuration have the ComputerName parameter and don’t have the Session parameter. Чтобы найти эти командлеты в сеансе, введите: To find these cmdlets in your session, type:

Читайте также:  Intel display driver для windows 10

Служба удаленного взаимодействия Windows PowerShell Windows PowerShell Remoting

Благодаря использованию протокола WS-Management служба удаленного взаимодействия Windows PowerShell позволяет запустить любую команду Windows PowerShell на одном или нескольких удаленных компьютерах. Using the WS-Management protocol, Windows PowerShell remoting lets you run any Windows PowerShell command on one or more remote computers. Вы можете устанавливать постоянные подключения, запускать интерактивные сеансы и выполнять скрипты на удаленных компьютерах. You can establish persistent connections, start interactive sessions, and run scripts on remote computers.

Чтобы использовать службу удаленного взаимодействия Windows PowerShell, удаленный компьютер должен быть настроен для удаленного управления. To use Windows PowerShell remoting, the remote computer must be configured for remote management. Дополнительные сведения, в том числе инструкции, см. в разделе about_Remote_Requirements. For more information, including instructions, see About Remote Requirements.

После настройки службы удаленного взаимодействия Windows PowerShell вы получите доступ ко многим стратегиям удаленного взаимодействия. Once you have configured Windows PowerShell remoting, many remoting strategies are available to you. В этой статье перечислены только некоторые из них. This article lists just a few of them. См. дополнительные сведения об удаленном взаимодействии. For more information, see About Remote.

Запуск интерактивного сеанса Start an Interactive Session

Чтобы запустить интерактивный сеанс с одним удаленным компьютером, используйте командлет Enter-PSSession. To start an interactive session with a single remote computer, use the Enter-PSSession cmdlet. Например, чтобы запустить интерактивный сеанс с удаленным компьютером Server01, введите: For example, to start an interactive session with the Server01 remote computer, type:

В командной строке отобразится имя удаленного компьютера. The command prompt changes to display the name of the remote computer. Все команды, введенные в командной строке, запускаются на удаленном компьютере, а результаты отображаются на локальном компьютере. Any commands that you type at the prompt run on the remote computer and the results are displayed on the local computer.

Чтобы завершить интерактивный сеанс, введите: To end the interactive session, type:

См. дополнительные сведения о командлетах Enter-PSSession и Exit-PSSession: For more information about the Enter-PSSession and Exit-PSSession cmdlets, see:

Выполнение удаленной команды Run a Remote Command

Чтобы выполнить команду на одном или нескольких компьютерах, используйте командлет Invoke-Command. To run a command on one or more computers, use the Invoke-Command cmdlet. Например, чтобы выполнить команду Get-UICulture на удаленных компьютерах Server01 и Server02, введите: For example, to run a Get-UICulture command on the Server01 and Server02 remote computers, type:

Выходные данные будут возвращены на ваш компьютер. The output is returned to your computer.

Запуск сценария Run a Script

Чтобы запустить скрипт на одном или нескольких удаленных компьютерах, используйте параметр FilePath командлета Invoke-Command . To run a script on one or many remote computers, use the FilePath parameter of the Invoke-Command cmdlet. Сценарий должен быть включен или доступен для локального компьютера. The script must be on or accessible to your local computer. Результаты будут возвращены на локальный компьютер. The results are returned to your local computer.

Например, следующая команда выполняет скрипт DiskCollect.ps1 на удаленных компьютерах Server01 и Server02. For example, the following command runs the DiskCollect.ps1 script on the remote computers, Server01 and Server02.

Установка постоянного подключения Establish a Persistent Connection

Используйте командлет New-PSSession для создания постоянного сеанса на удаленном компьютере. Use the New-PSSession cmdlet to create a persistent session on a remote computer. В следующем примере создаются удаленные сеансы на удаленных компьютерах Server01 и Server02. The following example creates remote sessions on Server01 and Server02. Объекты сеанса хранятся в переменной $s . The session objects are stored in the $s variable.

После установки сеансов в них можно выполнить любую команду. Now that the sessions are established, you can run any command in them. Так как сеансы являются постоянными, вы можете собирать данные из одной команды и использовать их в другой. And because the sessions are persistent, you can collect data from one command and use it in another command.

Например, следующая команда выполняет команду Get-Hotfix в сеансах в переменной $s и сохраняет результаты в переменной $h. For example, the following command runs a Get-HotFix command in the sessions in the $s variable and it saves the results in the $h variable. Переменная $h создается в каждом сеансе в переменной $s, но она не существует в локальном сеансе. The $h variable is created in each of the sessions in $s, but it doesn’t exist in the local session.

Теперь вы можете использовать данные в переменной $h с другими командами в том же сеансе. Now you can use the data in the $h variable with other commands in the same session. Результаты отобразятся на локальном компьютере. The results are displayed on the local computer. Пример: For example:

Расширенная служба удаленного взаимодействия Advanced Remoting

Это и есть служба удаленного взаимодействия Windows PowerShell. Windows PowerShell remote management just begins here. Используя командлеты, установленные с Windows PowerShell, можно установить и настроить удаленные сеансы с локальных и удаленных компьютеров, создать настраиваемые и ограниченные сеансы, разрешить пользователям импортировать команды из удаленного сеанса, которые могут неявно выполняться в удаленном сеансе, настроить безопасность удаленного сеанса и многое другое. By using the cmdlets installed with Windows PowerShell, you can establish and configure remote sessions both from the local and remote ends, create customized and restricted sessions, allow users to import commands from a remote session that actually run implicitly on the remote session, configure the security of a remote session, and much more.

Windows PowerShell включает поставщик WSMan. Windows PowerShell includes a WSMan provider. Поставщик создает диск WSMAN: , который позволяет перемещаться по иерархии параметров конфигурации на локальном и удаленном компьютерах. The provider creates a WSMAN: drive that lets you navigate through a hierarchy of configuration settings on the local computer and remote computers.

Читайте также:  Циклическая перезагрузка windows 10 после обновления компьютера при включении

См. дополнительные сведения о поставщике WSMan и командлетах WS-Management или введите команду Get-Help wsman в консоли Windows PowerShell. For more information about the WSMan provider, see WSMan Provider and About WS-Management Cmdlets, or in the Windows PowerShell console, type Get-Help wsman .

Дополнительные сведения можно найти в разделе For more information, see:

Справку по ошибкам службы удаленного взаимодействия см. в разделе about_Remote_Troubleshooting. For help with remoting errors, see about_Remote_Troubleshooting.

Глава 8. Удаленное взаимодействие PowerShell Chapter 8 — PowerShell remoting

В PowerShell доступно множество различных способов выполнения команд на удаленных компьютерах. PowerShell has many different ways to run commands against remote computers. В последней главе вы узнали, как удаленно запрашивать WMI с помощью командлетов CIM. In the last chapter, you saw how to remotely query WMI using the CIM cmdlets. PowerShell также содержит несколько командлетов со встроенным параметром ComputerName. PowerShell also includes several cmdlets that have a built-in ComputerName parameter.

Как показано в следующем примере, Get-Command можно использовать с параметром ParameterName, чтобы определить, какие команды имеют параметр ComputerName. As shown in the following example, Get-Command can be used with the ParameterName parameter to determine what commands have a ComputerName parameter.

Параметр ComputerName есть у команд Get-Process и Get-Hotfix . Commands such as Get-Process and Get-Hotfix have a ComputerName parameter. Следует отметить, что для корпорации Майкрософт это не то долгосрочное направление, которого следует придерживаться для выполнения команд на удаленных компьютерах. This isn’t the long-term direction that Microsoft is heading for running commands against remote computers. Даже если вы нашли команду с параметром ComputerName, скорее всего, вам потребуется указать альтернативные учетные данные и у команды не будет параметра Credential. Even if you find a command that has a ComputerName parameter, chances are that you’ll need to specify alternate credentials and it won’t have a Credential parameter. Если вы решили запустить PowerShell из учетной записи с повышенными привилегиями, брандмауэр между вами и удаленным компьютером может заблокировать запрос. And if you decided to run PowerShell from an elevated account, a firewall between you and the remote computer can block the request.

Чтобы использовать команды удаленного взаимодействия PowerShell, которые демонстрируются в этой главе, необходимо включить удаленное взаимодействие PowerShell на удаленном компьютере. To use the PowerShell remoting commands that are demonstrated in this chapter, PowerShell remoting must be enabled on the remote computer. Это можно сделать с помощью командлета Enable-PSRemoting . Use the Enable-PSRemoting cmdlet to enable PowerShell remoting.

Удаленное взаимодействие «один к одному» One-To-One Remoting

Если вы хотите, чтобы удаленный сеанс был интерактивным, то в этом случае подойдет удаленное взаимодействие «один к одному». If you want your remote session to be interactive, then one-to-one remoting is what you want. Этот тип удаленного взаимодействия предоставляется с помощью командлета Enter-PSSession . This type of remoting is provided via the Enter-PSSession cmdlet.

В последней главе учетные данные администратора домена были сохранены в переменной с именем $Cred . In the last chapter, I stored my domain admin credentials in a variable named $Cred . Если вы еще не сделали этого, сохраните учетные данные администратора домена в переменной $Cred . If you haven’t already done so, go ahead and store your domain admin credentials in the $Cred variable.

После этого вы сможете ввести учетные данные один раз и использовать их для каждой команды в активном текущем сеансе PowerShell. This allows you to enter the credentials once and use them on a per command basis as long as your current PowerShell session is active.

Создайте сеанс удаленного взаимодействия PowerShell «один к одному» с контроллером домена DC01. Create a one-to-one PowerShell remoting session to the domain controller named dc01.

Обратите внимание, что в предыдущем примере перед запросом PowerShell стоит [dc01] . Notice that in the previous example that the PowerShell prompt is preceded by [dc01] . Это означает, что вы находитесь в интерактивном сеансе PowerShell с удаленным компьютером dc01. This means you’re in an interactive PowerShell session to the remote computer named dc01. Все запускаемые команды выполняются на компьютере dc01, а не на локальном компьютере. Any commands you execute run on dc01, not on your local computer. Кроме того, помните, что у вас есть доступ только к командам PowerShell, которые существуют на удаленном, а не на локальном компьютере. Also, keep in mind that you only have access to the PowerShell commands that exist on the remote computer and not the ones on your local computer. Иными словами, если на компьютере установлены дополнительные модули, они недоступны на удаленном компьютере. In other words, if you’ve installed additional modules on your computer, they aren’t accessible on the remote computer.

При подключении к удаленному компьютеру в рамках интерактивного сеанса удаленного взаимодействия PowerShell «один к одному» вы фактически находитесь на удаленном компьютере. When you’re connected to a remote computer via a one-to-one interactive PowerShell remoting session, you’re effectively sitting at the remote computer. Все объекты являются обычными объектами, аналогичными тем, с которыми вы уже работали. The objects are normal objects just like the ones you’ve been working with throughout this entire book.

Завершив работу на удаленном компьютере, выйдите из сеанса удаленного взаимодействия «один к одному» с помощью командлета Exit-PSSession . When you’re done working with the remote computer, exit the one-to-one remoting session by using the Exit-PSSession cmdlet.

Удаленное взаимодействие «один ко многим» One-To-Many Remoting

Иногда может потребоваться выполнить задачу в интерактивном режиме на удаленном компьютере. Sometimes you may need to perform a task interactively on a remote computer. Удаленное взаимодействие гораздо более эффективно при выполнении задачи на нескольких удаленных компьютерах одновременно. But remoting is much more powerful when performing a task on multiple remote computers at the same time. С помощью командлета Invoke-Command выполните команду на одном удаленном компьютере или нескольких одновременно. Use the Invoke-Command cmdlet to run a command against one or more remote computers at the same time.

Читайте также:  Полоска снизу windows 10

В предыдущем примере на три сервера были отправлены запросы состояния службы времени Windows. In the previous example, three servers were queried for the status of the Windows Time service. Командлет Get-Service был помещен в блок сценария Invoke-Command . The Get-Service cmdlet was placed inside the script block of Invoke-Command . На самом деле сценарий Get-Service выполняется на удаленном компьютере и результаты возвращаются на локальный компьютер в виде десериализованных объектов. Get-Service actually runs on the remote computer and the results are returned to your local computer as deserialized objects.

Передача предыдущей команды в Get-Member подтверждает, что результаты действительно десериализованы. Piping the previous command to Get-Member shows that the results are indeed deserialized objects.

Обратите внимание, что в десериализованных объектах отсутствует большинство методов. Notice that the majority of the methods are missing on deserialized objects. Это значит, что они не являются активными объектами, они инертны. This means they’re not live objects; they’re inert. Нельзя запускать или останавливать службу с помощью десериализованного объекта, так как он является моментальным снимком состояния этого объекта на момент выполнения команды на удаленном компьютере. You can’t start or stop a service using a deserialized object because it’s a snapshot of the state of that object the point when the command ran on the remote computer.

Это не значит, что вы не можете запускать или прекращать работу службы с помощью метода Invoke-Command . That doesn’t mean you can’t start or stop a service using a method with Invoke-Command though. Это просто значит, что метод должен быть вызван в удаленном сеансе. It just means that the method has to be called in the remote session.

Чтобы доказать это, далее я остановлю службу времени Windows на всех трех удаленных серверах с помощью метода Stop() . I’ll stop the Windows Time service on all three of those remote servers using the Stop() method to prove this point.

Как отмечалось в предыдущей главе, если для выполнения задачи существует командлет, рекомендуется использовать его, а не метод. As mentioned in a previous chapter, if a cmdlet exists for accomplishing a task, I recommend using it instead of using a method. В предыдущем сценарии вместо метода остановки советую выполнить командлет Stop-Service . In the previous scenario, I recommend using the Stop-Service cmdlet instead of the stop method. Чтобы доказать свою точку зрения, я решил использовать метод Stop() , так как многие люди ошибочно полагают, что в рамках удаленного взаимодействия PowerShell вызывать методы невозможно. I chose to use the Stop() method to prove a point since many people are under the misconception that methods can’t be called when using PowerShell remoting. Их нельзя вызывать в возвращаемом объекте, потому что он десериализован, но можно вызывать в самом удаленном сеансе. They can’t be called on the object that’s returned because it’s deserialized, but they can be called in the remote session itself.

Сеансы PowerShell PowerShell Sessions

В последнем примере в предыдущем разделе выполнялись две команды с помощью командлета Invoke-Command . In the last example in the previous section, I ran two commands using the Invoke-Command cmdlet. Это означает, что для их запуска прошлось бы настроить два отдельных сеанса. That means two separate sessions had to be set up and torn down to run those two commands.

Подобно сеансам CIM, обсуждаемым в главе 7, сеанс PowerShell на удаленном компьютере можно использовать для запуска нескольких команд на удаленном компьютере без дополнительных затрат на создание нового сеанса для каждой отдельной команды. Similar to the CIM sessions discussed in Chapter 7, a PowerShell session to a remote computer can be used to run multiple commands against the remote computer without the overhead of a new session for each individual command.

Создайте сеанс PowerShell с каждым из трех компьютеров, с которыми мы работали в этой главе, — DC01, SQL02 и WEB01. Create a PowerShell session to each of the three computers we’ve been working with in this chapter, DC01, SQL02, and WEB01.

С помощью переменной $Session запустите службу времени Windows с использованием метода и проверьте состояние службы. Now use the variable named $Session to start the Windows Time service using a method and check the status of the service.

После создания сеанса с использованием альтернативных учетных данных указывать учетные данные при каждом выполнении команды не требуется. Once the session is created using alternate credentials, it’s no longer necessary to specify the credentials each time a command is run.

Завершив работу с сеансами, не забудьте удалить их. When you’re finished using the sessions, be sure to remove them.

Сводка Summary

В этой главе вы узнали об удаленном взаимодействии PowerShell, научились выполнять команды в интерактивном сеансе с одним удаленным компьютером и поняли, как выполнять команды на нескольких компьютерах с помощью удаленного взаимодействия «один ко многим». In this chapter you’ve learned about PowerShell remoting, how to run commands in an interactive session with one remote computer, and how to run commands against multiple computers using one-to-many remoting. Вы также узнали о преимуществах использования сеанса PowerShell при выполнении нескольких команд на одном удаленном компьютере. You’ve also learned the benefits of using a PowerShell session when running multiple commands against the same remote computer.

Оцените статью