script gui creator powershell powershell-remoting

creator - Ejecutando la aplicación GUI remota en Powershell



powershell gui builder (2)

Tenemos un componente personalizado que envuelve algunas de las funciones de powershell para que se pueda usar desde BizTalk 2006. Para la mayoría de las operaciones (verificar una ruta de archivo, copiar o mover un archivo), esto funciona bien. Sin embargo, tenemos la necesidad de iniciar una aplicación GUI de forma remota para realizar algún procesamiento. El componente en sí mismo maneja la conexión a la caja remota, todo lo que tenemos que hacer es configurar algunos parámetros y luego decirle que ejecute un comando

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

El problema es el siguiente: si ejecutamos esto desde una línea de comando de powershell en la propia caja, esto funciona bien. Sin embargo, cuando lo activamos de forma remota (desde BizTalk, desde un arnés de prueba, incluso utilizando una línea de comandos Powershell remota y una conexión a través de Start-PSSession), esta aplicación se ejecutará brevemente y luego se cerrará sin hacer nada. Mi sospecha es que debido a que el exe en cuestión requiere que se cargue una GUI para ejecutar el proceso, esto es lo que está causando un problema. He intentado todo lo que puedo pensar, incluyendo -Nueva ventana y estilo de ventana, pero sin éxito. Cualquier ayuda para este trabajo sería muy apreciada.

Nota: no tenemos acceso a la fuente de la aplicación que intentamos ejecutar, ya que es una aplicación win32 más antigua, y no se ha suministrado ninguna versión de línea de comando o lote de esta aplicación.


Con los métodos estándar de PowerShell (WinRM, WMI) no puede iniciar aplicaciones con GUI. La única solución que conozco es usar PsExec de SysInternals (o herramientas similares). Puede lanzar aplicaciones que presentan GUI al usuario. Su línea de comando se verá así:

& "./psexec" -accepteula -i "//computername" -u "domain/username" -p "password" "command line"

  • -accepteula - acepta silenciosamente el EULA.
  • -i - permite GUI.

Otras soluciones son más complicadas, incluida la adición remota de tareas al programador.


Desde que descubrí esto recientemente, aquí está mi solución utilizando la sugerencia de Discord de agregar una tarea remota. Preferí el "hack" en lugar de tener que configurar una herramienta separada.

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 } }