Como o servidor está executando o 2k8, suspeito que o UAC esteja causando problemas. Eu também sugiro usar winrm em vez de psexec. Remoting Powershell foi um dos melhores novos recursos do PowerShell 2.0
Estou tentando executar remotamente um script do PowerShell usando PSEXEC
. O script do PowerShell é chamado por meio de um arquivo em lote .cmd
. A razão pela qual fazemos isso é alterar a política de execução, executar o script powershell e redefinir a política de execução novamente:
No servidor remoto do-tasks.cmd
se parece com:
powershell -command "&{ set-executionpolicy unrestricted}"
powershell DoTasks.ps1
powershell -command "&{ set-executionpolicy restricted}"
O script do PowerShell DoTasks.ps1
só faz isso por enquanto:
Write-Output "Hello World!"
Ambos os scripts vivem em c:\windows\system32
(por enquanto) apenas para estarem no PATH.
No servidor de origem, faço isso:
psexec \web1928 -u administrator -p "adminpassword" do-tasks.cmd
Quando isso é executado, recebo a seguinte resposta na linha de comando:
c:\Windows\system32>powershell -command "&{ set-executionpolicy unrestricted}"
e o script não é mais executado.
Não consigo ctrl-c para quebrar o script e vejo apenas caracteres ^ C, posso digitar a entrada do teclado e os caracteres são ecoados para o console.
No servidor remoto, vejo que o PowerShell.exe e o CMD.exe estão sendo executados na guia Processo do Gerenciador de Tarefas. Se eu terminar esses processos, o controle retornará à linha de comando no servidor de origem.
Eu tentei isso com apenas um simples arquivo em lote .cmd
com @echo hello world
e funciona muito bem.
A execução de do-tasks.cmd
no servidor remoto por meio de uma sessão RDP também funciona bem.
O servidor de origem está executando o Windows 2003 SP2, o servidor remoto está executando o Windows 2008 SP2.
Por que meu arquivo de lote remoto fica preso ao executar por meio de PSEXEC
?
Este é um problema comum com o POSH. O problema é stdin
trava. Tente isto:
c:\Windows\system32>powershell -command "&{ set-executionpolicy unrestricted}" < NUL
A maioria das respostas nos fóruns resolve isso com uma solução alternativa como ecoar e canalizar para que o powershell receba alguma entrada do STDIN.
Mas existe uma solução dentro do powershell. Basta iniciar o powershell com a opção -inputformat nenhum como:
powershell -inputformat none -command ...
Isso resolve o problema pendente via psexec para Win2003 e Win2008.