2010-08-25 21 views
15

Biz, Powershell'nin bazı işlevlerini içeren bir özel bileşene sahibiz, bu yüzden BizTalk 2006 frimadında kullanılabilir. Çoğu işlem için (bir dosya yolunu denetleme, bir dosyayı kopyalama veya taşıma) bu iyi çalışır. Ancak bazı işlemleri yapmak için bir GUI uygulamasını uzaktan tetikleme ihtiyacımız var. Üzerinde bir powershell komut satırından bu çalıştırırsanız: şudur bileşen kendisi uzak kutusuna bağlantıyı kolları, yapmamız gereken tek şey komutunuUzak GUI uygulamasını Powershell'de çalıştırma

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

konu yürütmek için söylemek sonra bazı parametrelerini ayarlamak ve kutunun kendisi, bu iyi çalışıyor. Ancak biz uzaktan ateşlediğimizde (BizTalk'tan, bir test kablo demetinden, hatta uzak bir Powershell komut satırı ve Start-PSSession üzerinden bağlantı kullanarak), bu uygulama kısa bir süre sonra gerçekten bir şey yapmadan çıkacaktır. Şüphem şudur ki, söz konusu exe, işlemi yürütmek için bir GUI yüklemesi gerektiğinden, bir soruna neden olan budur. -NoNewWindow ve -WindowStyle dahil olmak üzere düşünebildiğim her şeyi denedim ama boşuna. Bu çalışmayı elde etmek için herhangi bir yardım çok takdir edilecektir.

Not: Daha eski bir win32 uygulaması olduğu için çalıştırmaya çalıştığımız uygulamanın kaynağına erişimimiz yoktur ve bu uygulamanın hiçbir toplu veya komut satırı sürümü sağlanmamıştır.

+0

Yanıtlarla ilgilenirim. PowerShell remoting üzerinden bir GUI ile bir uygulamayı yönetme konusunda hiç başarılı olmadım. Uzaklaştırma ve uygulama sanallaştırması henüz bir araya gelmeyen fikirler. – kbrimington

+0

Tam kaynak kodu ile herhangi bir nihai çözüm? – Kiquenet

cevap

15

Standart PowerShell yöntemlerini (WinRM, WMI) kullanarak, uygulamaları GUI ile başlatamazsınız. Tanıdığım tek çözüm, PsExec from SysInternals (veya benzeri araçlar) kullanmaktır. GUI'yi kullanıcıya sunan uygulamaları başlatabilir. Sizin komut satırı aşağıdaki gibi görünecektir:

& ".\psexec" -accepteula -i "\\computername" -u "domain\username" -p "password" "command line" 
  • -accepteula - sessizce EULA'yı kabul.
  • -i - GUI'ye izin verin.

Diğer çözümler, zamanlayıcıya görevlerin uzaktan eklenmesi de dahil olmak üzere daha rahatsız edici.

+2

Not, -i parametresi bazen Kullanıcı Oturumu Kimliği gerektirir, önce "quser/SERVER: bilgisayaradı" komutuyla edinilebilir. – vitrilo

+0

To @vitrilo, Teşekkürler! Bu benim için gerçekten faydalı. –

+0

İnterneti kullanarak sanal makinede çalıştırabilir miyim (IP adresini kullanarak bağlayabilirsiniz)? – Royi

6

Son zamanlara rastladığımdan beri, Discord'un uzak bir görev ekleme önerisini kullanarak çözümüm. Ayrı bir araç kurmak zorunda kalmadan "kesmek" tercih ettim.

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

Uzak bilgisayarda Windows VM var (Internet üzerinden belirli bir IP'ye RDP). Uzaktan Güç Kabuk oturumu kullanarak bir GUI Uygulaması başlatmak istiyorum. Bir yolu var mı? – Royi

İlgili konular