2010-08-25 14 views
15

Mamy niestandardowy komponent, który otacza niektóre funkcje powłoki powershell, dzięki czemu można go używać w frim BizTalk 2006. W przypadku większości operacji (sprawdzanie ścieżki pliku, kopiowanie lub przenoszenie pliku) działa to dobrze. Jednak musimy zdalnie uruchomić aplikację GUI, aby wykonać pewne przetwarzanie. Sam komponent obsługuje połączenie do zdalnej skrzynki, wszystko co musisz zrobić, to ustawić kilka parametrów, a następnie poinformować go, aby wykonać polecenieUruchamianie zdalnej aplikacji GUI w pakiecie Powershell

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

Kwestia jest taka: Jeśli uruchomić to z linii poleceń PowerShell na samo pudełko działa dobrze. Jednak gdy uruchamiamy go zdalnie (z BizTalk, z testowej uprzęży, nawet przy użyciu zdalnego wiersza poleceń PowerShell i połączenia za pośrednictwem Start-PSSession), ta aplikacja uruchomi się na krótko, a następnie wyjdzie bez faktycznego robienia czegokolwiek. Podejrzewam, że ponieważ dany exe wymaga załadowania GUI, aby uruchomić ten proces, jest to przyczyną problemu. Próbowałem wszystkiego, co mogę wymyślić, w tym -NoNewWindow i -WindowStyle, ale bez skutku. Każda pomoc w uzyskaniu tego działania byłaby bardzo doceniana.

Uwaga: Nie mamy dostępu do źródła aplikacji, którą próbujemy uruchomić, ponieważ jest to starsza aplikacja win32 i nie dostarczono tej aplikacji w wersji wsadowej lub wiersza poleceń.

+0

Będę zainteresowany odpowiedziami. Nigdy nie udało mi się zarządzać aplikacją z graficznym interfejsem użytkownika za pomocą zdalnego remarketingu PowerShell. Wydaje się, że remoting i wirtualizacja aplikacji to pomysły, które jeszcze się nie połączyły. – kbrimington

+0

jakiekolwiek ostateczne rozwiązanie z pełnym kodem źródłowym? – Kiquenet

Odpowiedz

15

Przy użyciu standardowych metod PowerShell (WinRM, WMI) nie można uruchamiać aplikacji z graficznym interfejsem użytkownika. Jedyne rozwiązanie, o którym wiem, to użycie PsExec from SysInternals (lub podobnych narzędzi). Może uruchamiać aplikacje, które prezentują GUI użytkownikowi. Linia komend powinna wyglądać tak:

& ".\psexec" -accepteula -i "\\computername" -u "domain\username" -p "password" "command line" 
  • -accepteula - milcząco zaakceptować EULA.
  • -i - zezwól na GUI.

Inne rozwiązania są bardziej hackowskie, w tym zdalne dodawanie zadań do programu planującego.

+2

Uwaga, parametr -i czasami wymaga identyfikatora sesji użytkownika, można go uzyskać najpierw za pomocą polecenia "quser/SERVER: computername". – vitrilo

+0

To @vitrilo, dzięki! To bardzo mi pomaga. –

+0

Czy mogę uruchomić go na maszynie wirtualnej za pomocą Internetu (Mianowicie połączyć za pomocą adresu IP)? – Royi

6

Od kiedy to ostatnio spotkałem, oto moje rozwiązanie z wykorzystaniem sugestii Discorda dodania zdalnego zadania. Wolałem "hakowanie" niż konieczność ustawienia osobnego narzędzia.

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

Mam Windows VM na komputerze zdalnym (RDP przez Internet do określonego IP). Chcę uruchomić aplikację GUI, używając sesji Remote Power Shell. Czy istnieje sposób? – Royi

Powiązane problemy