Запуск процесса на удалённом компьютере — PsExec

Есть такая очень популярная задачка, которую приходится решать администраторам — запуск некоей утилиты, программы или сценария на другом компьютере, не вставая с места. Да, лень безусловно одно из главных свойств сисадминов, но когда речь идет о сотнях или тысячах компьютеров, трудолюбие не является достоинством🙂

Так как задача эта популярная, то и способов её решения есть множество. Начиная от групповых политик (startup/logon сценарии), и заканчивая мощными системами управления, вроде SC Essentials или Configuration Manager/SMS. Но я хочу рассмотреть методы которые доступны сразу из командной строки, и не требуют предварительной подготовки компьютеров, установки агентов и прочей суматохи🙂 Достаточно лишь административных полномочий на целевом компьютере.

Сегодня я опишу один из самых древних способов какими я решал эту задачу — это psexec.exe от Microsoft SysInternals, творение Марка Руссиновича. Это утилита командной строки состоящая из одного файла, portable (то есть не требующая установки), и проверенная тысячами админов и временем🙂

Использовать её достаточно просто, например просто выполнить команду HostName.exe на компьютере scenic11 можно так:

image

По умолчанию программа дожидается выполнения программы, выводит её результаты (в данном случае имя компьютера — Scenic11) и сообщает код выхода программы (0 — без ошибок).

Разумеется у Psexec есть еще множество других ключей, которые можно посмотреть с помощью команды psexec /?

Например можно запустить процесс на нескольких компьютерах из файла, не ожидая его завершения (ключ -d) и позволив вывести графический интерфейс на экран, то есть интерактивно (-i):

psexec @c:\temp\comps.txt -i -d calc.exe

Или если хочется получить интерактивную сессию командной строки на удалённом сервере — просто выполняем следующую команду:

psexec \\server1 cmd

Еще несколько примеров и описания параметров есть на странице программы.

А теперь давайте изучим каким образом работает эта утилита😉

Всё гениально как обычно очень просто🙂 В ресурсах psexec.exe содержится еще одна программа (а точнее служба) — psexesvc.exe, которая распаковывается, и копируется на удалённую систему, с помощью скрытой административной общей папки — \\Компьютер\ADMIN$\System32\psexesvc.exe. Затем эта служба запускается с использованием стандартных API управления службами (таким же образом как работают sc.exe или оснастка mmc "Службы"). После запуска устанавливается обычное клиент-серверное соединение между psexec.exe и psexesvc.exe, и уже затем запускается приложение, и передается ввод/вывод. То есть хоть сусл агента и не видно, — на самом деле он есть😉 Подробнее можно почитать например тут.

Другие способы выполнения команд на удалённом компьютере: WMI, WinRM.

комментариев 27 to “Запуск процесса на удалённом компьютере — PsExec”

  1. hvs Says:

    PSEXEC — вещь классная, пользуюсь уже 4 года, но вот обладает несколькими недостатками (для меня основными):
    1. Не позволяет запустить сессию PoSH также, как простой CMD.
    2. Вывод консольных программ в удаленном сеансе CMD (если программа не выводит в UNICOD’е) отображается «белибердой» (например, IPCONFIG).
    3. Ну и переодические «подвисания» при отмене выполнения по «CTRL-C».

    А в остальном — «must have»! (особенно для выполнения удаленных пакетных заданий)

  2. Xaegr Says:

    2 hvs: Спасибо, я совсем забыл упомянуть о недостатках😦 Особенно о первом🙂
    Но тема еще не закрыта, у меня осталось немало способов😉

  3. hvs Says:

    А что, есть обходной маневр по «пункту 1» ? Очень интересно было бы узнать…

  4. Xaegr Says:

    2 hvs: ну не обходной🙂 В 2.0 это легко будет, без всякого psexec’а и намного лучше🙂

  5. hvs Says:

    В любом случае, жду продолжения — всегда и нтересно узнать что-то новое, чего може и не знаешь еще😉

  6. Oleg Medvedev Says:

    Самый интересный вопрос, который я ищу уже сколько времени — это выполнить задачу на машине пользователя от имени пользователя, а не от своего (или другого админского), как это делает psexec или использование schtasks.

  7. Xaegr Says:

    2 Oleg Medvedev: Хм, и psexec и schtask позволяют указать пользователя от имени которого будет выполнятся команда. Причем необязательно чтобы пользователь обладал правами администратора — сейчас проверил.

  8. Oleg Medvedev Says:

    Нененене… я имел в виду — если я хочу, чтобы программа исполнялась от имени именно залогинённого пользователя, в его окружении. Я же не знаю его паролей. Кроме логон скрипта пока я возможностей вообще не вижу…

  9. Xaegr Says:

    2 Oleg Medvedev: Ну наверное в этом есть определённый смысл — вы не знаете его паролей, и не имеете права запускать процессы от его имени🙂 Что то подобное можно еще реализовать если использовать клиента запускаемого под учетной записью пользователя.
    Но зачем? Какой сценарий вы хотите реализовать?

  10. Oleg Medvedev Says:

    Хм. Вообще-то этот сценарий не очень-то и необходимый, просто удобство некоторое есть при собирании информации от имени десктопного пользователя. Например, принудительное выполнение checkcfg, не дожидаясь перелогина. Я, конечно же, могу его исполнить и от имени админа, но тогда в информации и будет записан текущий пользователь — админ. Это, конечно, не беда, и решаемо, тем более powershellом — но как-то неудобно.

  11. Xaegr Says:

    2 Oleg Medvedev: Это скорее беда CheckCfg что он требует запуска от имени залогиненного пользователя😉

  12. Oleg Medvedev Says:

    CheckCfg не требует. Просто в собранной инфе он в том числе пишет и залогинённого пользователя, что иногда полезно.
    Используя сторонние скрипты, можно это исправить, но это костыли — некрасиво как-то.

  13. Xaegr Says:

    2 Oleg Medvedev: Залогиненого пользователя можно посмотреть независимо от того под кем запущена программа, так что всё таки checkcfg виноват😉
    Еще есть сценарии где может понадобится запуск под текущим пользователем?😉

  14. Виталий Says:

    Логичный вопрос напрашивается: есть там такой параметр -i. Позволяет отображать графически и управлять процессом установки программ. Но это отображение и управление происходит на удаленном компьютере, на который непосредственно устанавливается приложение. А можно ли как-то перенаправить это на компьютер администратора, с которого запускается psexec? Чтоб непосредственно администратор руководил процессом установки.

  15. Xaegr Says:

    2 Виталий: Эта технология называется «служба терминалов»😉

  16. Виталий Says:

    Про службу терминалов знаю. Но в Вин ХР при подключении админа пользователя выкидывает из сеанса. Есть программы, позволяющие устранить эту проблему, но устанавливая их, нарушаем права Майкрософт. Есть программы аля радмин, но они не устраивают по причине того, что пользователь видит, как я что-то устанавливаю (у меня юзеры пугливые и сразу ко мне прибегают с выпученными глазами и возгласами, что у них нечистая сила живет в компьютере). В идеале пользователь не должен подозревать, что на его компьютере в данный момент что-то устанавливается. Никто не может помочь советом? или хотя бы в каком направлении гуглить?

  17. Xaegr Says:

    «В идеале пользователь не должен подозревать, что на его компьютере в данный момент что-то устанавливается.»
    Именно так. Поэтому на компьютеры пользователей все продукты должны устанавливаться автоматически, с помощью настроенных инсталляторов.
    Для начала — http://www.isaserver.org/tutorials/Windows_2000_Software_Management_Automatic_Installation_Options_for_Firewall_Clients.html
    http://technet.microsoft.com/en-us/library/cc738858.aspx
    А потом например appdeploy.com

  18. Виталий Says:

    Так и знал, что к групповым политикам отошлете меня =) Проблема в том, что у меня нет доступа к групповым политикам и никто мне его не даст😦
    А вот за appdeploy спасибо. Покурю маны и буду тестить =)

  19. hvs Says:

    2 Виталий
    Ну почему обязательно «…к групповым политикам отошлете меня…»?
    Можно производить инсталляции также и из планировщика заданий, указав в качестве запускаемого приложения сам инсталляционную программу с необходимыми ключами или (в случае .MSI-пакета) msiexec имя_пакета ключи_установки» ну или «start имя_пакета ключи_установки». Тоже великолепно отрабатывает, только нужно в параметрах планируемого задания указать опцию «одноразовый запуск». Кстати, можно будет потом (в случае неудачи😉 ) повторить запуск зайдя через обычный файловый доступ по сети в сетевую папку пользователя «назначенные задания» и просто сказать «фас!», пардон, «запустить».

  20. Xaegr Says:

    И почему не дадут доступа к групповым политикам? Его прекрасно можно делегировать. Ведь вам же дали административный доступ к вашим компьютерам? Можно выдать разрешение вешать на них (и только на них) групповые политики.

  21. Запуск процесса на удалённом компьютере – WinRM (WS-Management) « PowerShell и другие скрипты Says:

    […] способы выполнения команд на удалённом компьютере: PsExec.exe, […]

  22. Запуск процесса на удалённом компьютере – WMI « PowerShell и другие скрипты Says:

    […] способы выполнения команд на удалённом компьютере: PsExec.exe, […]

  23. Al Says:

    А на windows 6(vista,w2k8) PsExec запускает процессы в нулевой сессии или в десктопной?

  24. Xaegr Says:

    2 Al: Как укажете так и запустит. Без ключа -i в нулевой, а с ним — интерактивно.

  25. Al Says:

    Сенкс, полезная штуковина.😉

  26. Алекс Пашковский Says:

    Есть ли сценарии, в которых необходимо запускать процесс от имени текущего пользователя? Конечно! Вот, например, такая задачка: на группе компов периодически нужно удалять временные файлы.

  27. Xaegr Says:

    2 Алекс Пашковский: Просто берём и перебираем профили из HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList приписывая путь к временной папке. Это лучше чем логинится под всеми этими пользователями поочередно =)


Обсуждение закрыто.

%d такие блоггеры, как: