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

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

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

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

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

C:\PSExec.exe \\$hostname /accepteula -u user -p pass -d cmd /C "type $file" 2> $null

2 ответа

Решение

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

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

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

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

О неинтерактивном -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
Другие вопросы по тегам