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

Автор: | 09.12.2017



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

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

Об одной из таких утилит и пойдет речь в этой статье.

 

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

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

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

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

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

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

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

ps**ec \\SRV1 ipconfig /flushdns

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

 

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

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

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

 

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

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

 

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

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

Эта возможность может пригодиться для отладки программ или доступа к скрытым разделам реестра SAM и SECURITY.

 

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

-c

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

ps**ec \\SRV1 -c test.exe

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

ps**ec \\SRV1 «c:\program files\test.exe»

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

-i

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

-d

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

-h

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

-l

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

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