Powershell:在远程服务器上执行 exe 并捕获输出

Powershell:在远程服务器上执行 exe 并捕获输出

我正在尝试编写脚本来执行远程 Web 服务器上的安装程序。有问题的安装程序也是托管 NServiceBus 的 Windows 服务。如果通过 RDP 连接到服务器,则应用程序将通过以下命令安装:

&"$theInstaller" /安装/服务名称:服务名称

安装程序会打印有关注册服务和连接数据库等进度的输出stdout

这在 RDP 会话中运行良好,但当我通过 PS 远程执行它时,我得到了你不能通过网络做到这一点如果我直接执行或通过以下方式执行,则会显示以下消息Invoke-Command -computername $theRemoteServer

System.IO.FileLoadException: 无法加载文件或程序集“file://\\theRemoteServer\c$ \thePath\AutoMapper.dll”或其依赖项之一。不支持操作。(来自 HRESULT 的异常:0x80131515)---> System.NotSupportedException:尝试从网络位置加载程序集,这会导致程序集在以前版本的 .NET Framework 中被沙盒化。此版本的 .NET Framework 默认不启用 CAS 策略,因此此加载可能很危险。如果此加载不打算对程序集进行沙盒化,请启用 loadFromRemoteSources 开关。请参阅http://go.microsoft.com/fwlink/?LinkId=155569了解更多信息。

(注意:我在第一行的路径中添加了一个额外的“\”,以便它能够在本网站的预览中正确显示。)

该项和其他DLL项均由服务加载,并且服务的执行上下文显然无法被远程执行。

我也尝试过使用Invoke-WmiMethod,它确实某物,但不清楚是什么,并且安装程序的输出丢失:

Invoke-WMIMethod win32_process create '"$theInstaller" /install /serviceName:TheServiceName' -ComputerName $server (在安装程序引用之前带有和不带有 cmd.exe /k):

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

如何远程执行这样的EXE 捕获输出?

答案1

在本地远程执行...我的意思是,在本地环境中的远程服务器上从本地计算机远程执行。好吧,也许继续阅读会减少困惑...

听起来你最好的选择是使用执行程序从本地计算机打开远程 PowerShell 控制台或命令行,该控制台或命令行将在远程服务器上执行。

例如:

psexec \\远程服务器 cmd.exe

或者

psexec \\远程服务器 powershell.exe

您最终会得到一个 PowerShell 实例或cmd在远程服务器上运行,然后在屏幕上对其进行操作。

答案2

好的...这有效:

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

其中,$remoteServer是远程服务器的名称,$installer是该远程服务器上安装程序的 UNC 路径,TheServiceName是服务名称。

但是,我还必须提供特殊配置才能通过网络调用该 exe,如本文所示: http://through-the-interface.typepad.com/through_the_interface/2011/07/loading-blocked-and-network-hosted-assemblies-with-net-4.html

所以这个技巧是将服务配置为可远程管理的,然后您就可以使用invoke-command它了。

答案3

无需更改部署应用程序的配置即可解决问题的另一种方法:

# 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

相关内容