Powershell windows remote management

Глава 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.

Читайте также:  Spoolsv exe что это за процесс windows 10

При подключении к удаленному компьютеру в рамках интерактивного сеанса удаленного взаимодействия 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. 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 10 с флешки

Чтобы доказать это, далее я остановлю службу времени 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.

Читайте также:  Qualcomm atheros ar9485 wifi adapter windows 10

Удаленное управление через 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 сразу с нескольких компьютеров:

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

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

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