Если бы существовала утилита командной строки, которая могла бы конкурировать с robocopy по полезности, это была бы PsExec. Утилита Sysinternals PsExec так же широко распространена, как и любая другая в арсенале IT-администратора. Этот инструмент позволяет администраторам удаленно выполнять команды так, как если бы они находились на локальном компьютере.
Чтобы подробно рассмотреть инструмент PsExec, было уместно описать его в Полном руководстве ATA. В этом руководстве вы узнаете, что такое psexec, что он может и много примеров использования этого полезного инструмента.
Что такое PsExec.exe?
Если вы новичок в IT или, возможно, не имели необходимости запускать команды и инструменты на удаленных компьютерах, вам может быть неизвестно, что такое psexec.
PsExec или psexec.exe – это утилита командной строки, разработанная для Windows. Она позволяет администраторам запускать программы на локальных и, более распространенно, на удаленных компьютерах. Это бесплатная утилита, входящая в пакет Sysinternals pstools, созданный Марком Руссиновичем много лет назад.
Она была создана для замены таких инструментов, как telnet, которые заставляли вас открывать порты и создавали уязвимости безопасности. В настоящее время у нас есть другие варианты, такие как PowerShell Remoting и Invoke-Command
PowerShell cmdlet, но PsExec всё еще имеет свое место.
PsExec позволяет полностью взаимодействовать с консольными приложениями без установки какого-либо программного обеспечения. Как вы увидите из этого исчерпывающего руководства, PsExec может запускать интерактивные командные окна, выполняться от имени локальной системы на удаленных компьютерах, выполнять команды на нескольких компьютерах одновременно и многое другое.
Он поддерживает все версии Windows, начиная с Windows XP. Это означает, что да, PsExec работает и на Windows 10. Это простой инструмент, который работает практически везде, но не путайте его простоту с его возможностями!
Предварительные требования
Вам просто нужно запустить современную операционную систему Windows на вашем локальном компьютере, чтобы PsExec работал. Однако вы собираетесь запускать psexec на удаленных компьютерах. Для этого вам нужно убедиться, что выполнены несколько условий.
Если у вас сейчас нет этих элементов или вы не уверены, не беспокойтесь. В следующем разделе мы расскажем, как написать некоторый PowerShell-код для проверки ваших удаленных компьютеров.
- A modern Windows computer (local)
- На удаленном компьютере должна быть открыта служба “Общий доступ к файлам и принтерам” (TCP-порт 445)
- Должен быть доступен административный общий ресурс admin$ на удаленном компьютере
- Вы знаете учетные данные локальной учетной записи на удаленном компьютере
На данный момент актуальная версия PsExec – v2.2, именно о ней вы узнаете в этой статье.
Установка PSexec (с настройкой удаленного компьютера)
Технически, вам не нужно устанавливать PsExec, так как это всего лишь утилита командной строки, но по сути это похоже на установку. Поскольку нет необходимости в установке, вам просто нужно скачать и извлечь его из архива PsTools. PsExec не доступен как отдельная утилита и является частью набора инструментов PsTools.
Скачивание PSExec
Вы можете либо вручную извлечь файл ZIP, либо вот удобный фрагмент кода PowerShell для загрузки и извлечения PsExec из его файла ZIP. Обратите внимание, что это удалит все остальные инструменты PsTools. Многие из них все еще полезны, но мы не будем рассматривать их в этой статье.
Настройка удаленного компьютера
После загрузки PsExec вам нужно убедиться, что любой удаленный компьютер, на котором вы собираетесь его запустить, открыт. PsExec имеет простые требования: включенное Общий доступ к файлам и принтерам и доступ к административному ресурсу admin$.
Вы можете открыть Панель управления брандмауэром Windows, перейти к Разрешенным приложениям и включить Общий доступ к файлам и принтерам на всех компьютерах, как показано ниже.
Обратите внимание, что Общий доступ к файлам и принтерам является известным уязвимостью безопасности, поэтому убедитесь, что включен только профиль частной сети. Private.

Или вы можете посетить каждый компьютер и выполнить утилиту netsh, чтобы открыть его с помощью:
Или вы можете использовать командлет Set-NetFirewallRule
в PowerShell для этого.
Если вы не хотите посещать каждый компьютер, у вас есть PowerShell Remoting и вы находитесь в домене Active Directory, вы также можете одновременно открыть брандмауэр на нескольких компьютерах с помощью командлета Invoke-Command
.
Используя PsExec
Прежде чем бежать, нужно научиться ходить. Если вы никогда раньше не использовали PsExec, вам предстоит удивительное открытие! Обязательно прочтите этот раздел, чтобы разобраться с основами, прежде чем погружаться в глубины в этой статье.
Первый раз, когда вы запускаете PsExec на новой системе, вы сразу увидите соглашение о лицензии PsExec. Вам нужно будет нажать на кнопку Согласиться, чтобы начать его использовать.

Если вы хотите предотвратить отображение соглашения о лицензии, вы можете молча принять его, используя переключатель /accepteula
, как показано ниже.
Вы узнаете несколько трюков по отключению этого всплывающего окна EULA на локальных и удаленных компьютерах позже в статье.
Поиск помощи
Исследуя PsExec, вы не должны использовать ни одного переключателя. Когда вы просто запускаете psexec без переключателей, он вернет все варианты и краткое объяснение каждого из них. Все варианты представлены в таблице ниже для вашего удобства.
Switch | Explanation |
---|---|
-a | Separate processors on which the application can run with commas where 1 is the lowest numbered CPU. For example, to run the application on CPU 2 and CPU 4, enter: “-a 2,4” |
-c | Copy the specified program to the remote system for execution. If you omit this option the application must be in the system path on the remote system. |
-d | Don’t wait for process to terminate (non-interactive). |
-e | Does not load the specified account’s profile. |
-f | Copy the specified program even if the file already exists on the remote system. |
-i | Run the program so that it interacts with the desktop of the specified session on the remote system. If no session is specified the process runs in the console session. Some have reported best results always using the -s switch with -i due to windows being unintelligible. |
-h | If the target system is Vista or higher, has the proc |
-l | Run process as limited user (strips the Administrators group and allows only privileges assigned to the Users group). On Windows Vista the process runs with Low Integrity. |
-n | Specifies timeout in seconds connecting to remote computers. |
-p | Specifies optional password for user name. If you omit this you will be prompted to enter a hidden password. |
-r | Specifies the name of the remote service to create or interact. with. |
-s | Run the remote process in the System account. |
-u | Specifies optional user name for login to computer. |
-v | Copy the specified file only if it has a higher version number or is newer on than the one on the remote system. |
-w | Set the working directory of the process (relative |
-x | Display the UI on the Winlogon secure desktop (local system only). |
-arm | Specifies the remote computer is of ARM architecture. |
-priority | Specifies -low, -belownormal, -abovenormal, -high or |
-realtime | run the process at a different priority. Use |
-background | run at low memory and I/O priority on Vista. |
computer | Direct PsExec to run the application on the computer or computers specified. If you omit the computer name PsExec runs the application on the local system, and if you specify a wildcard (\*), PsExec runs |
@file | PsExec will execute the command on each of the computers listed in the file. |
-accepteula | This flag suppresses the display of the license dialog. |
-nobanner | Do not display the startup banner and copyright message. |
Запуск простой удаленной команды
В своей основе PsExec требует двух параметров: имени компьютера и команды для выполнения. Если у вас есть команда для выполнения на удаленном компьютере, которая не требует дополнительных аргументов, например, hostname
, вы можете просто добавить ее после имени компьютера.
Обратите внимание, что если вы не указываете полный путь к файлу, команда для выполнения должна находиться в пользовательском или системном пути. Кроме того, если у вас есть программа с пробелами в названии, вы всегда можете заключить ее в кавычки, например, “my application.exe”.
Вы можете увидеть ниже, что для выполнения команды hostname
на компьютере CONTOSODC1 вы задаете его UNC-путь, за которым следует команда. PSExec затем безопасно подключается к удаленному компьютеру, выполняет команду и возвращает вывод. В данном случае команда hostname
вернула имя хоста компьютера – CONTOSODC1.
Если команда не является cmd
или другой консольной командой, PsExec быстро завершит удаленную сессию и вернет код завершения, возвращенный удаленным процессом.
Примечание: Ошибка или код завершения, возвращаемый psexec, не происходит от самого PsExec. Он происходит от команды, которую psexec выполняет на удаленном компьютере.

Как работает PsExec на удаленных компьютерах
PsExec выполняет несколько шагов для запуска программ на удаленных компьютерах.
- Создание файла PSEXESVC.exe в папке C:\Windows.
- Создание и запуск службы Windows на удаленном компьютере с именем PsExec.
- Выполнение программы в родительском процессе psexesvc.exe.
- После завершения служба PsExec в Windows будет остановлена и удалена.
Если процесс не работает на 100% правильно, возможно, вам придется вручную удалить службу с помощью команды sc.
Выполнение простой локальной команды
Несмотря на то, что PsExec наиболее известен своей способностью выполнять команды на удаленных компьютерах, вы также можете выполнять команды локально.
Вы можете выполнять команды локально, просто не указывая имя компьютера, как показано ниже.
Зачем это делается? Одна из причин – выполнение команд от имени локальной учетной записи SYSTEM. Вы можете использовать параметр -s
, чтобы выполнять любую команду от имени SYSTEM локально или удаленно, о чем вы узнаете позже.
Посмотрите короткое видео ниже. Обратите внимание, что вам просто нужно указать параметр -s
вместе с исполняемым файлом интерпретатора команд для запуска новой командной сессии в качестве NT AUTHORITY\SYSTEM.

Команды PsExec (получение более продвинутых возможностей)
После освоения основ вы можете начать изучать более продвинутые техники работы с psexec. PsExec может делать гораздо больше, чем просто выполнять одну команду на одном компьютере.
Выполнение команд на нескольких компьютерах
PsExec не ограничивается только выполнением команд на одном удаленном компьютере за раз. Этот инструмент также поддерживает копирование программ и выполнение команд на нескольких компьютерах одновременно.
Вы можете запустить PsExec на нескольких компьютерах несколькими способами.
Имена компьютеров, разделенные запятыми
Обычно при выполнении команды на одном удаленном компьютере вы указываете одно имя компьютера, например, \\REMOTECOMPUTER
. Вы также можете указать несколько компьютеров, разделяя их запятыми, как показано ниже.
Все компьютеры в домене Active Directory
Если вы запускаете PsExec на компьютере, присоединенном к домену Active Directory, и хотите выполнить команду на всех компьютерах в этом домене, используйте подстановочный символ.
PsExec будет искать во всем домене Active Directory и пытаться выполнить команду на каждом компьютере. Ниже приведен пример синтаксиса, как PsExec будет пытаться подключиться ко всем компьютерам в домене, к которому принадлежит выполняющий компьютер, и выполнить команду hostname
.
Обратите внимание, что если вы используете звездочку для поиска всех компьютеров в домене, когда локальный компьютер является частью рабочей группы, вы получите ошибку
A system error has occurred: 6118
.
Использование подстановочного символа заставляет PsExec фактически выполнять команду net view /all
для первоначального поиска всех компьютеров в домене. Это устаревший способ получения информации о компьютере из-за его зависимости от NetBIOS.
Чтение из файла
Еще один способ выполнения команд на нескольких компьютерах одновременно – использовать текстовый файл. Используя синтаксис @<filename.txt>
, PsExec будет читать каждую строку в текстовом файле, как если бы это было имя компьютера. Затем он обработает каждый компьютер отдельно.
Ниже приведен пример использования PowerShell для создания текстового файла с именами компьютеров, разделенными строками, и использования его в качестве входных данных для psexec.
Копирование локальных программ на удаленный компьютер
С помощью параметра -c
psexec скопирует любую локальную программу на удаленный компьютер перед выполнением.
Возможно, у вас есть файл EXE на локальном компьютере в папке C:\Tools и вы бы хотели запустить его на удаленном компьютере. Вы можете сделать это, используя следующий синтаксис:
Если вы используете параметр -c
и не указываете исполняемый файл, PsExec все равно скопирует файл, но вы получите ошибку, указывающую, что системе не удается найти указанный файл. Это происходит потому, что PsExec всегда пытается запустить скопированный файл.
Если вам нужно скопировать файлы на удаленные компьютеры перед использованием PsExec, используйте вместо этого командлет PowerShell Copy-Item
.
Запуск удаленных процессов от имени альтернативных учетных данных
Еще один популярный случай использования PsExec – выполнение команд от имени альтернативных учетных записей. По умолчанию PsExec попытается подключиться к удаленному компьютеру под вашей текущей учетной записью. Более точно, он имитирует вашу учетную запись на удаленном компьютере.
Использование параметра -u
и необязательного параметра -p
позволяет вам подключиться к удаленному компьютеру с помощью альтернативной учетной записи пользователя. Затем PsExec зашифрует и отправит имя пользователя и пароль на удаленный компьютер для аутентификации.
Например, если вы находитесь в рабочей группе, вам всегда нужно указывать имя пользователя для аутентификации на удаленном компьютере.
Если оба компьютера являются членами Active Directory, обязательно предварительно указывайте доменное имя перед учетной записью пользователя.
Обратите внимание, что если вы не используете переключатель -u
, psexec будет выдавать вашу учетную запись на удаленном компьютере. У него не будет доступа к сетевым ресурсам.
Запуск процессов от имени учетной записи LOCAL SYSTEM
Одной из самых полезных функций выполнения PsExec от имени альтернативной учетной записи является использование переключателя -s
. Этот переключатель позволяет PsExec (и запускаемому вами приложению) работать от имени учетной записи LOCAL SYSTEM на удаленном (или локальном) компьютере.
Обратите внимание, что в примере ниже я не указал имя удаленного компьютера. PsExec также с радостью будет выполняться на локальном компьютере. В этом случае я использую параметр -s
, чтобы указать PsExec запустить командную строку как учетную запись LOCAL SYSTEM.

Чтобы выполнить командную строку от имени LOCAL SYSTEM на удаленном компьютере, добавьте имя компьютера к ссылке, как показано ниже:
Удаленный запуск графических приложений
Еще один полезный переключатель PsExec – -i
. По умолчанию PsExec не позволяет удаленно выполняемой команде открывать окна на удаленном компьютере. Это удобно, потому что если вы выполняете команды удаленно, вы все равно не увидите экрана.
Но, возможно, вам нужно открыть программы для ваших пользователей. Вы лично не будете использовать приложение, но пользователь-конечный потребитель будет. В этом случае используйте переключатель -i
.
Возможно, вам нужно открыть окно блокнота на удаленном компьютере. Нет проблем. Запустите notepad.exe с переключателем -i
, и PsExec откроет блокнот.

Не забудьте также использовать переключатель -d
для отключения при открытии интерактивного окна. По умолчанию PsExec будет ожидать завершения выполнения запущенного процесса. Если удаленный процесс (в данном случае Notepad) продолжает работать, PsExec никогда не вернет управление.
Использование переключателя -d
с -i
позволит PsExec не ждать завершения удаленного процесса. Вместо этого он отключится и вернет управление вам сразу после выполнения удаленного процесса.
Перенаправление вывода
Psexec будет пересылать любой вывод, отправленный из удаленного процесса, в вашу локальную сессию. Обычно этот вывод будет напрямую направлен на вашу локальную консоль. Но если вы хотите перенаправить его, вы можете сделать это с помощью типичных операторов перенаправления.
Например, если вы хотите выполнить команду и заглушить весь вывод, вы можете перенаправить вывод и ошибки в null с помощью ^> nul ^2^&1
.
Обратите внимание, что специальные символы экранируются с помощью символа “пометочка” (
^
).
Варианты использования PsExec
Как только вы изучите, как использовать psexec, вы непременно столкнетесь с различными конкретными вариантами использования. В этом разделе вы узнаете некоторые реальные варианты использования и примеры использования psexec.
Запуск удаленного командного интерпретатора (psexec cmd
)
Один из самых распространенных случаев использования – запуск PsExec в качестве интерактивной командной строки. PsExec не просто выполняет команды удаленно. Он также может отправлять вывод команд обратно в вашу консоль. Из-за этого он может быть отличной заменой telnet (если кто-то все еще использует его) или, возможно, PowerShell Enter-PSSession
.
Для запуска удаленной команды укажите имя удаленного компьютера и запустите приложение cmd. Cmd – это командный интерпретатор Windows. Поскольку PsExec поддерживает интерактивное использование, он с радостью вернет мигающий курсор и приглашение.

На данном этапе мир у вас под ногами. Вы можете выполнять команды на локальном компьютере через эту “вложенную” командную строку, и они будут выполняться на удаленном компьютере.
Чтобы выйти из командной строки, введите exit
. PsExec остановит процесс cmd
на удаленном компьютере и вернет фокус на локальный компьютер.
НИКОГДА не используйте Ctrl-C для закрытия интерактивной сессии cmd. Всегда используйте
exit
. Если вы используете Ctrl-C, сеанс psexec останется работать на удаленном компьютере.
Установка программного обеспечения удаленно
Вы можете использовать PsExec в качестве инструмента для установки программного обеспечения для бедных. Возможно, у вас есть установщик MSI, который вам нужно запустить на одном или нескольких удаленных компьютерах с именем setup.msi. Этот установщик должен быть скопирован на удаленные компьютеры, а затем выполнен с помощью утилиты msiexec.exe со всеми необходимыми параметрами.
Ниже приведен пример того, как можно использовать PsExec для удаленной установки программного обеспечения. В этом примере копируется setup.msi на удаленный компьютер, а затем запускается интерактивный установщик MSI от имени учетной записи SYSTEM.
Если необходимо принять условия лицензионного соглашения без использования ключа /accepteula
,
Как уже упоминалось ранее, при первом запуске PsExec вам придется принять лицензионное соглашение. Вы можете использовать ключ /accepteula
, но также можете “подготовить” его в реестре.
При первом запуске PsExec создает ключ реестра в HKCU\Software\Sysinternals\PsExec. Вместо этого ключа реестра он создает значение реестра с именем EulaAccepted и значением DWORD 1.
Используя свой любимый способ изменения реестра на удаленных компьютерах, вам просто нужно создать этот ключ/значение на компьютерах, на которых вы хотите запустить PsExec. После создания нет необходимости запускать /accepteula
!
Совмещение PowerShell и PsExec
До появления PowerShell у нас был только PsExec. Теперь у нас есть варианты. PowerShell может заменить PsExec во многих ситуациях, но также дополнять его в других.
Создание имен компьютеров с помощью PowerShell
Вместо использования \\*
для поиска всех компьютеров в домене вы можете использовать PowerShell. Используя PowerShell, вы можете не только выбирать определенные компьютеры, но и не прибегать к использованию подверженного атакам через брандмауэр net view /all
.
Вы можете использовать PowerShell для создания строки, содержащей все имена компьютеров, разделенные запятой. Затем вы можете передать эту строку в PsExec, который с радостью обработает каждый компьютер, как если бы вы вводили его вручную.
Вы можете увидеть ниже пример использования командлета Get-AdComputer
, который является частью модуля ActiveDirectory для PowerShell.
Включение удаленного управления PowerShell
Если у вас есть удаленные компьютеры, с которыми вы предпочли бы использовать удаленное управление PowerShell вместо PsExec, вы можете использовать PsExec для их включения.
Запустив команду Enable-PSRemoting
или пакетный файл winrm.cmd на удаленных компьютерах, вы можете быстро включить удаленное управление PowerShell на нескольких компьютерах одновременно.
Ниже вы можете увидеть пример вызова пакетного файла winrm.cmd на удаленном компьютере, работающем от имени учетной записи SYSTEM. Поскольку вывод из этой команды не требуется, он подавляется с помощью 2>&1> $null
.
Сообщения об ошибках PsExec
Стоит отметить заранее, что большинство кодов ошибок, которые вы видите при возврате из PsExec, происходят от удаленного процесса, а не от PsExec. Но полезно понимать эти коды ошибок и их возможное значение.
Если вам нужно справочное руководство по всем кодам ошибок Windows, я рекомендую ознакомиться с этим исчерпывающим списком кодов ошибок Windows.
Ниже приведен список распространенных кодов ошибок, которые могут быть возвращены PsExec.
Error Code | Explanation |
---|---|
-2146232576 | Typically returned by Windows Update when an error occurs. |
0 | Command executed successfully |
1 | Incorrect function. A problem happened. That’s about it. |
1603 | Fatal error during installation. This typically is returned by msiexec. |
2 | The system cannot find the file specified |
4 | The system cannot open the file. |
5 | Access is denied. |
6 | The handle is invalid. |
6118 | The list of servers for this workgroup is not currently available |
Ваш отзыв
ATA Ultimate Guides – это обширные руководства. В них содержится множество информации, и я могу пропустить что-то или сделать ошибку. Если вы заметите что-то неправильное или считаете, что этому руководству нужно добавить что-то, пожалуйста, дайте мне знать в комментариях. Я буду рад указать вас в посте.
Заслуги
- Благодарю Матиаса (в комментариях) за многочисленные отзывы.