Есть такая очень популярная задачка, которую приходится решать администраторам – запуск некоей утилиты, программы или сценария на другом компьютере, не вставая с места. Да, лень безусловно одно из главных свойств сисадминов, но когда речь идет о сотнях или тысячах компьютеров, трудолюбие не является достоинством
Так как задача эта популярная, то и способов её решения есть множество. Начиная от групповых политик (startup/logon сценарии), и заканчивая мощными системами управления, вроде SC Essentials или Configuration Manager/SMS. Но я хочу рассмотреть методы которые доступны сразу из командной строки, и не требуют предварительной подготовки компьютеров, установки агентов и прочей суматохи
Достаточно лишь административных полномочий на целевом компьютере.
Сегодня я опишу один из самых древних способов какими я решал эту задачу – это psexec.exe от Microsoft SysInternals, творение Марка Руссиновича. Это утилита командной строки состоящая из одного файла, portable (то есть не требующая установки), и проверенная тысячами админов и временем
Использовать её достаточно просто, например просто выполнить команду HostName.exe на компьютере scenic11 можно так:
По умолчанию программа дожидается выполнения программы, выводит её результаты (в данном случае имя компьютера – 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.









PSEXEC – вещь классная, пользуюсь уже 4 года, но вот обладает несколькими недостатками (для меня основными):
1. Не позволяет запустить сессию PoSH также, как простой CMD.
2. Вывод консольных программ в удаленном сеансе CMD (если программа не выводит в UNICOD’е) отображается «белибердой» (например, IPCONFIG).
3. Ну и переодические «подвисания» при отмене выполнения по «CTRL-C».
А в остальном – «must have»! (особенно для выполнения удаленных пакетных заданий)
Комментарий от hvs — 21.12.2008 @ 20:21
2 hvs: Спасибо, я совсем забыл упомянуть о недостатках
Особенно о первом 
Но тема еще не закрыта, у меня осталось немало способов
Комментарий от Xaegr — 21.12.2008 @ 20:26
А что, есть обходной маневр по «пункту 1″ ? Очень интересно было бы узнать…
Комментарий от hvs — 22.12.2008 @ 8:42
2 hvs: ну не обходной
В 2.0 это легко будет, без всякого psexec’а и намного лучше
Комментарий от Xaegr — 22.12.2008 @ 8:45
В любом случае, жду продолжения – всегда и нтересно узнать что-то новое, чего може и не знаешь еще
Комментарий от hvs — 22.12.2008 @ 8:55
Самый интересный вопрос, который я ищу уже сколько времени — это выполнить задачу на машине пользователя от имени пользователя, а не от своего (или другого админского), как это делает psexec или использование schtasks.
Комментарий от Oleg Medvedev — 22.12.2008 @ 10:34
2 Oleg Medvedev: Хм, и psexec и schtask позволяют указать пользователя от имени которого будет выполнятся команда. Причем необязательно чтобы пользователь обладал правами администратора – сейчас проверил.
Комментарий от Xaegr — 22.12.2008 @ 10:40
Нененене… я имел в виду — если я хочу, чтобы программа исполнялась от имени именно залогинённого пользователя, в его окружении. Я же не знаю его паролей. Кроме логон скрипта пока я возможностей вообще не вижу…
Комментарий от Oleg Medvedev — 22.12.2008 @ 11:26
2 Oleg Medvedev: Ну наверное в этом есть определённый смысл – вы не знаете его паролей, и не имеете права запускать процессы от его имени
Что то подобное можно еще реализовать если использовать клиента запускаемого под учетной записью пользователя.
Но зачем? Какой сценарий вы хотите реализовать?
Комментарий от Xaegr — 22.12.2008 @ 11:28
Хм. Вообще-то этот сценарий не очень-то и необходимый, просто удобство некоторое есть при собирании информации от имени десктопного пользователя. Например, принудительное выполнение checkcfg, не дожидаясь перелогина. Я, конечно же, могу его исполнить и от имени админа, но тогда в информации и будет записан текущий пользователь — админ. Это, конечно, не беда, и решаемо, тем более powershellом — но как-то неудобно.
Комментарий от Oleg Medvedev — 22.12.2008 @ 11:47
2 Oleg Medvedev: Это скорее беда CheckCfg что он требует запуска от имени залогиненного пользователя
Комментарий от Xaegr — 22.12.2008 @ 11:49
CheckCfg не требует. Просто в собранной инфе он в том числе пишет и залогинённого пользователя, что иногда полезно.
Используя сторонние скрипты, можно это исправить, но это костыли — некрасиво как-то.
Комментарий от Oleg Medvedev — 22.12.2008 @ 13:50
2 Oleg Medvedev: Залогиненого пользователя можно посмотреть независимо от того под кем запущена программа, так что всё таки checkcfg виноват
Еще есть сценарии где может понадобится запуск под текущим пользователем?
Комментарий от Xaegr — 22.12.2008 @ 13:53
Логичный вопрос напрашивается: есть там такой параметр -i. Позволяет отображать графически и управлять процессом установки программ. Но это отображение и управление происходит на удаленном компьютере, на который непосредственно устанавливается приложение. А можно ли как-то перенаправить это на компьютер администратора, с которого запускается psexec? Чтоб непосредственно администратор руководил процессом установки.
Комментарий от Виталий — 23.12.2008 @ 16:17
2 Виталий: Эта технология называется «служба терминалов»
Комментарий от Xaegr — 23.12.2008 @ 16:19
Про службу терминалов знаю. Но в Вин ХР при подключении админа пользователя выкидывает из сеанса. Есть программы, позволяющие устранить эту проблему, но устанавливая их, нарушаем права Майкрософт. Есть программы аля радмин, но они не устраивают по причине того, что пользователь видит, как я что-то устанавливаю (у меня юзеры пугливые и сразу ко мне прибегают с выпученными глазами и возгласами, что у них нечистая сила живет в компьютере). В идеале пользователь не должен подозревать, что на его компьютере в данный момент что-то устанавливается. Никто не может помочь советом? или хотя бы в каком направлении гуглить?
Комментарий от Виталий — 23.12.2008 @ 16:29
«В идеале пользователь не должен подозревать, что на его компьютере в данный момент что-то устанавливается.»
Именно так. Поэтому на компьютеры пользователей все продукты должны устанавливаться автоматически, с помощью настроенных инсталляторов.
Для начала – 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
Комментарий от Xaegr — 23.12.2008 @ 16:34
Так и знал, что к групповым политикам отошлете меня =) Проблема в том, что у меня нет доступа к групповым политикам и никто мне его не даст
А вот за appdeploy спасибо. Покурю маны и буду тестить =)
Комментарий от Виталий — 23.12.2008 @ 16:54
2 Виталий
) повторить запуск зайдя через обычный файловый доступ по сети в сетевую папку пользователя «назначенные задания» и просто сказать «фас!», пардон, «запустить».
Ну почему обязательно «…к групповым политикам отошлете меня…»?
Можно производить инсталляции также и из планировщика заданий, указав в качестве запускаемого приложения сам инсталляционную программу с необходимыми ключами или (в случае .MSI-пакета) msiexec имя_пакета ключи_установки» ну или «start имя_пакета ключи_установки». Тоже великолепно отрабатывает, только нужно в параметрах планируемого задания указать опцию «одноразовый запуск». Кстати, можно будет потом (в случае неудачи
Комментарий от hvs — 23.12.2008 @ 17:03
И почему не дадут доступа к групповым политикам? Его прекрасно можно делегировать. Ведь вам же дали административный доступ к вашим компьютерам? Можно выдать разрешение вешать на них (и только на них) групповые политики.
Комментарий от Xaegr — 23.12.2008 @ 17:06
[...] способы выполнения команд на удалённом компьютере: PsExec.exe, [...]
Уведомление от Запуск процесса на удалённом компьютере – WinRM (WS-Management) « PowerShell и другие скрипты — 12.1.2009 @ 10:59
[...] способы выполнения команд на удалённом компьютере: PsExec.exe, [...]
Уведомление от Запуск процесса на удалённом компьютере – WMI « PowerShell и другие скрипты — 12.1.2009 @ 11:02
А на windows 6(vista,w2k8) PsExec запускает процессы в нулевой сессии или в десктопной?
Комментарий от Al — 20.1.2009 @ 21:42
2 Al: Как укажете так и запустит. Без ключа -i в нулевой, а с ним – интерактивно.
Комментарий от Xaegr — 21.1.2009 @ 9:18
Сенкс, полезная штуковина.
Комментарий от Al — 21.1.2009 @ 16:05
Есть ли сценарии, в которых необходимо запускать процесс от имени текущего пользователя? Конечно! Вот, например, такая задачка: на группе компов периодически нужно удалять временные файлы.
Комментарий от Алекс Пашковский — 31.7.2009 @ 15:37
2 Алекс Пашковский: Просто берём и перебираем профили из HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList приписывая путь к временной папке. Это лучше чем логинится под всеми этими пользователями поочередно =)
Комментарий от Xaegr — 31.7.2009 @ 18:15