Заметки о Windows и других программных продуктах Microsoft...

PsExec — утилита для удаленного выполнения команд

PsExec — утилита для удаленного выполнения команд

Выполнение команд на удаленном компьютере — задача довольно распространенная. Это может быть необходимо для изменения настроек системы, установки или удаления программ и много еще для чего. Для решения подобных задач есть довольно много различных инструментов, начиная с серьезных программных комплексов типа System Center Configuration Manager и заканчивая скромными утилитами командной строки . Об одной из таких утилит и пойдет речь в этой статье.

Утилита PsExec входит в состав пакета PsTools компании Sysinternals. Она позволяет выполнять команды на удаленных компьютерах  и при этом не требует установки в систему. Для использования утилиты достаточно просто скопировать ее в папку с исполняемыми файлами (напр. C:\Windows\system32)  и запустить из любой оболочки командной строки: Cmd или PowerShell.
Принцип работы программы состоит в следующем: в ресурсах исполняемого файла PsExec.exe находится еще один исполняемый файл – PSEXESVC, который является службой Windows. Перед выполнением команды PsExec распаковывает этот ресурс в скрытую административную папку удалённого компьютера Admin$ (C:\Windows), в файл C:\Windows\system32\psexesvc.exe.

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

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

Синтаксис PsExec выглядит следующим образом:

psexec \\компьютер [-u пользователь [-p пароль]] программа [аргументы]

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

В качестве примера очистим кэш dns на удаленном компьютере SRV1:

psexec \\SRV1 ipconfig /flushdns

запуск удаленной команды

 

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

Если нужно выполнить несколько команд, то лучше установить с удаленным компьютером интерактивный сеанс. Для этого вводим команду psexec \\SRV1 cmd . Теперь команды, вводимые на локальном компьютере будут выполняться на удаленном компьютере SRV1.

удаленное управление

 

PsExec позволяет выполнить команду одновременно на нескольких компьютерах. Для этого можно ввести имена компьютеров через запятую: psexec \\SRV1, SRV2 или сохранить их в текстовом файле и затем указать его адрес:  psexec @c:\comp.txt . Если же вместо имени компьютера поставить звездочку,  вот так:  psexec \\*  , то команда будет выполнена на всех компьютерах домена.

удаленное выполнение команды на нескольких компьютерах

 

И еще один интересный способ использования утилиты PsExec. Если не указывать имя компьютера, то по умолчанию команда выполняется в локальной системе. Используя ключ -s можно запускать программы под  учетной записью системы. Например, запустим сеанс командной строки: psexec -s cmd и затем командой whoami проверим, под каким пользователем мы сейчас работаем. Эта возможность может пригодиться для отладки программ или доступа к скрытым разделам реестра SAM и SECURITY.

запуск программы под системной учетной записью

 

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

-c

Указанная программа копируется в удаленную систему для выполнения. Например:

psexec \\SRV1 -c test.exe

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

psexec \\SRV1 «c:\program files\test.exe»

Если вместе с ключом -c использовать ключ -f то даже если программа уже есть в удаленной системе, она будет перезаписана. А с ключом -v она перезапишется только в том случае, если копируемая версия программы более новая чем та, что установлена в системе.

-i

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

-d

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

 -h

Используется для запуска программы в режиме повышения полномочий. Может потребоваться в операционных системах Windows Vista и выше для запуска некоторых программ, вносящих изменения в настройки системы (например regedit).

-l

А с помощью этого ключа можно наоборот понизить полномочия. При запуске процесса пользователю вне зависимости от его принадлежности к группе администраторов предоставляются ограниченные права (права группы  «администраторы» отменяются, и пользователю предоставляются только права, назначенные группе «пользователи»).

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

 
 
Комментарии
Сергей

Спасибо за статью, Кирилл.
Давно пользуюсь psexec, но до сих пор не понимаю как работает ключ -с? Где должен располагаться/как указать расположение копируемого файла?
Когда нужно было копировать свой файл на удаленную машину я нашел выход в PAExec (http://www.poweradmin.com/paexec).

Файл может располагаться где угодно, надо только указать к нему полный путь.

Так и не понятно как пользоваться ключом -c, примеров нет, в описание скудно. Как задать путь исходного файла и как указать путь на удаленной машине, куда этот файл хотим положить?

Если файл лежит в одной папке с утилитой psexec, то достаточно указать только его имя, если в другом месте — то нужен полный путь к нему. Например команда psexec \\srv2 -c ″C:\dirname\test.exe″ скопирует файл test.exe с локального компьютера на srv2 и выполнит его там.
Ну а куда файл скопируется на удаленной машине нам по идее без разницы 🙂