嘿大家我试图在远程系统上启动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最后运行#没有错误,但远程机器上没有任何反应,杀死进程正常。任何帮助将不胜感激。
答案 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') ; $_ }
)
}