Выполнение консольных команд на удаленных компьютерах по сети. WinRM — удалённая работа с PowerShell Команда winrm параметры

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

Я использую 2 средства удаленного выполнения консольных команд: PsExec и WinRM , у каждого из них есть свои преимущества.

PsExec

Одним из отличных решений поставленной в заголовке задачи является использование программы PsExec от великого Марка Руссиновича .

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

Если PsExec запускается от имени администратора, который входит в тот же домен, что и удаленны компьютер, то никаких учетных данных даже вводить не нужно. В противном случае, их можно указать в командной строке, либо PsExec сама их запросит. PsExec работает на ОС начиная с Windows 2000 и заканчивая 64-битным Windows Server 2008 R2.

Очень полезными в PsExec являются следующие возможности:

  • Выполнение команды на группе компьютеров . Пример: следующая команда позволяет принудительно применить самые свежие групповые политики:
    psexec @group.txt gpupdate /force
  • Выполнение команд от имени системной учетной записи . Пример: следующая команда заставит удаленную систему принудительно проверить обновления:
    psexec \\computer -s wuauclt /detectnow
  • Копирование выполняемой программы на удаленный компьютер перед выполнением . Пример: следующая команда позволит обновить членство данного компьютера в группе безопасности Active Directory (токен доступа) без перезагрузки:
    psexec \\computer -c -s klist.exe purge

Трудно переоценить пользу этой программы, если использовать скрипты и возможности консольных команд, встроенных в Windows.

Windows Remote Management

Изначально это была серверная технология для удаленного управления оборудованием, которая появилась в Windows Server 2003 R2 как часть компонента Hardware Management, но недавно Microsoft выпустили пакет Windows Management Framework, который включает в себя PowerShell 2.0 и WinRM 2.0 и устанавливается на клиентские ОС как обновление. Подробности можно прочитать в статье KB968929 .

Прелесть WinRM заключается в простоте развертывания в доменной среде через WSUS в качестве факультативного обновления ОС и мощи, которую даёт совместное с PowerShell применение.

Использование WinRM происходит через 2 команды.

winrm.cmd служит для конфигурирования настроек и диагностики клиента и сервера WinRM.

Для того, чтобы сервер WinRM начал принимать команды, должна быть запущена служба Windows Remote Management и произведена её начальная конфигурация. Используйте команду

winrm quickconfig на локальной машине, либо финт ушами
psexec -s \\servername winrm quickconfig по сети, используя PsExec от имени системной учетной записи.

Будет предложено автоматически запускать службу WinRM и разрешить уделенные подключения, соглашайтесь;)

Чтобы успешно подключаться к WinRM серверу (имеется в виду серверная часть, принимающая команды), не входящему в тот же домен, что и ваш клиентский компьютер, необходимо на клиенте этот целевой сервер добавить в «доверенный список» следующей командой:

winrm set winrm/config/client @{TrustedHosts="servername"} , где вместо servername можно указать IP-адрес, либо * (звёздочку).

Для пользователей Windows Vista и Windows 7, работающим не от имени встроенного администратора (обычно так и бывает), нужно выполнить следующую команду

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

По умолчанию, установлено ограничение на 5 одновременных соединений WinRM от клиента, для увеличения этого числа выполните команду

winrm s winrm/config/winrs @{MaxShellsPerUser="X"}

winrs.exe — клиент для отправки запросов к серверной части. Пример: следующая команда принудительно перезагрузит удаленную систему…

winrs -r:servername shutdown /r /t 0

В доменной среде при отправке команд используются учетные данные запустившего пользователя. Для посыла команд от имени другого пользователя используются ключи -u:user -p:pass. Пример: следующая команда очистит локальный кэш DNS-имён на удаленной системе

winrs -r:servername -u:user -p:pass ipconfig /flushdns

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

Собственно WinRM (или Windows Remote Management ) и переводится как «удаленное управление Windows» . WinRM – служба удаленного управления для операционных систем Windows . Она входит в состав операционных систем начиная с Vista и Server 2008 , для Windows XP и Server 2003 ее нужно устанавливать отдельно отсюда . WinRM – серверная часть приложения удаленного управления, к которому возможно удаленное подключение с помощью клиента Windows Remote Shell (WinRS).

WinRM основан на службах Web Services for Management (WS-Management) и использует протокол HTTP (порт 80) или HTTPS (443) и запросы SOAP для выполнения работы. Независимо от используемого протокола весь трафик, передаваемый WinRM шифруется (если специально не отключить эту опцию). Для аутентификации по умолчанию используется протокол Kerberos .

В Windows Server 2008 WinRM установлен, но (по соображениям безопасности) по умолчанию не включен. Чтобы проверить, запущен ли WinRM на нашей машине, набираем в командной строке winrm enumerate winrm/config/listener

Если ответа нет, значит WinRM не запущен. Для того, чтобы настроить WinRM на автоматический запуск и разрешить удаленное подключение к компьютеру, набираем команду winrm quickconfig или winrm qc

Чтобы WinRM не спрашивал подтверждения, можно добавить к вызову ключ -quiet . Узнать информацию о более тонкой настройке можно посмотреть встроенную справку WinRM : winrm help config

Ну и отключить WinRM можно с помощью такой команды:
winrm delete winrm/config/listener?IPAdress=*+Transport=HTTP

Также все необходимые настройки можно сделать с помощью групповых политик. Для этого нужно:

  • Настроить службу WinRM на автоматический запуск
  • Разрешить подключения на соответствующие порты (80 и 443) в брандмауэре Windows
  • Настроить элемент групповой политики Конфигурация компьютера\Административные шаблоны\Компоненты Windows\Удаленное управление Windows\Служба удаленного управления Windows\Разрешить автоматическую установку прослушивателей (Computer Configuration\Administrative Templates\Windows Components\Windows Remote Management \WinRM Service\Allow automatic configuration of listeners) . Тут нужно будет указать IP-адреса, с которых разрешаются подключения.

Теперь перейдем непосредственно к использованию. Для подключения к удаленному компьютеру используем утилиту WinRS . WinRS – аббревиатура для Windows Remote Shell (удаленная среда Windows ). С WinRS мы можем делать удаленные запросы на компьютеры, на которых запущен WinRM . Однако имейте ввиду, что на вашей машине также необходимо запускать WinRM для работы с WinRS .

Основным способом использования WinRS является выполнение команд на удаленной машине. Имя компьютера задаётся ключом -r , а после него следует выполняемая команда, например winrs r : SRV 2 ipconfig / all запускает на удаленном компьютере SRV2 команду ipconfig / all

По умолчанию для коммуникаций используется протокол http , но можно использовать и https : winrs -r:https://SRV2 ipconfig /all

Также можно с помощью WinRS открыть интерактивный сеанс на удалённом компьютере: winrs -r:SRV2 cmd.exe

Эта функция аналогична подключению по telnet , но использование WinRS однозначно лучше с точки зрения безопасности.

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

« true»}

« »}

WinRM set winrm/config/client @{TrustedHosts=« ComputerName»}

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

На компьютере, с которого будем подключаться, вводим:

WinRM set winrm/config/service/auth @{Basic=« true»}

WinRM set winrm/config/client @{TrustedHosts=« »}

WinRM set winrm/config/client @{TrustedHosts= «ComрuterName»}

где ComputerName — компьютер, которым будем управлять.

Затем устанавливаем соедининие с помощью команды:

winrs -r: «ComputerName»: –u: Domain\Username –p: Password cmd.exe

где Domain\Username — учетная запись пользователя с административными правами на удаленном компьютере.

Бывают случаи, когда требуется выполнить какую-либо команду на сервере локально (например, сконфигурировать iSCSI Initiator). Подключаться для этого через Remote Desktop и запускать cmd - неудобно, использовать Telnet - небезопасно, ставить на сервер демона ssh - не... хочется...

Специально для таких запущенных случаев, Microsoft, начиная с Windows Server 2003 R2, снабдила администраторов новым средством управления - Windows Remote Management (WinRM), позволяющим удаленно выполнять команды, используя стандартные средства ОС, и обеспечивая при этом должный уровень безопасности.

Вам даже не придется устанавливать дополнительных программ и компонентов - все, что называется, включено:


Настройка WinRM
В качестве примера я рассмотрю процесс настройки WinRM на Windows Server 2008. Эта процедура никак не отличается от настройки WinRM, например, на Windows Vista или Hyper-V Server.

Проще всего WinRM настроить можно, используя режим быстрой конфигурации, набрав в CMD:
winrm quickconfig
и ответив утвердительно ("y ") на вопрос о создании нового объекта-listener"а, прослушающего порт TCP 80, и использующего протокол HTTP для коммуникаций между клиентом и сервером.


И все, сервером можно управлять удаленно, используя команду:
winrs -r:<ИМЯ_СЕРВЕРА> <КОМАНДА>
,где <ИМЯ_СЕРВЕРА> - имя или IP адрес сервера, к которому осуществляется подключение;
<КОМАНДА> - удаленная команда, которую требуется выполнить.


Если клиент и сервер не являются членами одного домена, вам потребуется дополнительно указать имя пользователя из-под которого будет запускаться команда и его пароль:
winrs -r:<ИМЯ_СЕРВЕРА> -u:<ИМЯ_ПОЛЬЗОВАТЕЛЯ> -p:<ПАРОЛЬ> <КОМАНДА>

А заодно, как советует появившееся сообщение, добавить сервер в список доверенных узлов, либо использовать более надежный протокол для коммуникации (HTTPS).

Для добавления узла в список надежных, выполните на клиенте, с которого планируете подключаться:
winrm set winrm/config/client @{TrustedHosts="<ИМЯ_УЗЛА1> [,<ИМЯ_УЗЛА2> ]"}


После настройки вы можете получить информацию о существующих listener"ах с помощью команды:
winrm enumerate winrm/config/listener


Удалить существующий listener можно следующим образом:
winrm delete winrm/config/listener?Address=*+Transport=HTTPS


Настройка WinRM с использованием HTTPS
В ряде случаев вам может потребоваться создать надежный канал для безопасной пересылки команд между клиентом и сервером. Для этого можно использовать HTTPS.

Однако, для создания listener"а с поддержкой HTTPS вам потребуется цифровой сертификат, который можно запросить у доверенного Центра Сертификации, либо воспользоваться различными утилитами по созданию самоподписанных (самозаверенных) сертификатов, например, Makecert, входящей в состав Windows SDK . Скачать Makecert отдельно можно отсюда .

Для создания самоподписанного серитификата выполните следующую команду:
makecert -a sha1 -r -pe -n "CN=<ИМЯ_СЕРВЕРА> " -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -m 12 <ФАЙЛ_СЕРТИФИКАТА>
, где <ИМЯ_СЕРВЕРА> соответствует имени, которое будет использовать клиент при подключении к серверу;
<ФАЙЛ_СЕРТИФИКАТА> - путь к файлу, куда будет сохранен сертификат с открытым ключем.


Сертификат с закрытым ключем будет создан и помещен в хранилище сертификатов локального компьютера. Добавьте его к доверенным корневым сертификатам:
certutil -addstore root cert.cer


Теперь просмотрите хранилище сертификатов, найдите там требуемый сертификат и запишите его Thumbprint (Cert Hash):
certutil -store my


Наконец, можно приступать к созданию HTTPS listener. Введите команду:
winrm create winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname="<ИМЯ_УЗЛА> ";CertificateThumbprint="<ХЭШ_СЕРТИФИКАТА> ";Port="<ПОРТ> "}
,где <ИМЯ_УЗЛА> - имя, которое указывается при обращении к серверу
<ХЭШ_СЕРТИФИКАТА> - Thumbprint, который вы узнали на предыдущем шаге (без пробелов).
<ПОРТ> - порт, на который будет подключаться клиент (TCP 443 по-умолчанию).


Если на сервере включен брандмауэр Windows, не забудьте добавить правило:
netsh advfirewall firewall add rule name="allow WinRM on 4443" protocol=TCP dir=in localport=4443 action=allow

При использовании самоподписанных сертификатов, вам придется добавить его к доверенным корневым сертификатам на клиенте.

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

У меня как-то раз возникли проблемы с WinRM на двух серверах.

1. SETSPN
На одном проблема была в том, что SPN записи HTTP/<имя сервера> были зарегистрирована для какой-то "левой" учётной записи пользователя.

Нашёл эти записи командой
setspn -F -Q */<имя сервера>

Затем удалил их командами
setspn -D http/<имя сервера>.<имя домена> <имя домена>\<левая учётная запись>
setspn -D http/<имя сервера> <имя домена>\<левая учётная запись>

Затем enable-psremoting -force выполнилась успешно.

2. LANGUAGE PACK
А на втором сервере была хитрая проблема якобы с фаерволлом Unable to check the status of the firewall , перерыл кучу сайтов, а решение обнаружил интуитивно основываясь на ответе по поводу установленного Language Pack.

WinRm QuickConfig
WinRM service is already running on this machine.
WSManFault
Message
ProviderFault
WSManFault
Message = Unable to check the status of the firewall.

Error number: -2147024894 0x80070002
The system cannot find the file specified.

В ответе было написно, что данная ошибка лечится удалением дополнительного Language Pack.
Но я поступил иначе. У меня Английская операционка с дополнительным русским language pack. Я просто изменил язык интерфейса на Русский.
Панель управления, Язык и региональные стандарты, Языки и клавиатуры изменил язык интерфейса с англиского на русский.
Выполнил logoff и вошёл снова. Открыл PowerShell и повторил WinRm QuickConfig

PS C:\Windows\system32> winrm qc

Служба WinRM не настроена на разрешение удаленного управления компьютером.
Необходимо внести следующие изменения:

Создайте прослушиватель WinRM на HTTP://* для приема запросов WS-Man на любом из IP-адресов этого компьютера.

Выполнить изменения ? y

Служба WinRM обновлена для удаленного управления.

Создан прослушиватель WinRM на HTTP://* для приема запросов WS-Man на любом из IP-адресов этого компьютера.

Выполнилось успешно, но всё же не достаточно.

Появилась ошибка Access Denied при попытке выполнить команды удалённо на этом сервере с другого компа.

New-PSSession: [<имя сервера>] Connecting to remote server <имя сервера> failed with the following error message: Access is denied. For more information, see the about_Remote_Troubleshooting Help topic.

Тогда я повторил Enable-PsRemoting

PS C:\Windows\system32> Enable-PsRemoting

Быстрая настройка WinRM
Запуск команды "Set-WSManQuickConfig" для включения на данном компьютере удаленного управления с помощью службы WinRM.
Необходимые действия.
1. Запуск или перезапуск (если уже запущена) службы WinRM.
2. Изменение типа службы WinRM на "автозапуск".
3. Создание прослушивателя для приема запросов на любом IP-адресе.
4. Настройка исключений брандмауэра для трафика службы WS-Management (только для протокола http).

Продолжить?

(значением по умолчанию является "Y"):a
Служба WinRM уже настроена на прием запросов на компьютере.
Служба WinRM уже настроена на разрешение удаленного управления компьютером.

Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции "Регистрация конфигурации сеанса" над целевым объектом "Конфигурация сеанса
"Microsoft.PowerShell32" не найдена. Будет выполнена команда "Register-PSSessionConfiguration Microsoft.PowerShell32
-processorarchitecture x86 -force" для создания конфигурации сеанса "Microsoft.PowerShell32". Служба WinRM будет
перезапущена.".
[Y] Да - Y [A] Да для всех - A [N] Нет - N [L] Нет для всех - L [S] Приостановить - S [?] Справка
(значением по умолчанию является "Y"):a

После этого WinRM на этом сервере заработал как надо.

Windows Remote Management — это служба удаленного управления Windows. Под этим общим названием скрываются сразу два инструмента, которые позволяют пользователю . В отличие от двух предыдущих инструментов Windows( и ), которые позволяли видеть происходящее на удаленном компьютере на своем экране и манипулировать удаленным компьютером с помощью мыши и клавиатуры, данные два инструмента кардинально отличаются от них. Инструменты, которые входят в службу Windows Remote Management, позволяют управлять компьютером одними командами. Эти команды выполняются либо в командной строке, либо в Windows Power Shell. Единственный отклик об управлении - ответ оболочки о выполнении команды. Вы во многом в слепую отправляете команды на удаленный компьютер и получаете односложные ответы о том, выполнена она или нет. Минимум удобств. Но для администрирования компьютеров это самое то.

Активация Windows Remote Management

Под Windows Remote Management скрываются две команды, которые позволяют выполнять команды на удаленном компьютере. Эти команды, как уже говорилось, принадлежат двум разным оболочкам: командная строка Windows и Windows Power Shell. Думаю, все знакомы с командной строкой Windows. Ну, а Power Shell это инструмент, который призван заменить устаревшую командную строку. С первого взгляда, эти инструменты очень похожи. Но на деле Power Shell стоит выше командной строки, которая не претерпевела серьезных изменений уже очень давно. Именно в связи с этим ему и приготовили замену.

Для возможности удаленного управления компьютером средствами Windows Remote Management, целевой компьютер необходимо должным образом настроить. Для этого на целевом компьютере необходимо выполнить команду(в окне командной строки Windows):

winrm quickconfig

Данная команда включает и настраивает отложенный автоматический запуск службы Windows Remote Management(кстати, для можно так же использовать инструмент Службы), а так же настраивает соответствующие исключения для , которые необходимо для правильного функционирования этих инструментов.

Но выполнение данной команды недостаточно. Чтобы удаленные подключения стали возможными, компьютер, с которого будет вестись удаленное управление, должен стать доверенным для целевого компьютера. Дело облегчается, если оба этих компьютера находятся в одном домене — в таком случае, оба компьютера взаимодоверенные. Если же нет, то необходимо внести удаленный компьютер в список доверенных компьютеров, либо по его , либо по имени компьютера(что довольно серьезно осложняется в условиях Глобальной сети).

winrm set winrm/config/client @{TrustedHosts=«имя или IP-адрес удаленного компьютера»}

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

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

Ну и наконец-то пришло время познакомится с самими командами для удаленного управления. В среде командной строки такую возможность дает команда

winrs

а в среде Power Shell — команда

Синтаксис данных команд Вы можете увидеть в самих средах, если вызовите справку по данным командам. Я же приведу только общий вид таких команд:

icm имя_компьютера {любая команда}
winrs -r: Имя_компьютера -u: имя_пользователя Любая_команда

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