2010-08-25 17 views
15

Abbiamo un comonente personalizzato che include alcune funzionalità di PowerShell in modo che possa essere utilizzato da BizTalk 2006. Per la maggior parte delle operazioni (controllo di un percorso di file, copia o spostamento di un file) funziona correttamente. Tuttavia abbiamo la necessità di accendere una app GUI in remoto per fare un po 'di elaborazione. Il componente stesso gestisce la connessione alla casella remota, tutto quello che dobbiamo fare è impostare alcuni parametri e poi dire che per eseguire un comandoEsecuzione di app GUI remota in PowerShell

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

Il problema è questo: se si corre questo da una riga di comando PowerShell la scatola stessa, questo funziona bene. Tuttavia, quando lo attiviamo da remoto (da BizTalk, da un'imbracatura di test, anche utilizzando una riga di comando e connessione Powershell remota tramite Start-PSSession), questa applicazione verrà eseguita brevemente, quindi uscirà senza eseguire effettivamente alcuna operazione. Il mio sospetto è che poiché l'exe in questione richiede una GUI da caricare per eseguire il processo, è questo che sta causando un problema. Ho provato tutto quello che posso pensare, tra cui -NoNewWindow e -WindowStyle ma senza successo. Qualsiasi aiuto per farlo funzionare sarebbe molto apprezzato.

Nota: non è possibile accedere all'origine per l'applicazione che si sta tentando di eseguire poiché è un'applicazione Win32 meno recente e non è stata fornita alcuna versione batch o di riga di comando di questa applicazione.

+0

Sarò interessato alle risposte. Non ho mai avuto successo nella gestione di un'app con una GUI tramite il servizio remoto di PowerShell. Sembra che i servizi remoti e la virtualizzazione delle applicazioni siano idee che non sono ancora convergenti. – kbrimington

+0

qualsiasi soluzione finale con codice sorgente completo? – Kiquenet

risposta

15

Utilizzando i metodi standard di PowerShell (WinRM, WMI) non è possibile avviare le applicazioni con la GUI. L'unica soluzione che conosco è usare PsExec from SysInternals (o strumenti simili). Può avviare applicazioni che presentano GUI all'utente. La riga di comando sarà simile a questa:

& ".\psexec" -accepteula -i "\\computername" -u "domain\username" -p "password" "command line" 
  • -accepteula - accettano in silenzio EULA.
  • -i - consentire la GUI.

Altre soluzioni sono più hacky, inclusa l'aggiunta remota di attività allo scheduler.

+2

Nota: a volte il parametro -i richiede ID sessione utente, può essere ottenuto dal comando "quser/SERVER: computername". – vitrilo

+0

Per @vitrilo, grazie! Questo è davvero utile per me. –

+0

Posso eseguirlo su VM utilizzando Internet (Ovvero collegarlo usando l'indirizzo IP)? – Royi

6

Da quando mi sono imbattuto recentemente in questo, ecco la mia soluzione utilizzando il suggerimento di Discord di aggiungere un'attività remota. Ho preferito il "trucco" per dover impostare uno strumento separato.

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

Ho Windows VM su computer remoto (RDP su Internet a un IP specifico). Voglio avviare un'applicazione GUI utilizzando la sessione Remote Power Shell. C'è un modo? – Royi

Problemi correlati