使用PowerShell在远程计算机上启动.exe文件

时间:2017-01-07 00:34:33

标签: windows powershell powershell-remoting

嘿大家我试图在远程系统上启动exe文件,我们有一个代理运行将我们的网站连接到我们的数据库和打印机。它偶尔会挂起,并要求我们远程进入和/或转到工作站并重新启动应用程序。我在这里尝试了许多不同的解决方案,但似乎都没有。

我能够杀死正在运行的进程但是它不会重新打开exe文件再次启动它。这是迄今为止的小脚本

################################################
write-host "This will Restart Workbench helper please press the any key to  start"
pause
$mycreds = Get-Credential
$computer = Read-Host -prompt "Please Enter Computer Name"
$WBSTART1 = Read-Host -prompt "please enter command"
$pers = New-PSSession -ComputerName $computer -Credential $mycreds
# Gets Computer Name and Kills Workbench Helper #

(Get-WmiObject win32_process -ComputerName $computer -Credential $mycreds |  ?{ $_.ProcessName -match "Workbench3.helper" }).Terminate()

# Writes Host countdown to screen # 
write-host -ForegroundColor black -NoNewline "Stopping Process"
foreach ($element in 1..10)
{
Write-Host -NoNewline "${element} " -BackgroundColor 'white' - ForegroundColor 'black'
Start-Sleep -Seconds 1
}
Write-Host ''
Write-host "Process Complete"
Start-Process -filepath "C:\Program Files (x86)\Company Security\Workbench3 Helper\WorkBench3.Helper.exe"

# Writes Host countdown to termination Screen # 
write-host -ForegroundColor black -NoNewline "Starting Workbench Process"
foreach ($element in 1..10)
{
Write-Host -NoNewline "${element} " -BackgroundColor 'white' -ForegroundColor 'black'
Start-Sleep -Seconds 1
}
Write-Host ''
Write-host "Process Complete"


# Starts Process #
$WBSTART = {start-process -filepath 'C:\Program Files (x86)\FrontPoint  Security\Workbench3 Helper\WorkBench3.Helper.exe'}
Invoke-Command –ComputerName $computer -Credential $mycreds -ScriptBlock $WBSTART 

#Starts最后运行#没有错误,但远程机器上没有任何反应,杀死进程正常。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

您为远程计算机创建了一个pssession但没有使用它。您的Start-Process是在托管脚本的计算机上运行的。您需要使用Enter-PSSession,因为它:

  

启动与远程计算机的交互式会话。

进入会话后,您无需远程运行WMI命令。您可以像在服务器上直接运行一样运行它们。借用MSDN上的示例

  
    

第一个命令使用Enter-PSSession cmdlet启动与远程计算机Server01的交互式会话。会话启动时,命令提示符将更改为包含计算机名称。

  
PS C:\> Enter-PSSession -Computer Server01
[Server01]: PS C:\>
     
    

第二个命令获取Windows PowerShell进程并将输出重定向到Process.txt文件。该命令将提交给远程计算机,文件将保存在远程计算机上。

  
[Server01]: PS C:\> Get-Process Powershell > C:\ps-test\Process.txt

完成后不要忘记致电Exit-PSSession

调用指令

如果您不想使用pssessions,那么您也可以在远程计算机上Invoke-Command。您已经尝试使用最后一行代码执行此操作。

Invoke-Command -ComputerName $computer -ScriptBlock {Start-Process "bagel.exe"}

如果您确实沿着这条路走下去,请注意范围问题和look up how to pass arguments to the scriptblock

我不确定你为什么不工作。也许你有一些错误被压制?我会尝试更简单的测试。您的应用程序GUI是否基于?运行时可能无法正常工作。尝试ipconfig之类的内容,看看结果如何。

在等待远程计算机上的进程终止/启动时,我还会考虑带有超时条件的while循环。那就是你可以更好地解决失败,而不是假设10秒就足够了。

答案 1 :(得分:1)

我认为您的本地/远程执行存在问题。

Terminate()

以上行将从远程计算机返回到本地计算机的所有进程。比你在LOCAL机器上更换返回的过程对象,并在你的LOCAL机器上调用Invoke-command -session $pers -ScriptBlock { (Get-WmiObject win32_process -ComputerName $computer -Credential $mycreds | ?{ $_.ProcessName -like"*Workbench3.helper*" }).Terminate()}。我建议您改用以下行:

like

这应该会杀死Workbench3进程。我使用$pers运算符使过滤不那么严格。

之后,您可以重复使用Invoke-command -session $pers -scriptblock {Start-Process -filepath "C:\Program Files (x86)\Company Security\Workbench3 Helper\WorkBench3.Helper.exe" -Wait }中存储的会话重新启动该过程。

-Wait

我还使用了Start-Process开关。开关强制Invoke-Command等待程序启动(并在之后返回)。

进行远程操作时,我总是建议通过-ComputerName执行这些操作,而不是通过几个命令的Invoke-Command参数。 -ComputerName通过HTTP(S)使用WS-MAN,而提供invoke-command参数的命令的远程实现在实现上从cmdlet到cmdlet不同。 sometimes的这一优势使其更易于配置,例如防火墙。

希望有所帮助。

答案 2 :(得分:0)

感谢您的帮助!所以这就是我最终要完成我想做的事情,你觉得怎么样?

$mycreds = Get-Credential
$computer = Read-Host -prompt "Please Enter Computer Name"
$s = New-PSSession -ComputerName $computer -Credential $mycreds

 #### Kills Workbench Helper Proccess ####
Invoke-command -ScriptBlock { (Get-WmiObject win32_process -ComputerName $computer -Credential $mycreds |  ?{ $_.ProcessName -like"*Workbench3.helper*" }).Terminate()}

################ Starting Workbench Helper #####################
Invoke-Command $s {$run = (Get-Date).AddMinutes(1) Register-ScheduledTask -TaskName "ZZ_Start WorkBench Helper"  -User "domain\user" -InputObject (
 (
New-ScheduledTask -Action (
  New-ScheduledTaskAction -Execute "C:\Program Files (x86)\Company Security\Workbench3 Helper\WorkBench3.Helper.exe" -Argument (
    " "
  )
) -Trigger (
  New-ScheduledTaskTrigger -Once -At ($run.TimeOfDay.ToString("hh\:mm")) # As a "TimeOfDay" to get 24Hr format
) -Settings (
  New-ScheduledTaskSettingsSet  -DeleteExpiredTaskAfter 00:00:01 #
) 
) | %{ $_.Triggers[0].EndBoundary = $run.AddMinutes(1).ToString('s') ; $_ }
)
}