在Powershell中运行远程GUI应用程序

时间:2010-08-25 21:51:17

标签: powershell powershell-remoting

我们有一个自定义组件,它包含了PowerShell的一些功能,因此它可以在BizTalk 2006中使用。对于大多数操作(检查文件路径,复制或移动文件),这样可以正常工作。但是,我们需要远程启动GUI应用程序以进行一些处理。组件本身处理与远程盒的连接,我们所要做的就是设置一些参数然后告诉它执行一个命令

Start-Process -FilePath "path to exe" -ArgumentList "arguments for exe" -WorkingDirectory "workingdir for exe"

问题是:如果我们从盒子本身的powershell命令行运行它,这可以正常工作。然而,当我们远程启动它时(从BizTalk,从测试工具,甚至使用远程Powershell命令行和通过Start-PSSession连接),此应用程序将短暂运行然后退出而不实际执行任何操作。我怀疑是因为有问题的exe需要加载GUI才能运行该进程,这就是导致问题的原因。我已经尝试了我能想到的一切,包括-NoNewWindow和-WindowStyle,但无济于事。任何帮助实现这项工作都将非常感激。

注意:我们无法访问我们尝试运行的应用程序的源代码,因为它是较旧的win32应用程序,并且未提供此应用程序的批处理或命令行版本。

2 个答案:

答案 0 :(得分:18)

使用标准PowerShell方法(WinRM,WMI)无法使用GUI启动应用程序。我所知道的唯一解决方案是使用PsExec from SysInternals(或类似工具)。它可以启动向用户呈现GUI的应用程序。您的命令行将如下所示:

& ".\psexec" -accepteula -i "\\computername" -u "domain\username" -p "password" "command line"
  • -accepteula - 默默接受EULA。
  • -i - 允许GUI。

其他解决方案更加苛刻,包括向调度程序远程添加任务。

答案 1 :(得分:7)

自从我最近遇到这个问题以来,这是我使用Discord建议添加远程任务的解决方案。我更喜欢“黑客”而不必设置一个单独的工具。

if NoAds{
        print("No Ads")
        //topConstraint.constant -= 50
        topConstraint.constant = 50 // Avoid using -= or +=  if this func will call a lot of time
}else{
        print("Ads")

        // set the default constant you want
        topConstraint.constant = 100
        loadBanner()
}