2010-08-25 2 views
15

У нас есть пользовательский comonent, который обертывает некоторые функции powershell, поэтому его можно использовать в BizTalk 2006. Для большинства операций (проверка пути к файлу, копирование или перемещение файла) это отлично работает. Однако нам нужно удаленно запускать графическое приложение, чтобы выполнить некоторую обработку. Сам компонент обрабатывает подключение к удаленной машине, все, что мы должны сделать, это установить некоторые параметры, а затем сказать ему, чтобы выполнить командуЗапуск приложения удаленного GUI в Powershell

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

Вопрос заключается в следующем: если мы запустим это из командной PowerShell линии на сама коробка, это прекрасно работает. Однако, когда мы запускаем его удаленно (из BizTalk, из тестового жгута, даже используя удаленную командную строку Powershell и соединение через Start-PSSession), это приложение запустится ненадолго, а затем выйдет, фактически ничего не сделав. Мое подозрение состоит в том, что, поскольку exe, о котором идет речь, требует загрузки GUI для запуска процесса, что именно это вызывает проблему. Я пробовал все, что мог придумать, включая -NoNewWindow и -WindowStyle, но безрезультатно. Любая помощь в получении этой работы будет очень оценена.

Примечание: У нас нет доступа к источнику для приложения, которое мы пытаемся запустить, поскольку оно является более старым приложением win32, и не было выпущено пакетной или командной строки этого приложения.

+0

Меня будут интересовать ответы. Я никогда не успевал управлять приложением с помощью графического интерфейса через удаленный PowerShell. Похоже, что удаленная работа и виртуализация приложений - это идеи, которые еще не сходились. – kbrimington

+0

любое окончательное решение с полным исходным кодом? – Kiquenet

ответ

15

Используя стандартные методы PowerShell (WinRM, WMI), вы не можете запускать приложения с графическим интерфейсом. Единственное решение, о котором я знаю, это использовать PsExec from SysInternals (или аналогичные инструменты). Он может запускать приложения, которые представляют GUI пользователю. Ваша командная строка будет выглядеть следующим образом:

& ".\psexec" -accepteula -i "\\computername" -u "domain\username" -p "password" "command line" 
  • -accepteula - молча принять лицензионное соглашение.
  • -i - разрешить графический интерфейс.

Другие решения более хакерские, включая удаленное добавление задач к планировщику.

+2

Примечание. Параметр -i иногда требует идентификатора сеанса пользователя, он может быть получен с помощью команды «quser/SERVER: computername». – vitrilo

+0

To @vitrilo, Спасибо! Это действительно полезно для меня. –

+0

Могу ли я запустить его на виртуальной машине в Интернете (а именно подключить его с помощью IP-адреса)? – Royi

6

Так как я натолкнулся на это недавно, вот мое решение, используя предложение Discord о добавлении удаленной задачи. Я предпочел «взломать» необходимость установки отдельного инструмента.

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

У меня Windows VM на удаленном компьютере (RDP через Интернет для определенного IP). Я хочу запустить приложение GUI с помощью сеанса Remote Power Shell. Есть ли способ? – Royi

Смежные вопросы