Вопрос или проблема
За последние пару недель я исследовал интернет, чтобы разобраться с проблемой, которую я испытывал, а именно, как просто открыть “калькулятор” на удаленном компьютере с помощью psExec. В конечном счете, я также задал вопрос здесь. У меня все еще нет ответа на тот вопрос, но помощь с ним превратилась в множество ответов и комментариев о различных способах устранения неполадок psExec. Я благодарен за полученную помощь, поэтому, глядя на список идей по устранению неполадок, я подумал – не было бы здорово, если бы я мог просто ввести “устранение неполадок psExec” и получить этот список в одном месте, а не рыться в кучу полезных кусочков на множестве различных сайтов?
Исходя из этого, и в духе поста Ответы на ваши собственные вопросы, я собираюсь перечислить все методы устранения неполадок, о которых я узнал, а затем задам свой вопрос. Я не могу добавить много ссылок, так как я нов на этом сайте, поэтому прошу прощения за минимальное количество кредитов и ссылок на источники.
- В части команды
\\targetmachine
попробуйте использовать либо имя компьютера, либо IP-адрес. Иногда один вариант не работает, когда другой срабатывает. - Используйте переключатель
-i
, чтобы сделать программу интерактивной на удаленной машине. - Используйте переключатель
-d
, чтобыcmd
не зависал, пока выполняется программа. - Попробуйте запустить простые программы, кроме той, которую вы пытаетесь запустить (например,
calc
,cmd
, или создайте простой.bat
файл для тестирования), чтобы проверить, правильна ли ваша синтаксис. - Направьте команду на другой компьютер с аналогичной командой, чтобы увидеть, работает ли команда.
- Если вы уже пробовали переключатель
-d
, запустите вашу программу и дайте ей повисеть некоторое время, чтобы проверить, работает ли система медленно. Иногда некоторые программы могут занять некоторое время. - Запустите другие утилиты psTools, такие как
psList
илиpsService
, чтобы проверить, есть ли у вас доступ к удаленной машине. - Другой способ проверить, доступен ли целевой компьютер для локальной машины, – открыть окно проводника Windows и ввести в адресной строке:
\\имя_целевого_компьютера\c$
. Это должно дать вам доступ к папкам на диске C целевого компьютера. - Запустите
cmd
от имени администратора. - Используйте переключатели имени пользователя и пароля (
-u
и-p
). Попробуйте с вашей обычной учетной записью, а затем с учетной записью администратора (если она у вас есть). - accepteula можно писать как
-accepteula
, так и/accepteula
– видимо, один способ работает с некоторыми системами, а другой – с другими. - Вставьте
-accepteula
дважды в вашу команду, потому что первый раз она иногда просто ‘глотается’ и не выполняется (из этого поста). - Перейдите на целевую машину через удаленное подключение или работая на ней физически, и запустите
psExec
в командной строке, чтобы вручную принять Лицензионное Соглашение, которое появляется. (accepteula
должен это делать, но, видимо, иногда не работает) - Вручную запустите psExec на целевом компьютере, чтобы проверить, не в вашей ли машине проблема.
- Убедитесь, что шарение
admin$
включено на целевом компьютере. - Следуйте любым указаниям, соответствующим вашей версии Windows из поста karlchen в форумах Sysinternals здесь, а затем выполните предложенные 3 строки кода.
- Проверьте, разрешает ли брандмауэр или антивирус целевой машины psExec.
- Если это возможно, отключите брандмауэр и попробуйте команду снова.
- Попробуйте выполнить команду с другим целевым компьютером, который имеет ту же настройку антивируса и брандмауэра, чтобы проверить, являются ли брандмауэр/антивирус проблемой.
- Попробуйте установить UAC (Управление Учетными Записями Пользователей) на “никогда не уведомлять”/выключить на целевом компьютере.
- Попробуйте кэшировать ваши учетные данные, если вам нужны другие учетные данные, отличные от ваших собственных (из этого поста).
Страница загрузки psExec и справка по psExec от Sysinternals и форумы – отличные ресурсы.
Ни одна из этих идей по устранению неполадок, которые я написал здесь, не решила мою проблему, так что это значит, что есть еще идеи. Каким еще образом можно устранить неполадки psExec при простых проблемах, таких как моя (просто открытие простой программы, такой как калькулятор)?
A) \{targetmachine}. В 2015 году мы изменили все наши файлы пакетной обработки *.bat, чтобы использовать IPAddress для {targetmachine} вместо использования ComputerName, и это устранило “зависание” при вызове PsExec. В 2018 году, с учетом всех новых вирусных мер безопасности, мы поняли, что использование IPAddress теперь вызывает зависание PsExec на целых 3 минуты. Так что мы вернули файлы пакетной обработки обратно к использованию ComputerName.
B) -p {password}. Нас шесть человек, которые регулярно используют файлы пакетной обработки с PsExec, и наши файлы пакетной обработки настроены на использование нашего имени пользователя и пароля. После нашего последнего обязательного обновления пароля каждые 3 месяца мы поняли, что пользователи без специальных символов в пароле (например, @ ! ^ $) больше не испытывают никаких задержек, тогда как те, у кого есть специальные символы, регулярно сталкиваются с задержкой в 20 секунд. (Это трудно устранить, потому что пользователи с особыми символами испытывают 20-секундные задержки только если файлы пакетной обработки не были вызваны в последние 3 минуты. Если они были запущены недавно, задержка исчезает.)
C) Использование @ в любом файле пакетной обработки *.bat. Аналогично, мы установили, что задержка исчезает (независимо от того, сколько времени прошло с момента запуска файлов пакетной обработки), если мы удаляем символ “@” из любого файла пакетной обработки, который вызывает или вызывается PsExec. Для тех, кто не знаком с программированием файлов *.bat, символ @ подавляет “вывод” на экран, даже если echo установлен на “включено” внутри файла пакетной обработки.
D) В Резюме: 2015 КОД
@echo off
@psexec \\199.245.27.107 -u DomainName\UserName -p MyP@$$W*rd cmd.exe /k c:\local_PsExec_commands.bat "%cd%" %1 %2
2018 КОД
echo off
psexec \\TargetComputer -u DomainName\UserName -p MyPassWord cmd.exe /k c:\local_PsExec_commands.bat "%cd%" %1 %2
Мы также удалили символ “@” из всех файлов “local_PsExec_commands.bat” на целевых компьютерах.
TL;DR : полное решение с минимальными недостатками, следуйте шагам 1 и 2, готово. Проверено на локальном Win11 22H2 и целевом WinSer22 21H2.
Примечание : Это решение предполагает, что вы используете последние версии Windows, последнюю PSExec и известные учетные записи администратора с паролями на локальных и целевых ПК. Вы можете указать другую учетную запись для использования на целевом ПК, чем на вашем локальном ПК. Также игнорируйте любые странные ошибки от PSExec, он не работает хорошо с многими другими консольными приложениями, особенно при захвате его вывода… да, калькулятор работает нормально и ждет вас, он не закрывался после открытия, глупый PSExec.
- Предварительная настройка – Вот все, что вам нужно, чтобы разрешить PSExec подключаться удаленно. Выполните это на целевом ПК в следующем порядке:
PowerShell – Администратор:
Get-NetConnectionProfile | Set-NetConnectionProfile -NetworkCategory Private
CMD – Администратор:
winrm qc -force
netsh AdvFirewall firewall add rule name=PSExec dir=In action=allow protocol=TCP localport=RPC profile=domain,private program=""%WinDir%\system32\services.exe"" service=any
netsh AdvFirewall firewall set rule group="Remote Service Management" new enable=yes
Возможно, вам придется перезагрузиться, чтобы все изменения вступили в силу.
- Работа – Выполните это на локальном ПК в следующем порядке:
CMD – Администратор:
start /wait "pse" cmd /c "C:\PSTools\psexec64 -accepteula -i -h \\win-4j1l0slsnda -u WIN-4J1L0SLSNDA\administrator -p @dm1N -c -f quser > act_cons.tmp"
type act_cons.tmp | findstr console > qu.tmp
PowerShell – Администратор:
$quid = gc qu.tmp | % {$_.substring(1)} | % {$_ -Split " "} | Out-String -Stream | ? {$_.Trim().Length -gt 0}
$quidn = $quid[2]
(-join (echo "C:\PSTools\psexec64 -accepteula -i " $quidn " \\win-4j1l0slsnda -u WIN-4J1L0SLSNDA\administrator -p @dm1N -c -f calc")) | sc -Force pse.tmp
gc pse.tmp | cmd
Заметки для Шага 1 : частная сеть важна, поскольку мы изменяем правила брандмауэра, и серверу необходимо разрешить это; я предполагаю. Не все CMD могут быть необходимы, но вы можете попробовать выполнить только третий или два из них; у меня не было времени проверить все случаи.
Заметки для Шага 2 : PowerShell имеет проблемы с некоторыми консольными приложениями и захватом вывода, и, к сожалению, psexec является одним из них, поэтому нам нужно использовать start.com в командной строке (со своими проблемами), чтобы это уладить. Вторую команду можно выполнить в PowerShell, но мне нравится findstr за его простоту. Нам нужно использовать quser, чтобы узнать идентификатор сеанса консоли, никогда не предполагайте, что он равен 1… мы также можем использовать pstools, чтобы его найти, но мы хотим избежать проблемы исчезающего/двойного accepteula. Как только у нас будет идентификатор, давайте добавим значение переменной к нашей командной строке psexec, а затем передадим это cmd для выполнения, поскольку psexec может испытывать проблемы с экранированием переменных PowerShell внутри своих аргументов командной строки.
Примечание для PSExec порядок аргументов : место и порядок каждого аргумента имеют значение, иначе PSExec обычно выдает ошибку без полезной информации. Если вам нужно добавить другие аргументы, экспериментируйте с их порядком, так как вы не можете полагаться на порядок в встроенной справке.
Дополнительная информация о первых причудах командной строки psexec :
- accepteula всегда первым в очереди
- -i -h идет после этого и перед именем сервера, чтобы мы могли использовать все наши интерактивные права входа и права администратора с -i и -h, иначе мы получим ошибку psexec:
Ошибка входа: пользователю не предоставлен запрашиваемый тип входа на этом компьютере.
- -u : всегда после имени сервера, и мы пишем домен большими буквами и учетную запись/имя пользователя с заглавной буквы
- -p : если ваш пароль содержит пробел, измените его и удалите пробел… PSExec может не работать с одинарными или двойными кавычками, когда ожидает только пароль
- -c -f всегда в конце перед нашей командой, чтобы мы принудительно копировали последнюю версию PSExec на целевой ПК, независимо от того, есть ли она там, является ли она более старой версией или впервые скопированной и запущенной
Дополнительная информация о второй командной строке psexec, кроме вышеуказанного :
- -i SessionID : Встроенная справка PSExec обманывает, она не автоматически по умолчанию устанавливает сеанс консоли для интерактивного отображения приложений… она только запускает приложение в скрытом режиме в сеансе консоли, поэтому мы должны передать идентификатор сеанса консоли, как найденный с помощью quser, чтобы заставить наши приложения появляться на рабочем столе консоли
- также – мы не используем -h здесь, так как калькулятор не запрашивает администраторских прав в любой момент во время его запуска или использования, но если ваше приложение это делает, то также передайте -h… однако это может не показать приложения, запрашивающие администраторские права на рабочем столе, я это не тестировал, так как калькулятор в этом не нуждается
Ответ или решение
Чтобы успешно устранить проблемы, связанные с использованием PsExec, необходимо учесть множество факторов, которые могут влиять на его работу. Ниже приведены ключевые шаги и рекомендации, которые помогут вам эффективно диагностировать и решить распространённые проблемы.
Основные шаги по устранению неполадок PsExec
-
Проверка имени компьютера и адреса:
- Убедитесь, что используете правильное имя компьютера или IP-адрес. Иногда одно может работать, а другое — нет. Попробуйте оба варианта. Например, введя
\\имя_компьютера
или\\IP_адрес
.
- Убедитесь, что используете правильное имя компьютера или IP-адрес. Иногда одно может работать, а другое — нет. Попробуйте оба варианта. Например, введя
-
Выбор интерактивного сеанса:
- Добавьте переключатель
-i
для запуска программы в интерактивном режиме, чтобы обеспечить ее отображение на рабочем столе удалённого компьютера.
- Добавьте переключатель
-
Избегание зависания:
- Используйте переключатель
-d
, чтобы предотвратить зависание консоли на локальной машине при запуске программы на удалённой.
- Используйте переключатель
-
Тестирование с простыми программами:
- Попробуйте запустить другие простые программы (например,
cmd
илиnotepad
) для проверки правильности синтаксиса.
- Попробуйте запустить другие простые программы (например,
-
Проверка доступа к удалённым компьютерам:
- Убедитесь, что у вас есть доступ к удалённым машинам, запустив такие утилиты, как
psList
илиpsService
.
- Убедитесь, что у вас есть доступ к удалённым машинам, запустив такие утилиты, как
-
Удалённое подключение:
- Проверьте доступ к административной папке
admin$
на целевой машине, вводя в адресной строке проводника\\имя_компьютера\admin$
.
- Проверьте доступ к административной папке
-
Полномочия и учетные данные:
- Запускайте командную строку от имени администратора и используйте переключатели
-u
и-p
для ввода имени пользователя и пароля. Проверьте, работают ли ваши учетные данные.
- Запускайте командную строку от имени администратора и используйте переключатели
-
Лицензионное соглашение:
- Иногда требуется вручную принять лицензионное соглашение, запустив PsExec на целевом компьютере.
-
Проверка брандмауэра и антивируса:
- Убедитесь, что брандмауэр и антивирус на целевой машине не блокируют соединения PsExec. Можно временно отключить брандмауэр для тестирования.
-
Управление UAC:
- Попытайтесь отключить UAC (Контроль учетных записей) на целевом компьютере, если это возможно.
-
Ошибки в паролях:
- Убедитесь, что пароли, используемые в скриптах, не содержат специальный символов, которые могут вызывать задержки.
-
Проблемы с символами:
- Удаляйте символ
@
из ваших.bat
файлов, так как он может вызвать неожиданные задержки.
- Удаляйте символ
Заключение
Используя данные рекомендации, вы сможете значительно упростить процесс устранения неполадок с PsExec. Убедитесь, что вы следуете каждому шагу и экспериментируете с различными настройками и командами. Если ни один из методов не помог, рассмотрите возможность обращения к сообществу для получения дальнейшей помощи или проверки обновлений и документации PsExec. Использование системных утилит, таких как PowerShell, и выполнение команд с правами администратора могут значительно ускорить процесс устранения неисправностей.