【问题标题】:Running remote GUI app in Powershell在 Powershell 中运行远程 GUI 应用程序
【发布时间】:2011-04-03 23:40:45
【问题描述】:

我们有一个自定义组件,它封装了 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 管理应用程序。似乎远程处理和应用程序虚拟化是尚未融合的想法。
  • 有完整源代码的最终解决方案吗?

标签: powershell powershell-remoting


【解决方案1】:

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

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

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

【讨论】:

  • 注意,-i参数有时需要User Session ID,可以先通过“quser /SERVER:computername”命令获取。
  • 致@vitrilo,谢谢!这对我真的很有帮助。
  • 能否在虚拟机上通过互联网运行(即使用IP地址连接)?
  • @Royi 不太可能。
  • @Athari,有没有在没有 RDP 的情况下在远程计算机上启动 GUI 应用程序的解决方案?也许像时间表之类的?
【解决方案2】:

自从我最近遇到这个问题以来,这是我使用 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 虚拟机(通过 Internet 到特定 IP 的 RDP)。我想使用远程 Power Shell 会话启动 GUI 应用程序。有办法吗?
  • @Royi,你试过上面的psexec 命令吗?如果虚拟机配置正确,它应该像真正的 Windows 服务器一样运行。
  • @Ben,你提到了关于 Discord 的建议。你能给我们指出那个链接吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-22
相关资源
最近更新 更多