O que o psexec -d faz?

4

SS64 diz que significa

Don’t wait for the application to terminate. Only use for non-interactive applications.

Mas eu não entendo isso. Estou tentando executar algumas chamadas não interativas do sistema, mas, se eu não passar -d , meu trabalho do powershell nunca retornará e, se eu passar, -d , não receberei nada quando isso acontecer Retorna. Alguém pode me dizer o que exatamente -d faz?

Ou para pontos de bônus, você poderia me dizer como tornar esse retorno algo útil:

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

2 respostas

3

A opção -d , conforme mencionada na descrição citada na sua pergunta, faz com que o PsExec não espere a saída do novo processo. Você não pode obter nenhum código de saída ou saída porque o serviço PsExec remoto apenas inicia o processo, informa o novo ID do processo para o programa PsExec original e para de se preocupar com o que o novo processo faz. Sem -d , toda a saída do processo será enviada de volta ao programa PsExec que iniciou tudo, e o PsExec terá que esperar que o novo processo seja encerrado para que ele possa saber quando sair sozinho.

O PsExec não jogar bem com redirecionamento ou PowerShell . Consegui obter saída parcial lançando a instância inicial do PowerShell com o parâmetro -inputformat none , mas o PsExec cortou estranhamente parte da saída do comando e não consegui contorná-la.

Você pode tentar remoting do PowerShell em vez disso:

Invoke-Command {type $file} -ComputerName $hostname -Credential (New-Object PSCredential -ArgumentList 'username', (ConvertTo-SecureString 'password' -AsPlainText -Force))
    
por 23.07.2016 / 00:34
2

Sobre não-interativo -d , ele apenas executa o comando, sem retornar a saída e, em seguida, finaliza o prompt remoto. Na verdade, apenas retornando o código de erro do processo remoto. No seu caso, ele mostra a saída de $file em uma janela cmd oculta e inexistente na máquina remota e termina. É por isso que você não vê nada. Tente criar um arquivo na máquina remota usando -d e, em seguida, você verá que funciona.

Atualização:

Se $file for uma variável na máquina remota, o problema é que você está usando uma variável que se expande em seu ambiente local powershell (como você mencionou), então use uma variável cmd (considerando que você está enviando a variável comando para cmd ) que não se expande no powershell. PSExec.exe \$hostname -u user -p pass -d cmd /c "type %file%" 2> $null

No entanto, essa não é a solução REAL! porque e se você quiser enviar um comando para o powershell remotamente? Você precisa de algo impedindo a expansão, como %%varibale%% in cmd . Eu encontrei usando "irá expandir, mas" impede a expansão no powershell:

PS> "This is $file" em relação a PS> 'This is $file'

Mas isso não ajuda no seu caso, de outra forma, é criar um script na máquina local e enviar para o destino com o PSEXEC:

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

Ou ... use Invoke-Command conforme mencionado aqui :

PS C:\> invoke-command -filepath c:\scripts\test.ps1 -computerName $hostname
    
por 22.07.2016 / 21:43