Cлужба удаленного управления Windows — Windows Remote Management

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

Компоненты WinRM и управление оборудованием

Ниже приведен список компонентов и функций, предоставляемых службой WinRM и функцией мониторинга оборудования.

  • API сценариев WinRM

    Этот API-интерфейс сценариев позволяет получать данные с удаленных компьютеров с помощью сценариев, выполняющих операции WS-Management протоколов.

  • WinRM. cmd

    Это средство командной строки для управления системой реализуется в файле Visual Basic Scripting Edition (Winrm.vbs), написанном с помощью API-интерфейса для сценариев WinRM. Это средство позволяет администратору настраивать WinRM и получать данные или управлять ресурсами. Дополнительные сведения см. в справке в Интернете, предоставляемой командной строкой WinRM /?.

  • Winrs.exe

    Это средство командной строки позволяет администраторам удаленно выполнять большинство Cmd.exeных команд с помощью протокола WS-Management. Дополнительные сведения см. в справке в Интернете, предоставляемой командной строкой WinRS /?.

  • Драйвер IPMI и поставщик WMI

    Управление оборудованием с помощью поставщика IPMI и драйвера позволяет контролировать и диагностировать аппаратное обеспечение удаленного сервера через контроллеры BMC, если операционная система не запущена или не развернута.

    Дополнительные сведения см. в разделе поставщик IPMI.

  • Служба WMI

    Служба WMI продолжит работать параллельно с WinRM и предоставляет запрошенные данные или элементы управления через подключаемый модуль WMI. Вы можете продолжить получать данные из стандартных классов WMI, таких как _ процесс Win32, а также данных, предоставленных IPMI. Дополнительные сведения о настройке и установке, необходимые для WinRM, см. в разделе Введение в Управление оборудованием.

  • Протокол WS-Management

    Протокол WS-Management, основанный на протоколе SOAP, разработан для систем, предназначенный для выявления и обмена данными управления. Цель спецификации протокола WS-Management заключается в обеспечении взаимодействия и согласованности систем предприятия, имеющих компьютеры, работающие на различных операционных системах разных поставщиков.

    WS-Management протокол основан на следующих стандартных спецификациях веб-служб: HTTPS, SOAP по HTTP (WS-I Profile), SOAP 1,2, WS-Addressing, WS-передачи, WS-enumeration и WS-Eventing. Дополнительные сведения о текущем черновике спецификации см. на странице индекс спецификаций управления.

Выполнить команду на удалённом компьютере через PsExec.exe

Один из моих любимых способов для решения этой задачи это утилита командной строки PsExec.exe написанная Марком Руссиновичем, которую вы можете свободно скачать с сайта Windows SysInternals. Ссылку на неё вы можете найти в конце статьи. Она не требует установки в систему, вы можете просто скопировать её в одну из папок, содержащихся в переменной окружения %path% и вызывать из любой оболочки командной строки: Cmd или PowerShell.

Использовать PsExec очень просто. Например, чтобы выполнить ipconfig /flushdns на компьютере main, достаточно запустить следующую команду:

psexec \main ipconfig /flushdns

Команда ipconfig будет запущена на компьютере main под вашими учетными данными. После завершения работы ipconfig весь текстовый вывод будет передан на ваш компьютер, а кроме того будет возвращён код выхода команды (error code). В случае если команда выполнилась успешно, он будет равен 0.

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

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

Ключ -d говорит PsExec что ненужно дожидаться выполнения команды, а достаточно лишь запустить её, и забыть. В этом случае мы не получим выходных данных от консольной утилиты, но зато сможем не дожидаясь завершения предыдущей команды запускать другие. Это очень полезно, если вам необходимо запустить, например установщик программы на нескольких компьютерах.

По умолчанию PsExec выполняет команды в скрытом режиме, то есть на системе где выполняется команда, не будут выводиться никакие окна или диалоги. Однако есть возможность изменить это поведение, с помощью ключа -i . После него можно указать номер сессии, в которой выводить окна, а можно и не указывать, тогда интерфейс будет отображен в консольной сессии.

Таким образом, чтобы вывести окно с информацией о версии операционной системы на компьютере main, следует запустить PsExec таким образом:

psexec -i \main winver.exe

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

psexec @c:comps.txt systeminfo.exe

Ну и одной из самых полезных способностей PsExec является возможность интерактивного перенаправления ввода/вывода между компьютерами, что позволяет нам запустить, например cmd.exe на удалённом сервере, а давать ему команды и получать результаты на локальном компьютере.

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

Каким образом работает PsExec?

Всё гениальное просто. В ресурсах исполняемого файла PsExec.exe находится другой исполняемый файл – PSEXESVC, который является службой Windows. Перед выполнением команды, PsExec распаковывает этот ресурс на скрытую административную общую папку удалённого компьютера, в файл: \ИмяКомпьютераAdmin$system32psexesvc.exe. Если вы с помощью ключа -c указали что необходимо скопировать исполняемые файлы на эту систему, они тоже скопируются в эту папку.

По завершению подготовительных действий, PsExec устанавливает и запускает службу, используя API функции Windows для управления службами. После того как PSEXESVC запустится, между ним и PsExec создаётся несколько каналов для передачи данных (вводимых команд, результатов, и т.д.). Завершив работу, PsExec останавливает службу, и удаляет её с целевого компьютера.

Чтоб выполнить команду на удалённом компьютере  нам потребуется Windows Management Instrumentation (WMI)

Следующий способ реализации этой популярной задачи, о котором я хочу поведать – использование Windows Management Instrumentation. WMI присутствует во всех операционных системах Microsoft, начиная с Windows 2000, и даже на Windows 9x его можно установить из отдельного пакета. WMI включён по умолчанию, и не требует дополнительной настройки. Для его использования достаточно административных прав, и разрешенного на брандмауэре протокола DCOM. WMI предоставляет огромные возможности для управления системами, но нас сейчас интересует лишь одна из них.

Для запуска процессов нам потребуется метод Create класса Win32_Process. Использовать его достаточно несложно. В PowerShell это делается следующим образом:

$Computer = «main»
$Command = «cmd.exe /c systeminfo.exe > \servershare%computername%.txt»
([wmiclass]»\$Computerrootcimv2:Win32_Process»).create($Command)

Здесь в качестве запускаемого процесса я указал cmd.exe, а уже ему, в качестве аргументов передал нужную команду. Это необходимо в случае если вам нужно использовать переменные окружения удалённого компьютера или встроенные операторы cmd.exe, такие как «>» для перенаправления вывода в файл. Метод Create не дожидается завершения процесса, и не возвращает результатов, но зато сообщает нам его идентификатор – ProcessID.

Если вы используете компьютер, на котором пока не установлен PowerShell, вы можете вызвать этот метод WMI и из сценария на VBScript. Например вот так:

Решаем задачи Абрамян на C. Matrix78

05.04.2017Проверка знаний

Matrix78. Дана матрица размера $$M times N$$. Упорядочить ее строки так, чтобы их минимальные элементы образовывали убывающую последовательность.

Читать далее

Получение списка служб

Узнать статус всех служб можно так:

Get-Service

Получение списка служб в Powershell Get-Service

Каждый результат выдаваемый командами в PS представляет собою объект. Этот объект содержит разные свойства и методы. Свойства — это например имя или статус. По умолчанию мы видим не все свойства. Что бы узнать какие еще свойства есть у команды нужно выполнить следующее:

Get-Service | Get-Member -MemberType Properties

Свойства сервисов в Powershell

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

Get-Service | SELECT *

Возможно вывести только имена, статус и тип запуска:

Get-Service | Ft Name, Status, StartType

Тип запуска и статус служб Powershell

Или выведем информацию по одному сервису:

Get-Service «WinRM» | Ft Name, Status, StartType

У сервисов есть короткое имя и отображаемое. Так мы выведем оба:

Имена служб Powershell

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

Get-Service -DisplayName «Win*» | Ft Name, DisplayName, Status, StartType

Powershell использование маски у сервисов

Не желательно указывать отображаемое имя так как язык операционных систем может быть разным и если вы выполняете командлеты удаленно, вероятно будут ошибки:

  • Cannot find any service with service name
  • Cannot find any service with display name
  • Не удается найти службу с отображаемым именем

Кроме этого есть два ключа, которые тоже поддерживают маски:

  • Include — включают поиск по какой-то маске или точному соответствию.
  • Exclude — исключает упоминание.

Можно сравнить разницу с прошлым примером:

Get-Service -Name «Win*» -Include «*RM» -Exclude «*mgmt»,»*Http*»,»*Defend» | Ft Name, Status, StartType

Powershell Get-Service Include ExcludeУ сервисов несколько статусов:

  • Running — запущен.
  • Stopped — остановлен.
  • Paused — приостановлен (пауза).

По каждому из них мы можем отфильтровать результат:

Get-Service | where -Property Status -eq Stopped

Powershell Service фильтрация по статусу

Кроме этого есть 3 типа запуска:

  • Automatic — автоматический запуск вместе с системой.
  • AutomaticDelayedStart — запуск после загрузки системы.
  • Manual — ручной запуск.
  • Disabled — отключенный.

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

Get-Service | where -FilterScript {$_.Status -ne ‘Running’ -and $_.StartType -eq ‘Automatic’} | ft ‘Name’,’StartType’,’Status’

Powershell остановленные службы

Службы могут быть зависимы от других и для проверки этих свойств есть два параметра:

  • DependentServices — кто зависит от этого сервиса.
  • RequiredServices — от кого зависит этот сервис.

Get-Service -DisplayName ‘Windows Remote Management (WS-Management)’ -RequiredServices -DependentServices

WINRm зависимые службы Powershell

Аналогично параметрам команды выше есть свойства DependentServices и ServicesDependedOn (RequiredServices). Они выводят одно и то же.

Есть несколько свойств, которые не выведены в параметры — это:

  • CanPauseAndContinue — можно ли приостановить работу сервиса и возобновить.
  • CanShutdown — может ли быть выключен.
  • CanStop — может ли быть полностью остановлен.

Эти свойства так же можно увидеть в GUI. В командлете ниже я использую алиас gsv (короткое имя Get-Service):

gsv -ServiceName ‘Winrm’ | SELECT CanPauseAndContinue,CanShutdown,CanStop | fl

Powershell CanPauseAndContinue службы Powershell

Каждая команда PS, где присутствует параметр ComuterName, может быть выполнена удаленно. Для удаленного управления в Powershell нужны дополнительные настройки, которые уже описывались в предыдущей статье. 

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

gsv -ComputerName ‘AD1′,’localhost’ | where Status -eq ‘Stopped’ | Select MachineName,Name,Status,StartType

Powershell получение сервисов с удаленного компьютера 

WSH Remote Scripting

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

Итак, для запуска сценария на другом компьютере с помощью WSH нам понадобится сделать следующее:

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

  2. Разрешить WSH Remote Scripting создав в системном реестре строковой параметр Remote равный «1» в ключе реестра HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows Script HostSettings

  3. Из за ошибки описанной в статье базы знаний Microsoft с номером 311269, на системах с Windows XP может понадобиться выполнить команду wscript –regserver

  4. Если на компьютерах используется брандмауэр, то в нём необходимо разрешить обращения к DCOM. Причем сделать это надо не только на управляемом компьютере, но и на том с которого вы хотите запускать сценарий.

  5. В системах Windows XP с пакетом обновлений 2 и выше, необходимо изменить параметры безопасности DCOM. Это можно сделать с помощью групповой политики. В узле Computer Configuration Windows Settings Security Settings Local Policies Security Options следует установить разрешения следующим образом:

    1. DCOM: Machine Access Restrictions in Security Descriptor Definition Language (SDDL) syntax
      Выдать группам Anonymous Logon и Everyone разрешения Allow Local и Allow Remote Access

    2. DCOM: Machine Launch Restrictions in Security Descriptor Definition Language (SDDL) syntax
      Выдать группе Administrators разрешения Allow Local Launch, Allow Remote Launch, Allow Local Activation, Allow Remote Activation
      Группе Everyone – Allow Local Launch, Allow Local Activation

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

Пример сценария, который использует эту технологию:

Изменение с Set-Service

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

Set-Service ‘WinRM’ -StartupType Automatic

В случае изменения сервисов нельзя использовать маски *. 

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

  1. Automatic
  2. AutomaticDelayedStart
  3. Disabled
  4. Manual

Во первых половина называется иначе и изменение не срабатывает. Возможно изменение не срабатывает из-за багов Windows Server 2019,может из-за зависимостей (в GUI все работает), но скорее всего дело в PS. При работе с WMI все срабатывает. Реальные варианты запуска такие:

  1. Automatic
  2. Boot
  3. Disabled
  4. Manual
  5. System

Через эту команду можно так же выполнить запуск и остановку:

Set-Service ‘WinRM’ -Status Stopped

Все возможные значения:

  • Paused
  • Running
  • Stopped

Можно изменить описание сервиса:

Set-Service ‘WinRM’ -Description ‘что вы сделали с PS’

Powershell учетная запись сервиса и описание

Команды изменения можно выполнять удаленно:

Set-Service WinRM -ComputerName ‘AD1’ -StartupType Automatic

Листинг №3 – Установка программы с последующим удалением задания (Windows Batch)

msiexec /qn /package \serversharesubinacl.msi
if exist «c:program filesWindows Resource KitsToolssubinacl.exe» (
subinacl /tn Install_Subinacl /f
)

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: