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

在Powershell中运行远程GUI应用程序,powershell,powershell-remoting,Powershell,Powershell Remoting,我们有一个自定义组件,它封装了powershell的一些功能,因此可以在BizTalk 2006中使用。对于大多数操作(检查文件路径、复制或移动文件),这都可以正常工作。然而,我们需要远程启动GUI应用程序来进行一些处理。组件本身处理到远程框的连接,我们所要做的就是设置一些参数,然后告诉它执行一个命令 Start-Process -FilePath "path to exe" -ArgumentList "arguments for exe" -WorkingDirectory "working

我们有一个自定义组件,它封装了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来运行进程,所以正是这一点导致了问题。我已经尝试了所有我能想到的方法,包括-nonewindow和-WindowStyle,但都没有用。如果您能帮助我们完成这项工作,我们将不胜感激


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

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

&“\psexec”-accepteula-i”\\computername”-u“域\用户名”-p“密码”命令行
  • -accepteula
    -静默地接受EULA
  • -i
    -允许GUI

其他解决方案则更为棘手,包括向调度程序远程添加任务。

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

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
    }

}

我会对回复感兴趣。我从未通过PowerShell远程处理成功管理过GUI应用程序。远程处理和应用程序虚拟化似乎还没有融合。是否有完整源代码的最终解决方案?注意,-i参数有时需要用户会话ID,可以先通过“quser/SERVER:computername”命令获得。发送至@cristlo,谢谢!这对我真的很有帮助。我可以使用Internet在VM上运行它吗(即使用IP地址连接它)?@Royi不太可能。@Athari,有没有解决方案可以在远程计算机上不使用RDP启动GUI应用程序?可能类似于时间表?我在远程计算机上安装了Windows VM(通过internet将RDP连接到特定IP)。我想使用远程Power Shell会话启动GUI应用程序。有办法吗?@Royi,你试过上面的
psexec
命令了吗。。如果虚拟机配置正确,它应该像真正的Windows服务器一样运行。@Ben,你提到了一些关于Discord的建议。你能给我们指出那个链接吗?