2010-08-25 22 views
15

Tenemos un componente personalizado que envuelve parte de la funcionalidad de powershell para que se pueda usar frim BizTalk 2006. Para la mayoría de las operaciones (verificar una ruta de archivo, copiar o mover un archivo) funciona bien. Sin embargo, tenemos la necesidad de iniciar una aplicación GUI de forma remota para hacer algún procesamiento. El propio componente se encarga de la conexión a la caja de control remoto, todo lo que tenemos que hacer es establecer algunos parámetros y luego decir que para ejecutar un comandoEjecutando la aplicación GUI remota en Powershell

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

La cuestión es la siguiente: Si corremos esto desde una línea de comandos PowerShell en la caja en sí, esto funciona bien. Sin embargo, cuando lo ejecutamos de forma remota (desde BizTalk, desde un arnés de prueba, incluso utilizando una línea de comandos de Powershell remota y la conexión a través de Start-PSSession), esta aplicación se ejecutará brevemente y luego saldrá sin hacer nada. Mi sospecha es que debido a que el archivo ejecutable en cuestión requiere una GUI para cargar para ejecutar el proceso, es esto lo que está causando un problema. Intenté todo lo que pude pensar, incluyendo -NoNewWindow y -WindowStyle pero fue en vano. Cualquier ayuda para hacer que esto funcione sería muy apreciada.

Nota: No tenemos acceso a la fuente de la aplicación que estamos tratando de ejecutar, ya que es una aplicación win32 anterior, y no se ha proporcionado ninguna versión de lote o de línea de comando de esta aplicación.

+0

Me interesarán las respuestas. Nunca he tenido éxito administrando una aplicación con una GUI a través de PowerShell remoto. Parece que la virtualización remota y de aplicaciones son ideas que aún no convergen. – kbrimington

+0

¿alguna solución final con código fuente completo? – Kiquenet

Respuesta

15

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

& ".\psexec" -accepteula -i "\\computername" -u "domain\username" -p "password" "command line" 
  • -accepteula - aceptar en silencio EULA.
  • -i - permitir GUI.

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

+2

Nota: el parámetro -i a veces requiere ID de sesión de usuario; primero se puede obtener mediante el comando "quser/SERVER: computername". – vitrilo

+0

Para @vitrilo, gracias! Eso es realmente útil para mí. –

+0

¿Puedo ejecutarlo en VM usando Internet (a saber, conectarlo usando una dirección IP)? – Royi

6

Desde que me encontré con esto recientemente, aquí está mi solución usando la sugerencia de Discord de agregar una tarea remota. Preferí el "truco" sobre tener que configurar una herramienta por separado.

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

Tengo Windows VM en una computadora remota (RDP en Internet a una dirección IP específica). Deseo iniciar una Aplicación GUI utilizando la sesión Remote Power Shell. ¿Hay alguna manera? – Royi

Cuestiones relacionadas