Перейти к содержимому

Что делает psexec -d?

4

SS64 говорит, что значит

Не ждите завершения приложения. Используйте только для неинтерактивных приложений.

Но я этого не понимаю. Я пытаюсь выполнить некоторые неинтерактивные системные вызовы, но, если я не пройду -d, моя работа в PowerShell никогда не вернется, и, если я это сделаю, передам -d, я ничего не получу обратно, когда она вернется. Может кто-нибудь сказать мне, что именно -d делает?

Или для бонусных баллов, вы можете сказать мне, как сделать это возвращение чем-то полезным:

C:\PSExec.exe \\$hostname /accepteula -u user -p pass -d cmd /C "type $file" 2> $null 
2 330 просмотров
sirdank спросил 10 лет назад
S 158

2 ответа

3
Принятый ответ

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

PsExec не играть хорошо с перенаправлением или PowerShell . Мне удалось получить частичный вывод, запустив начальный экземпляр PowerShell с -inputformat noneпараметром, но PsExec странным образом отсекает некоторые выходные данные команды, и я не мог обойти это.

Вы можете попробовать PowerShell Remoting вместо:

Invoke-Command -ComputerName $hostname -Credential (New-Object PSCredential -ArgumentList 'username', (ConvertTo-SecureString 'password' -AsPlainText -Force)) 

Вот чего я боялся. Я также могу получить три строки вывода в зависимости от используемых параметров, но это не очень помогает. Я пытался избежать удаленного взаимодействия с PowerShell, поскольку для его работы требуется специальная настройка, но в будущем мне, возможно, придется прибегнуть к нему. Я думаю, сейчас я попробую сопоставить удаленные диски и загрузить файл из файловой системы. Спасибо!

sirdank · 10 лет назад · 0
Ben N ответил 10 лет назад
B 28 901
2

Что касается неинтерактивного -d, он просто запускает команду, не возвращая вывод, а затем завершает удаленный запрос. На самом деле это происходит, только возвращая код ошибки удаленного процесса. В вашем случае он показывает вывод $fileнесуществующего скрытого cmdокна на удаленной машине и завершается. Вот почему вы ничего не видите. Попробуйте создать файл на удаленной машине, используя -dпереключатель, и тогда вы увидите, что он работает.

Обновить:

Если $fileэто переменная на удаленном компьютере, проблема в том, что вы используете переменную, которая раскрывается в вашей локальной среде PowerShell (как вы уже упоминали), поэтому используйте cmdвместо cmdнее переменную (учитывая, что вы отправляете команду ), которая не раскрывается в Powershell.PSExec.exe \\$hostname -u user -p pass -d cmd /c "type %file%" 2> $null

Тем не менее, это не РЕАЛЬНОЕ решение! потому что, если вы хотите отправить команду на powershell удаленно? Вам нужно что-то, препятствующее расширению, как %%varibale%%в cmd. Я обнаружил, что использование «будет расширять, но» предотвращает расширение в powershell:

PS> "This is $file" против PS> 'This is $file'

Но это не помогает в вашем случае, но есть и другой способ - создать скрипт на локальном компьютере и отправить его по назначению с помощью PSEXEC:

PSExec.exe \\$hostname -u user -p pass -c powershell script.ps1 2> $null 

Или ... используйте Invoke-Command, как указано здесь :

PS C:\> invoke-command -filepath c:\scripts\test.ps1 -computerName $hostname 

Привет, Амир, я думаю, ты немного запутался. Эта команда прекрасно работает в файле сценария, запускаемом синхронно и в окне консоли, но прерывается, только когда я пытаюсь запустить ее как фоновое задание powershell. Я попытался / K, и это не помогло мне.

sirdank · 10 лет назад · 0

Обновил мой ответ, если я все еще не понимаю, пожалуйста, скажите мне :)

NetwOrchestration · 10 лет назад · 0

Амир, спасибо за то, что ты так терпелив со своей глупой проблемой. $ file - это не удаленная переменная, а локальная, которую я хочу расширить. Все, что я хочу запустить на целевой машине, это type C: \ Shared \ file.config, но это не работает. К сожалению, я думаю, что мне придется принять ответ Бена, потому что он говорит, что «PsExec не играет хорошо», что теперь и мой опыт. Еще раз спасибо!

sirdank · 10 лет назад · 0

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

NetwOrchestration · 10 лет назад · 1
NetwOrchestration ответил 10 лет назад
N 1 842