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

21

我们有一个自定义组件,它包装了一些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应用程序,也没有提供任何批处理或命令行版本。

我会对回复感兴趣。 我从未成功地通过PowerShell远程管理带GUI的应用程序。 远程处理和应用程序虚拟化似乎是尚未融合的概念。 - kbrimington
有没有完整源代码的最终解决方案? - Kiquenet
2个回答

20

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

& ".\psexec" -accepteula -i "\\computername" -u "domain\username" -p "password" "command line"
  • -accepteula — 静默接受最终用户许可协议。
  • -i — 允许图形用户界面。

其他解决方案比较巧妙,包括将任务远程添加到计划程序中。


5
注意,-i参数有时需要用户会话ID。您可以先通过"quser /SERVER:计算机名称"命令获取该ID。 - vitrilo
给@vitrilo,谢谢!这对我真的很有帮助。 - Mystic Lin
我可以在虚拟机上使用互联网运行它吗?也就是说,可以使用IP地址连接它吗? - Royi
@Royi 不太可能。 - Athari
@Athari,有没有无需RDP在远程计算机上启动GUI应用程序的解决方案?也许像计划任务那样的东西? - Royi

11

最近我遇到了这个问题,这是我使用Discord提出的添加远程任务的解决方案。相比于设置一个单独的工具,我更喜欢这种“hack”的方式。

function Start-Process-Active
{
    param
    (
        [System.Management.Automation.Runspaces.PSSession]$Session,
        [string]$Executable,
        [string]$Argument,
        [string]$WorkingDirectory,
        [string]$UserID,
        [switch]$Verbose = $false

    )

    if (($Session -eq $null) -or ($Session.Availability -ne [System.Management.Automation.Runspaces.RunspaceAvailability]::Available))
    {
        $Session.Availability
        throw [System.Exception] "Session is not availabile"
    }

    Invoke-Command -Session $Session -ArgumentList $Executable,$Argument,$WorkingDirectory,$UserID -ScriptBlock {
        param($Executable, $Argument, $WorkingDirectory, $UserID)
        $action = New-ScheduledTaskAction -Execute $Executable -Argument $Argument -WorkingDirectory $WorkingDirectory
        $principal = New-ScheduledTaskPrincipal -userid $UserID
        $task = New-ScheduledTask -Action $action -Principal $principal
        $taskname = "_StartProcessActiveTask"
        try 
        {
            $registeredTask = Get-ScheduledTask $taskname -ErrorAction SilentlyContinue
        } 
        catch 
        {
            $registeredTask = $null
        }
        if ($registeredTask)
        {
            Unregister-ScheduledTask -InputObject $registeredTask -Confirm:$false
        }
        $registeredTask = Register-ScheduledTask $taskname -InputObject $task

        Start-ScheduledTask -InputObject $registeredTask

        Unregister-ScheduledTask -InputObject $registeredTask -Confirm:$false
    }

}

我在远程计算机上有一个Windows虚拟机(通过互联网RDP到特定IP)。我想使用远程PowerShell会话启动GUI应用程序。有什么办法吗? - Royi
@Royi,你尝试过上面的 psexec 命令吗?如果虚拟机配置正确,它应该像真正的 Windows 服务器一样运行。 - alpha_989
1
@Ben,你提到了Discord的建议,能给我们指一下链接吗? - alpha_989

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接