Удаленный доступ через cmd. Выполнение консольных команд на удаленных компьютерах по сети

07.11.2018

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.


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

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

psexec \\SRV1 -c test.exe

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

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

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

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

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

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

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

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

В данной статье рассмотрены способы выполнения консольных команд на уделенных компьютерах сети, в качестве примеров даются некоторые очень полезные для системных администраторов команды.

Я использую 2 средства удаленного выполнения консольных команд: PsExec и WinRM , у каждого из них есть свои преимущества.

PsExec

Одним из отличных решений поставленной в заголовке задачи является использование программы PsExec от великого Марка Руссиновича .

Программа работает по клиент-серверному принципу: на локальной машине выполняется клиент, который посылает команды серверу на удаленном компьютере. Особенностью этой программы является то, что серверная часть устанавливается автоматически непосредственно перед выполнением команды, а затем удаляется. Таким образом для выполнения команд на удаленных машинах достаточно иметь на них административные права.

Если PsExec запускается от имени администратора, который входит в тот же домен, что и удаленны компьютер, то никаких учетных данных даже вводить не нужно. В противном случае, их можно указать в командной строке, либо PsExec сама их запросит. PsExec работает на ОС начиная с Windows 2000 и заканчивая 64-битным Windows Server 2008 R2.

Очень полезными в PsExec являются следующие возможности:

  • Выполнение команды на группе компьютеров . Пример: следующая команда позволяет принудительно применить самые свежие групповые политики:
    psexec @group.txt gpupdate /force
  • Выполнение команд от имени системной учетной записи . Пример: следующая команда заставит удаленную систему принудительно проверить обновления:
    psexec \\computer -s wuauclt /detectnow
  • Копирование выполняемой программы на удаленный компьютер перед выполнением . Пример: следующая команда позволит обновить членство данного компьютера в группе безопасности Active Directory (токен доступа) без перезагрузки:
    psexec \\computer -c -s klist.exe purge

Трудно переоценить пользу этой программы, если использовать скрипты и возможности консольных команд, встроенных в Windows.

Windows Remote Management

Изначально это была серверная технология для удаленного управления оборудованием, которая появилась в Windows Server 2003 R2 как часть компонента Hardware Management, но недавно Microsoft выпустили пакет Windows Management Framework, который включает в себя PowerShell 2.0 и WinRM 2.0 и устанавливается на клиентские ОС как обновление. Подробности можно прочитать в статье KB968929 .

Прелесть WinRM заключается в простоте развертывания в доменной среде через WSUS в качестве факультативного обновления ОС и мощи, которую даёт совместное с PowerShell применение.

Использование WinRM происходит через 2 команды.

winrm.cmd служит для конфигурирования настроек и диагностики клиента и сервера WinRM.

Для того, чтобы сервер WinRM начал принимать команды, должна быть запущена служба Windows Remote Management и произведена её начальная конфигурация. Используйте команду

winrm quickconfig на локальной машине, либо финт ушами
psexec -s \\servername winrm quickconfig по сети, используя PsExec от имени системной учетной записи.

Будет предложено автоматически запускать службу WinRM и разрешить уделенные подключения, соглашайтесь;)

Чтобы успешно подключаться к WinRM серверу (имеется в виду серверная часть, принимающая команды), не входящему в тот же домен, что и ваш клиентский компьютер, необходимо на клиенте этот целевой сервер добавить в «доверенный список» следующей командой:

winrm set winrm/config/client @{TrustedHosts="servername"} , где вместо servername можно указать IP-адрес, либо * (звёздочку).

Для пользователей Windows Vista и Windows 7, работающим не от имени встроенного администратора (обычно так и бывает), нужно выполнить следующую команду

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

По умолчанию, установлено ограничение на 5 одновременных соединений WinRM от клиента, для увеличения этого числа выполните команду

winrm s winrm/config/winrs @{MaxShellsPerUser="X"}

winrs.exe — клиент для отправки запросов к серверной части. Пример: следующая команда принудительно перезагрузит удаленную систему…

winrs -r:servername shutdown /r /t 0

В доменной среде при отправке команд используются учетные данные запустившего пользователя. Для посыла команд от имени другого пользователя используются ключи -u:user -p:pass. Пример: следующая команда очистит локальный кэш DNS-имён на удаленной системе

winrs -r:servername -u:user -p:pass ipconfig /flushdns

Служебные программы, такие как Telnet, и программы удаленного управления, такие как PC Anywhere компании Symantec, позволяют выполнять программы в удаленных системах, однако их не так просто установить, поскольку требуется устанавливать еще и клиентское программное обеспечение в тех удаленных системах, к которым необходимо получить доступ. Программа PsExec - это облегченный вариант Telnet. Она позволяет выполнять процессы в удаленных системах, используя для этого все возможности интерактивного интерфейса консольных приложений, и при этом нет необходимости вручную устанавливать клиентское программное обеспечение. Основное достоинство PsExec - это возможность вызывать в интерактивном режиме интерфейс командной строки в удаленных системах и удаленно запускать такие инструменты как IpConfig. Это единственный способ вывести на экран локального компьютера данные об удаленной системе.

Примечание. Некоторые антивирусные сканеры сообщают, что одна или несколько из этих программ заражены вирусом «remote admin». Ни одна из программ, входящих в набор PsTools, не содержит вирусов, но они использовались вирусами, что и приводит к появлению таких предупреждений.

Установка

Просто скопируйте программу PsExec в папку для исполняемых файлов. При вводе команды psexec на экран выводится справка о синтаксисе команды.

Программа PsExec работает в операционных системах Windows Vista, NT 4.0, Win2000, Windows XP и Server 2003, в том числе в 64-разрядных версиях ОС

Использование

В статье Марка Руссиновича в выпуске журнала Windows IT Pro Magazine за июль 2004 года описаны дополнительные методы работы с программой PsExec .

использование: psexec [\\компьютер[,компьютер2[,...] | @файл][-u пользователь [-p пароль]][-n s][-l][-s|-e][-x][-i [сеанс]][-c [-f|-v]][-w каталог][-d][-<приоритет>][-a n,n,... ] программа [аргументы]

компьютер

Указывает программе PsExec, что нужно запустить приложение на заданном компьютере или компьютерах. Если имя компьютера не указано, то программа PsExec запустит приложение в локальной системе, если же вместо имени компьютера задан символ «звездочка» (\\*), то программа PsExec запустит приложение на всех компьютерах текущего домена.

@файл

Указывает программе PsExec, что нужно запустить приложение на всех компьютерах, перечисленных в заданном текстовом файле.

Процессоры, на которых можно запустить приложение, отделяются запятыми, при этом процессоры нумеруются, начиная с 1. Например, чтобы запустить приложение на процессорах втором и четвертом, введите «-a 2,4»

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

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

Указанный профиль учетной записи не загружается.

Указанная программа копируется в удаленную систему, даже если такой файл в удаленной системе уже есть.

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

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

Позволяет задать задержку подключения к удаленным компьютерам (в секундах).

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

Удаленный процесс запускается из системной учетной записи.

Позволяет указать необязательное имя пользователя для входа в удаленную систему.

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

Позволяет указать для процесса рабочий каталог (путь внутри удаленной системы).

Отображает интерфейс пользователя на рабочем столе Winlogon (только в локальной системе).

-приоритет (приоритет)

Позволяет задавать для процесса различные приоритеты: -low (низкий), -belownormal (ниже среднего), -abovenormal (выше среднего), -high (высокий) или -realtime (реального времени).

программа

Имя запускаемой программы.

аргументы

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

Чтобы задать имя приложения, которое содержит пробелы, используйте кавычки, например psexec \\marklap "c:\длинное имя\app.exe". Введенные данные передаются в удаленную систему при нажатии клавиши «Ввод», для завершения удаленного процесса нужно нажать сочетание клавиш Ctrl-C.

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

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

Примеры

Эта команда вызывает интерактивный интерфейс командной строки в системе \\marklap:

psexec \\marklap cmd

Эта команда запускает в удаленной системе программу IpConfig с параметром /all и выводит полученные данные на экран локальной системы:

psexec \\marklap ipconfig /all

Эта команда копирует программу test.exe в удаленную систему и выполняет ее в интерактивном режиме.

psexec \\marklap -c test.exe

Если в удаленной системе такая программа уже установлена и находится не в системном каталоге, укажите полный путь к этой программе

psexec \\marklap c:\bin\test.exe

Эта команда запускает в интерактивном режиме из системной учетной записи программу Regedit для просмотра данных разделов реестра SAM и SECURITY:

psexec -i -d -s c:\windows\regedit.exe

Эта команда используется для вызова программы Internet Explorer от имени пользователя с ограниченными правами:

psexec -l -d "c:\program files\internet explorer\iexplore.exe"