我一直在使用PsExec -d
在远程PowerShell会话中启动控制台应用程序,因为我希望这些应用程序在执行某项任务时在后台运行。问题是我希望后台应用程序继续运行,即使我使用Remove-PSSession
终止远程PowerShell会话。当前发生的事情是远程PowerShell会话被杀死所以在PsExec -d
的帮助下启动的所有进程都是如此。我猜它与进程树有关,以及windows如何管理这些事情的生命周期。
有没有人知道如何启动远程后台进程并让该进程在远程会话被杀后仍然存在?
答案 0 :(得分:25)
首先解释为什么它如此起作用。也许其他人可以使用它来带来另一种解决方案。
我使用基于WMI的解决方案编辑了我的答案。
进入远程会话时:
PS C:\Users\JPB> enter-PSSession -ComputerName 192.168.183.100 -Credential $cred
[192.168.183.100]: PS C:\Users\jpb\Documents>
您在服务器上创建了一个名为wsmprovhost.exe
的流程,如
当您在此远程会话中启动进程时:
[192.168.183.100]: PS C:\Users\jpb\Documents> Start-Process calc.exe
新流程是wsmprovhost.exe
的孩子,如
如果您停止远程会话wsmprovhost.exe
消失,那么子进程就会停止。
解释是wsmprovhost.exe
和由此开始的所有进程属于同一个工作。
默认情况下,一方面,此作业不支持JOB_OBJECT_LIMIT_BREAKAWAY_OK
限制标志,该标志不允许我们使用CREATE_BREAKAWAY_FROM_JOB
标志启动进程,另一方面此作业支持JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
限制标志,导致与作业关联的所有进程在作业的最后一个句柄关闭时终止。
它可能存在一个配置WinRM以支持支持JOB_OBJECT_LIMIT_BREAKAWAY_OK
的作业的解决方案。
编辑:
因此,阅读Microsoft documentation,我发现了一种记录在案的技术方法,您可以通过WinRM启动程序,但是在另一项工作中。默认情况下,与作业关联的进程使用CreateProcess创建的进程与作业相关联;但是,使用 Win32_Process.Create 创建的流程与作业无关。
因此,如果在远程会话中,您使用WMI创建一个进程:
PS C:\silogix> $ps = New-PSSession -ComputerName 192.168.183.100 -Credential $cred
PS C:\silogix> Enter-PSSession -Session $ps
[192.168.183.100]: PS C:\Users\jpb\Documents> Invoke-WmiMethod -path win32_process -name create -argumentlist "calc.exe"
__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 2
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ProcessId : 1236
ReturnValue : 0
[192.168.183.100]: PS C:\Users\jpb\Documents> exit
PS C:\silogix> Remove-PSSession $ps
如果停止远程会话,wsmprovhost.exe消失了,但新进程仍然停留在服务器上,如下所示:
使用WMI启动的进程不属于任何作业。在法语中我会说“Ce qu'ilfallaitdémontrer”