7 способов выполнить команду на удалённом компьютере
Одна из самых популярных задач у системных администраторов это запуск, какой-либо команды на удалённом компьютере, не вставая со своего места. Это может быть необходимо для установки программы или утилиты, изменения каких-либо настроек, или для чего угодно ещё. И конечно, редко речь идёт лишь об одном компьютере, чаще команду нужно выполнить на множестве рабочих станций или серверов.
Так как задача эта популярная, то и способов её решения существует множество. Начиная от групповых политик (в которых можно применять для этой цели сценарии входа в систему или автозагрузки), и заканчивая мощными системами управления, вроде System Center Essentials или System Center Configuration Manager. Но я в этой статье хочу рассмотреть методы, которые доступны сразу из командной строки или файлов сценариев, а также не требуют предварительной установки агентов и прочей суматохи. Впрочем, какие-то предварительные требования конечно есть. Например, у вас должны быть административные полномочия на том компьютере, на котором вы хотите выполнить команду (за исключением сценария с «проксированием», но об этом позже).
Способ 1 (быстрый)
Для запуска диспетчера задач на удаленном рабочем столе, достаточно нажать альтернативную комбинацию клавиш: Ctrl + Shift + Esc (Контрол+Шифт+Эскейп). После этого на удаленном компьютере запустится диспетчер задач Windows.Расположение клавиш можно посмотреть на картинке ниже:
Достаточно навести указатель мышки в любое свободное место панели задач, нажать правую кнопку мышки и выбрать пункт «Запустить диспетчер задач» (в английской версии Windows «Start Task Manager«). После этого мы получим аналогичный эффект.
Список всех параметров запуска Psexec.
@файл
Указывает программе PsExec, что нужно запустить приложение на всех компьютерах, перечисленных в заданном текстовом файле.
-a
Процессоры, на которых можно запустить приложение, отделяются запятыми, при этом процессоры нумеруются, начиная с 1. Например, чтобы запустить приложение на процессорах втором и четвертом, введите «-a 2,4»
-c
Указанная программа копируется в удаленную систему для выполнения. Если этот параметр не задан, то приложение должно находиться в системной папке удаленной системы.
-d
Указывает, что не нужно ждать завершения приложения. Этот параметр следует использовать только при запуске неинтерактивных приложений.
-e
Указанный профиль учетной записи не загружается.
-f
Указанная программа копируется в удаленную систему, даже если такой файл в удаленной системе уже есть.
-i
Запускаемая программа получает доступ к рабочему столу указанного сеанса в удаленной системе. Если сеанс не задан, то процесс выполняется в консольном сеансе.
-l
При запуске процесса пользователю предоставляются ограниченные права (права группы администраторов отменяются, и пользователю предоставляются только права, назначенные группе «пользователи»). В ОС Windows Vista процесс запускается с низким уровнем благонадежности.
-n
Позволяет задать задержку подключения к удаленным компьютерам (в секундах).
-p
Позволяет указать необязательный пароль для имени пользователя. Если этот параметр опущен, то будет выдан запрос на ввод пароля, при этом пароль не будет отображаться на экране.
-s
Удаленный процесс запускается из системной учетной записи.
-u
Позволяет указать необязательное имя пользователя для входа в удаленную систему.
-v
Указанный файл копируется в удаленную систему вместо уже имеющегося только при условии, что номер его версии выше или он более новый.
-w
Позволяет указать для процесса рабочий каталог (путь внутри удаленной системы).
-x
Отображает интерфейс пользователя на рабочем столе Winlogon (только в локальной системе).
Назначенные задания
Довольно интересный способ, заслуживающий право на жизнь. Назначенные задания можно создавать из командной строки при помощи утилиты schtasks.exe, выполнять их, затем удалять. Подробнее с синтаксисом можно ознакомиться в документации, я же разберу пример использования назначенных заданий в доменной среде. Предположим, нам нужно выполнить команду как можно быстрее вне зависимости от того, выключен компьютер или нет. Для этого используются так называемые предпочтения групповых политик (Group Policy Preference).
Искать установку назначенных заданий следует в конфигурации компьютера или пользователя ― «Настройка ― Параметры панели управления ― Назначенные задания».
Создание нового назначенного задания.
Для выполнения команды или скрипта ASAP понадобится создать «Немедленную задачу (Windows 7 и выше)». Если вдруг в инфраструктуре остались машины под управлением Windows XP, то подойдет «Очередное задание (Windows XP)».
Стоит сделать несколько политик с соответствующими WMI-фильтрами или создать два разных назначенных задания в одной политике с нацеливанием ― например, при помощи того же WMI-фильтра. Это поможет избежать конфликтов в разнородной среде со старыми и новыми Windows.
Пример WMI-фильтра для применения политики только на компьютерах с Windows XP:
В остальном процедура создания назначенного задания тривиальна. Единственное, не забывайте отметить пункт «Применить один раз и не применять повторно», если задача не требует повторного запуска.
Запускаем немедленную задачу только один раз.
При использовании таких назначенных заданий программа запустится, как только компьютер получит обновление групповой политики. Это удобно: не нужно проверять доступность компьютеров в случае Psexec и wmic и заставлять пользователей перезагружать машины, как в случае скриптов групповых политик. При необходимости можно скопировать файл скрипта локально в разделе «Настройка ― Конфигурация Windows ― Файлы».
Назначенные задания позволяют явно задать имя пользователя для запуска программы, в том числе и для SYSTEM.
Get-Process – получение списка запущенных процессов
Командлет Get-Process позволяет вывести список запущенных процессов на локальном компьютере.
По-умолчанию выводятся следующие свойства запущенных процессов:
- Handles – количество дескрипторов ввода — вывода, которые отрыл данный процесс;
- NPM(K) — Non-paged memory (невыгружаемый пул). Размер данных процесса (в Кб.), которые никогда не попадают в файл подкачки на диск;
- PM(K) – размер памяти процесса, которая может быть выгружена на диск;
- WS(K) – размер физической памяти в Кб, используемой процессом (working set).
- CPU(s) – процессорное время, использованное процессом (учитывается время на всех CPU);
- ID — идентификатор процесса;
- SI (Session ID) – идентификатор сеанса процесса (0 — запущен для всех сессий, 1 – для первого залогиненого пользователя, 2 — для второго и т.д.);
- ProcessName – имя процесса.
Чтобы получить все свойства нескольких процессов:
Get-Process winword, notep* | Format-List *
Можно вывести только определенный свойства процессов. Например, имя (ProcessName) время запуска (StartTime), заголовок окна процесса (MainWindowTitle), имя исполняемого файла (Path) и наименование разработчика (Company):
Get-Process winword, notep* | Select-Object ProcessName, StartTime, MainWindowTitle, Path, Company|ft
Вывести список запущенных процессов пользователя с графическими окнами (в список не попадут фоновые и системные процессы):
Get-Process | Where-Object | Format-Table Id, Name, mainWindowtitle
.mainWindowTitle — процессы с графическими окнами» width=»» />.mainWindowTitle — процессы с графическими окнами» width=»» />
С помощью параметра IncludeUserName можно вывести имя пользователя (владельца), который запустил процесс:
Get-Process -Name winword -IncludeUserName
С помощью Where-Object можно выбрать процессы в соответствии с заданными критериями. Например, выведем все процессы, которые используются более 200 Мб оперативной памяти, отсортируем процессы в порядке убывания используемого объема RAM, размер памяти из Кб преобразуем в Мб:
Как мы уже говорили ранее командлет Get-Process в параметре CPU содержит время использования процессора конкретным процессом в секундах. Чтобы отобразить процент использования CPU процессами (по аналогии с Task Manager), используйте такую функцию:
function Get-CPUPercent
$CPUPercent = @Name = ‘CPUPercent’
Expression = $TotalSec = (New-TimeSpan -Start
[H1toH2]
Start-Process, Stop-Process: запуск и остановка процессов из PowerShell
Чтобы запустить новый процесс с помощью PowerShell используется команда:
Start-Process -FilePath notepad
Если каталог с исполняемым файлом отсутствует в переменной окружения $env:path, нужно указать полный путь к файлу:
Start-Process -FilePath ‘C:distrapp.exe’
Можно запустить программу и передать ей аргументы:
Start-Process -FilePath ping -ArgumentList «-n 10 192.168.1.11»
С помощью параметра WindowStyle вы можете задать режим запуска окна процесса (normal, minimized, maximized, hidden). Например, чтобы запустить программу в максимально развернуом окне и дождаться завершения процесса, выполните команду:
Start-Process -FilePath tracert -ArgumentList «192.168.1.11» –wait -windowstyle Maximized
С помощью командлета Stop-Process можно завершить любой процесс. Например, чтобы закрыть все запущенные процессы notepad:
Stop-Process -Name notepad
По-умолчанию не запрашивается подтверждение завершения процесса. Закрываются все процессы, которые соответствуют указанным критериям. Чтобы запросить подтверждение завершения для каждого процесса, добавьте –Confirm.
Stop-Process -Name notepad.exe -Confirm
(Get-Process -Name notepad).Kill()
Из PowerShell можно принудительно завершить все приложения, которые не отвечают диспетчеру процессов Windows:
Get-Process | where-object | Stop-Process
.StartTime).TotalSeconds
[Math]::Round( (
PowerShell: управление процессами на удаленном компьютере
С помощью аргумента ComputerName командлет Get-Process позволяет управлять процессами на удаленных компьютерах (должен быть включен и настроен WinRM).
Get-Process -ComputerName dc01, dc02| Format-Table -Property ProcessName, ID, MachineName
Мы рассматриваем встроенные возможности комнадлета Get-Process для управления процессами на удаленных компьютерах. Здесь не учитываются возможности PowerShell Remoting, которые доступны в командлетах Invoke-Command и Enter-PSSession.
Если вы хотите завершить процесс на удаленном компьютере, имейте в виду, что у командлета Stop-Process отсутствует параметр –ComputerName. Для завершения процесса на удаленном компьютере можно использовать такой PowerShell код:
$RProc = Get-Process -Name notepad -ComputerName dc01
Stop-Process -InputObject $RProc
.CPU * 100 / $TotalSec), 2)
>
>
Get-Process | Select-Object -Property Name, $CPUPercent, Description | Sort-Object -Property CPUPercent -Descending | Select-Object -First 20
>
Чтобы найти зависшие процессы (которые не отвечают), выполните команду:
[/H1toH2]
Как запустить команду на удалённой системе
Основное использование команды PsExec — это просто запуск команды в удалённой системе. Чтобы запустить команду в удалённой системе, мы должны указать имя пользователя и пароль вместе с командой для запуска на удалённом компьютере.
Общий вид команды для запуска на удалённой системе:
- \КОМПЬЮТЕР — имя компьютера Windows или его IP адрес в локальной сети
- -u Администратор — если операционная система на ином языке, то имя пользователя также будет другим, например, на английском это Administrator
- -p ПАРОЛЬ — пароль пользователя Администратор. Эту опцию можно пропустить, тогда команда запросит пароль для ввода
- КОМАНДА — программа, которую нужно выполнить на удалённой системе. После команды могут идти её опции.
Пример выполнения команды ipconfig на удалённом компьютере \hackware-server от имени пользователя Администратор с паролем Aa1:
Как мы видим, команда выполняется в удалённой системе без проблем.
У удалённого компьютера HACKWARE-SERVER IP адресом является 192.168.0.53, поэтому следующая команда эквивалентна предыдущей:
Обратите внимание, что в Windows (в противоположность Linux), регистр букв в именах компьютеров, командах и путях не имеет значения — можно использовать буквы любого регистра в любых местах.
PsGetSid
Это отображает идентификатор безопасности для компьютера или пользователя и принимает стандартные аргументы. Эта утилита, вероятно, полезна только в очень специфических сценариях, с которыми мы лично не сталкивались. Так что попробуйте один раз и забудьте об этом, пока вам не понадобится когда-нибудь.
Инвентаризация
RMS имеет специальный инструмент, предназначенный для инвентаризации аппаратного и программного обеспечения удаленных компьютеров.
Имеется возможность автоматического составления отчетов по указанным компьютерам, с возможностью экспорта в HTML или XML формате.
Для доступа к удаленному рабочему столу RMS использует свой собственный протокол. Однако, имеется возможность подсоединиться через RMS к удаленному компьютеру, используя протокол RDP (Remote Desktop Protocol) компании Microsoft Corporation.
Для прямого соединения, внутри локальной или корпоративной сети, нет необходимости, чтобы на удаленном компьютере был установлен RMS Хост, т.е. возможно прямое соединение по RDP. Но, в случае если необходим доступ по RDP через интернет, а прямого IP адреса нету, на помощь приходит наша разработка — RDP over ID (RDP через ID). Данная возможность позволяет соединяться по протоколу RDP через наш Internet-ID канал. Это дает возможность обойти сетевые экраны и NAT. В этом случае, на удаленном компьютере должен быть установлен RMS Хост.