2010-08-25 169 views
15

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

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

的问题是这样的:如果我们运行这个从上一个PowerShell命令行盒子本身,这工作正常。然而,当我们远程火起来(从BizTalk,从测试工具,甚至使用远程PowerShell命令行,并通过启动的PSSession连接),这个程序将简要运行,那么实际上没有做任何退出。我怀疑是因为有问题的exe文件需要加载GUI才能运行该进程,这是导致问题的原因。我尝试了所有我能想到的,包括-NoNewWindow和-WindowStyle,但无济于事。任何帮助获得这项工作将非常感激。

注:我们没有访问源,我们正在尝试运行,因为它是一个较旧的Win32应用程序的应用程序,该应用程序的任何批次或命令行版本已经提供。

+0

我会感兴趣的反应。我从来没有通过PowerShell远程管理成功管理带GUI的应用程序。看起来远程处理和应用程序虚拟化是尚未收敛的想法。 – kbrimington 2010-08-25 21:56:03

+0

有完整源代码的最终解决方案? – Kiquenet 2012-05-30 07:15:24

回答

15

使用PowerShell的标准方法(WinRM的,WMI),你不能使用GUI启动应用程序。我所知道的唯一解决方案是使用PsExec from SysInternals(或类似的工具)。它可以启动向用户呈现GUI的应用程序。你的命令行看起来像这样:

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

其他解决方案更加黑客,包括远程添加任务到调度程序。

+2

注意,-i参数有时需要用户会话ID,可以先通过“quser/SERVER:computername”命令获取。 – vitrilo 2016-08-23 11:11:57

+0

To @vitrilo,谢谢!这对我很有帮助。 – 2017-08-03 03:07:58

+0

我可以使用互联网在虚拟机上运行它吗(即使用IP地址连接它)? – Royi 2018-02-18 00:05:49

6

由于我最近遇到这个问题,这里是我使用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 
    } 

} 
+0

我在远程计算机上有Windows VM(RDP通过互联网连接到特定的IP)。我想使用Remote Power Shell会话启动GUI应用程序。有没有办法? – Royi 2018-02-18 00:07:19