Invoke-Command中调用Start-Process启动自定义EXE程序被立即关闭的问题
Invoke-Command中调用Start-Process启动自定义EXE程序被立即关闭的问题
我太懂这种郁闷了——自己写的程序远程启动后闪一下就没,连干活的机会都不给!这种情况基本都是PowerShell远程会话的特性在搞鬼,咱们一步步来排查解决:
先确认程序的工作目录问题
远程WinRM会话默认的工作目录并不是你EXE所在的桌面文件夹,如果你的程序依赖当前目录下的配置文件、资源包,启动后找不到这些文件就会直接退出。试试给Start-Process加上-WorkingDirectory参数,指定程序所在的文件夹:$passwd = convertto-securestring -AsPlainText -Force -String "myPass" $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "domain\user",$passwd Invoke-Command -ComputerName serverIP -ScriptBlock { Start-Process -FilePath "C:\Users\b.ari\Desktop\myProgram.exe" -WorkingDirectory "C:\Users\b.ari\Desktop" } -Credential $cred阻止会话结束时杀掉进程
WinRM远程会话默认会在命令执行完成后,自动终止所有关联的子进程,哪怕你用了Start-Process也逃不掉。这里有两种解决思路:- 让会话等待程序执行完再结束:给Start-Process加上
-NoNewWindow和-Wait参数,这样远程会话会一直等到你的EXE执行完毕才关闭:Invoke-Command -ComputerName serverIP -ScriptBlock { Start-Process -FilePath "C:\Users\b.ari\Desktop\myProgram.exe" -NoNewWindow -Wait } -Credential $cred - 用系统任务计划启动程序:绕过WinRM的会话限制,创建一个一次性任务来启动你的EXE,这样就算会话结束,程序也能正常运行:
Invoke-Command -ComputerName serverIP -ScriptBlock { # 创建一次性任务 schtasks /create /tn "TempRunMyExe" /tr "C:\Users\b.ari\Desktop\myProgram.exe" /sc once /st 00:00 /ru "NT AUTHORITY\SYSTEM" /f # 立即执行任务 schtasks /run /tn "TempRunMyExe" # 可选:程序执行完后删除临时任务 # schtasks /delete /tn "TempRunMyExe" /f } -Credential $cred
- 让会话等待程序执行完再结束:给Start-Process加上
排查程序的交互需求
如果你的EXE需要弹出图形界面或者等待用户输入,远程WinRM会话默认是没有桌面交互权限的,程序启动后因为无法展示界面/获取输入,就会直接退出。这种情况要么给程序加个静默运行的命令行参数(让它不需要交互就能执行),要么试试给Start-Process加上-WindowStyle Normal参数尝试启用界面:Invoke-Command -ComputerName serverIP -ScriptBlock { Start-Process -FilePath "C:\Users\b.ari\Desktop\myProgram.exe" -WindowStyle Normal } -Credential $cred检查权限与UAC拦截
远程执行的用户权限可能不够,或者UAC阻止了程序启动。如果你的程序需要管理员权限,可以给Start-Process加上-Verb RunAs参数(前提是你的远程账号有管理员权限):Invoke-Command -ComputerName serverIP -ScriptBlock { Start-Process -FilePath "C:\Users\b.ari\Desktop\myProgram.exe" -Verb RunAs } -Credential $cred
备注:内容来源于stack exchange,提问作者HLTECH
相关产品推荐
相关产品推荐

