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

PsExec — это инструмент командной строки, с помощью которого можно выполнять процессы на удаленных системах, перенаправляя данные, которые приложение выводит на экран, на локальную машину. В результате складывается впечатление, что приложение работает локально. PsExec можно бесплатно загрузить с Web-узла компании Sysinternals (http://www.sysinternals.com). Приемы, описанные в данной статье, помогут более эффективно использовать потенциал PsExec как утилиты управления системой.

Комплекс PsTools

PsExec входит в состав программного комплекса PsTools компании Sysinternals. Всего в комплексе 11 инструментов. Утилиты комплекса соответствуют ряду технических требований, в частности совместимы с Windows NT 4.0 и более новыми версиями операционной системы. Все они представляют собой консольные приложения и могут работать как на локальной, так и на удаленной машине. Утилиты PsTools не требуют установки программ на удаленной системе вручную и позволяют назначать альтернативные пароли и имена пользователей для доступа к удаленному компьютеру.

Комплекс называется PsTools, а названия всех входящих в него инструментов начинаются с приставки Ps, так как первым спроектированным мною инструментом, удовлетворяющим перечисленным критериям, был PsList — программа для подготовки списка активных процессов. Я назвал инструмент по аналогии с утилитой ps, которая выполняет ту же функцию в Unix.

Для дистанционного запуска процессов с помощью PsExec необходимо, чтобы как локальные, так и удаленные компьютеры обеспечивали разделение файлов и принтеров (службы Workstation и Server), а на удаленной машине был определен стандартный разделяемый ресурс Admin$ (скрытый ресурс, отображаемый в каталог windows). Причины этих требований станут понятны после того, как будет описан механизм работы PsExec.

PsExec

PsExec легко развернуть благодаря способности утилиты дистанционно запускать процессы без необходимости ручной установки программ на удаленной системе. Инструмент не был бы столь эффективным, если бы единственной функцией PsExec был запуск программ на удаленной машине. Но благодаря возможности перенаправлять входные и выходные данные консольных приложений PsExec превращается в гибкую утилиту управления системой. Взглянув на параметры командной строки PsExec (экран 1), можно составить представление о возможностях данной утилиты. Многие консольные административные инструменты Windows могут работать только на локальной машине. PsExec позволяет дистанционно запустить любой из этих инструментов. Например, можно установить конфигурацию удаленной системы с помощью Ipconfig, утилиты Windows, которая показывает параметры TCP/IP сетевых адаптеров. Образец такой команды:

psexec emote ipconfig

где remote — имя или IP-адрес исследуемой системы. Результаты работы Ipconfig появятся на экране, как будто Ipconfig была запущена на локальной машине.

Экран 1. Аргументы командной строки для Ps Exec

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

Еще более эффективное применение функции перенаправления консоли PsExec — запуск командной строки на удаленной системе как на локальной. Этот прием похож на запуск клиента Telnet на локальной машине и соединение со службой Telnet на удаленном компьютере, но при этом не нужна ни служба Telnet, ни любая другая специальная служба на удаленной системе. Достаточно выполнить команду:

psexec emote cmd

Если на удаленной системе нужно выполнить одну консольную команду, следует использовать ключ /c, указав вслед за ним выполняемую команду. Например, команда

psexec emote cmd /c ver

отображает номер версии Windows на удаленной машине в консоли локального компьютера.

Еще одно распространенное применение PsExec — развертывание оперативных исправлений и других программ коррекции с неинтерактивным сетевым интерфейсом. Задача облегчается благодаря возможности указать имена многих компьютеров, имя текстового файла, содержащего список имен компьютеров или специальное имя *, которое генерирует перечень всех компьютеров в текущем домене. Например, чтобы запустить инструмент удаления Microsoft MyDoom на компьютерах с именами Remote и Remote1 и записать статус завершения операции очистки в файл, можно использовать команду:

psexec emote,remote1

-c doomcln.exe

-s 2> results.log

В результате ее выполнения процесс выдает целое число, которое может быть прочитано родительским процессом. Программы часто используют код завершения, чтобы сообщить об успешном выполнении или сбое. Каждый раз, когда завершается работа процесса, запущенного с помощью PsExec, утилита выводит на экран код завершения процесса и возвращает его как собственный код завершения. Следует протестировать конкретную программу или узнать в документации значения тех или иных кодов, но код 0 обычно свидетельствует об успешном завершении. Ключ -s указывает, что PsExec должен выполнить команду для учетной записи System. Далее этот режим будет рассмотрен подробнее.

Безопасность PsExec

Существует несколько способов интеграции PsExec в систему безопасности Windows. По умолчанию процесс на удаленной машине использует учетную запись, от имени которой PsExec был запущен на локальном компьютере. Заимствование прав (impersonation) несколько ограничено требованиями безопасности — удаленный процесс не имеет доступа ко всем сетевым ресурсам, даже к тем из них, которые обычно доступны для данной учетной записи. Если учетная запись не имеет локальных административных полномочий на удаленной машине, запускаемый процесс должен иметь доступ к сетевым ресурсам или процесс нужно запустить от имени другой учетной записи, следует использовать PsExec с ключом -u, чтобы указать альтернативное имя учетной записи. Например, можно ввести команду

-u remoteadministrator

-p adminpass ipconfig

чтобы запустить Ipconfig из учетной записи Administrator на удаленной машине. Указав ключ -p, можно ввести пароль для учетной записи, заданной ключом -u. Если опустить ключ -p, PsExec попросит ввести пароль (в целях обеспечения безопасности пароль на экране не отображается).

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

Удаленный процесс можно запустить также от имени учетной записи System, с которой работают службы и базовые процессы Windows, такие как Winlogon и Local Security Authority Subsystem Service (LSASS). Учетная запись System располагает широкими полномочиями. Стандартные параметры безопасности некоторых ресурсов файловой системы и реестра предусматривают доступ только с учетной записью System — примерами могут служить раздел реестра HKEY_LOCAL_MACHINESAM и каталог System Volume Information, который имеется в каждом томе всех систем Windows 2000 и более поздних.

Например, если нужно узнать содержимое раздела SAM, который выглядит пустым в редакторе regedit, так как regedit позволяет перейти в этот раздел только пользователю учетной записи System, можно задействовать PsExec подобно команде Runas (реализована в Windows 2000 и более поздних версиях) для запуска regedit с учетной записью System. Команда выглядит следующим образом:

psexec -s -i

c:windows egedit.exe

В команде не указывается имя удаленного компьютера и нет ключа -i (interactive). При вводе команды на «рабочем столе» появляется regedit, работающий от имени учетной записи System, и можно заглянуть в разделы HKEY_LOCAL_MACHINESAM и HKEY_LOCAL_MACHINESYSTEM. Редактор regedit появляется в консоли благодаря ключу -i; обычно это оправданно лишь в тех случаях, когда требуется запустить приложение с графическим интерфейсом на локальной системе, где с ним можно взаимодействовать.

Последнее замечание относительно безопасности относится к вирусам. Несколько вирусов используют PsExec для распространения в сети, и в результате несколько популярных антивирусных программ отмечают PsExec как «троянского коня» или «червя». Следует помнить, что PsExec работает на удаленных машинах только от имени учетной записи из административной группы удаленного компьютера. Другими словами, если учетная запись, от имени которой запускается утилита, не имеет административного доступа к удаленной системе, PsExec не сможет запустить процесс на удаленном компьютере. Кроме того, функциональность PsExec можно реализовать и другими способами; таким образом, утилита лишь незначительно облегчает задачу авторам вирусов, которые могут без труда самостоятельно реализовать функции PsExec.

Внутри PsExec

PsExec запускает выполняемый файл на удаленной машине и управляет входными и выходными потоками соответствующего процесса так, что администратор может взаимодействовать с программой с локального компьютера. Для этого PsExec извлекает из выполняемого образа встроенную службу Windows с именем Psexesvc и копирует ее в раздел Admin$ на удаленной машине. Затем через удаленный интерфейс Windows Service Control Manager API утилита PsExec запускает службу Psexesvc на удаленной машине.

Служба Psexesvc создает именованный канал, psexecsvc, с которым PsExec устанавливает соединение, и посылает команды, указывая службе на удаленном компьютере программы для запуска и режим выполнения. Если применяется ключ -d (don?t wait — не ждать), то служба завершает работу после запуска исполняемого файла; в противном случае служба ждет окончания работы программы, а затем посылает код завершения в PsExec, и он отображается на локальной консоли.

Марк Русинович (mark@sysinternals.com) — редактор Windows & .NET Magazine, автор многих популярных утилит для Windows, в том числе Process Explorer и Regmon