在Powershell中运行远程GUI应用程序
我们有一个自定义组件,它包装了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应用程序的应用程序,该应用程序的任何批次或命令行版本已经提供。
使用PowerShell的标准方法(WinRM的,WMI),你不能使用GUI启动应用程序。我所知道的唯一解决方案是使用PsExec from SysInternals(或类似的工具)。它可以启动向用户呈现GUI的应用程序。你的命令行看起来像这样:
& ".\psexec" -accepteula -i "\\computername" -u "domain\username" -p "password" "command line"
-
-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
}
}
我在远程计算机上有Windows VM(RDP通过互联网连接到特定的IP)。我想使用Remote Power Shell会话启动GUI应用程序。有没有办法? – Royi 2018-02-18 00:07:19
我会感兴趣的反应。我从来没有通过PowerShell远程管理成功管理带GUI的应用程序。看起来远程处理和应用程序虚拟化是尚未收敛的想法。 – kbrimington 2010-08-25 21:56:03
有完整源代码的最终解决方案? – Kiquenet 2012-05-30 07:15:24