Powershell: Execute exe no servidor remoto e capture a saída

5

Estou tentando fazer o script da execução de um instalador em servidores da web remotos. O instalador em questão também é um serviço do Windows que hospeda o NServiceBus. Se o RDP tiver sido inserido no servidor, o aplicativo será instalado pelo seguinte comando:

&"$theInstaller" /install /serviceName:TheServiceName

O instalador imprime informações sobre seu progresso ao registrar o serviço e se conectar ao banco de dados com stdout , entre outras coisas.

Isso funciona bem em uma sessão RDP, mas quando eu o executo remotamente via PS, recebo uma mensagem você-não-pode-por-a-rede se eu a executar diretamente ou via Invoke-Command -computername $theRemoteServer :

System.IO.FileLoadException: Could not load file or assembly 'file://\theRemoteServer\c$ \thePath\AutoMapper.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515) ---> System.NotSupportedException: An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the loadFromRemoteSources switch. See http://go.microsoft.com/fwlink/?LinkId=155569 for more information.

(Nota: eu adicionei um "\" adicional ao caminho na primeira linha para que ele apareça corretamente na visualização deste site.)

Este, e outros DLL s, são carregados pelo serviço, e o contexto de execução do serviço não pode, aparentemente, ser remotificado.

Eu também tentei usar Invoke-WmiMethod , que algo , mas não está claro o que e a saída do instalador é perdida:

Invoke-WMIMethod win32_process create '"$theInstaller" /install /serviceName:TheServiceName' -ComputerName $server (with and without cmd.exe /k before the intaller reference):

__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 2
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ProcessId :
ReturnValue : 9

Como um remotamente executa EXE e captura a saída?

    
por user364825 28.09.2012 / 16:48

3 respostas

1

Outra maneira de quebrar a noz sem ter que alterar a configuração do aplicativo sob implantação:

# increase memory available to WsMan (run from elevated PS instance on remote machine)
set-item wsman:localhost\Shell\MaxMemoryPerShellMB 2048

# for PowerShell v3 or higher this line is also necessary
Set-Item WSMan:\localhost\Plugin\Microsoft.PowerShell\Quotas\MaxMemoryPerShellMB 2048

# add remote work to script on remote server, and then call that script from the local script
invoke-command $remoteServer { param($remoteScript, $arg1, $arg2, $arg3) powershell $script $arg1  $arg2 $arg3 } -ArgumentList $remoteScript, $arg1, $arg2, $arg3
    
por 30.09.2012 / 21:26
3

Execute-a remotamente localmente ... com o que quero dizer, execute-a no servidor remoto em um contexto local, remotamente, a partir de sua máquina local. Bem, talvez seja menos confuso ler ...

Parece que a sua melhor aposta aqui é usar PSExec para abrir um console remoto do PowerShell ou linha de comando da sua máquina local, que estaria sendo executada no servidor remoto.

Então, por exemplo:

psexec \remoteserver cmd.exe

ou

psexec \remoteserver powershell.exe

Você acaba com uma instância do PowerShell ou cmd em execução no servidor remoto, que você estaria manipulando na tela.

    
por 28.09.2012 / 17:18
3

Ok ... isso funciona:

invoke-command $remoteServer { param($installer)  cmd /c "$installer" /install /serviceName:TheServiceName } -ArgumentList $installer

onde $remoteServer é o nome do servidor remoto, $installer é o caminho UNC para o instalador nesse servidor remoto e TheServiceName é o nome do serviço.

No entanto, eu também tive que fornecer configuração especial para permitir que o exe fosse invocado pela rede, como neste artigo: link

Portanto, esse truque é configurar o serviço para ser remotificável e, em seguida, você pode invoke-command .

    
por 28.09.2012 / 22:15