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

2194
sirdank

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

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

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

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

C:\PSExec.exe \\$hostname /accepteula -u user -p pass -d cmd /C "type $file" 2> $null 
4
cmd / C "type $ file" 2> $ null Это ничего не делает, удалите часть cmd и введите ее в командной строке, это не настоящая команда. Вот почему он ничего не возвращает. Cole 8 лет назад 0
@ Коле Извините, я не уверен, какая его часть недействительна. Он отлично работает для меня, если я наберу его в моем окне PowerShell (не используя -d). Однако, когда я не использую -d и не нажимаю на «Start-Job», моя запущенная работа никогда не возвращается. sirdank 8 лет назад 0
`C: \ PSExec.exe \\ $ hostname / accepteula -u user -p pass -d cmd` означает, что вы запускаете` cmd` в удаленной системе. попробуйте `C: \ PSExec.exe \\ $ hostname -u пользователь -p pass powershell` NetwOrchestration 8 лет назад 0
@AmirHossein Спасибо за предложение, и вы правы. `type C: \ Shared \ file.txt` работает через командную строку. Powershell разрешает `$ file` перед отправкой команды в PSExec. Эта строка прекрасно работает, пока я делаю это без `-d`, а не внутри задачи` Start-Job`. sirdank 8 лет назад 0

2 ответа на вопрос

3
Ben N

-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 8 лет назад 0
2
NetwOrchestration

Что касается неинтерактивного -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 8 лет назад 0
Обновил мой ответ, если я все еще не понимаю, пожалуйста, скажите мне :) NetwOrchestration 8 лет назад 0
Амир, спасибо за то, что ты так терпелив со своей глупой проблемой. `$ file` - это не удаленная переменная, а локальная, которую я хочу расширить. Все, что я хочу запустить на целевой машине, это `type C: \ Shared \ file.config`, но это не работает. К сожалению, я думаю, что мне придется принять ответ Бена, потому что он говорит, что «PsExec не играет хорошо», что теперь и мой опыт. Еще раз спасибо! sirdank 8 лет назад 0
Пожалуйста! Я сказал, что я еще не эксперт в Powershell. Я одобрил его ответ, прежде чем ты тоже его одобришь. Удачи! NetwOrchestration 8 лет назад 1