在远程会话中启动后台任务,在删除会话时不会被杀死

dav*_*k01 10 powershell psexec powershell-2.0 powershell-remoting

我一直在使用PsExec -d远程PowerShell会话中启动控制台应用程序,因为我希望这些应用程序在执行某些任务时在后台运行.问题是我希望后台应用程序继续运行,即使我杀死远程PowerShell会话Remove-PSSession.当前发生的事情是远程PowerShell会话被杀死所以所有进程都是在帮助下启动的PsExec -d.我猜它与进程树有关,以及windows如何管理这些事情的生命周期.

有没有人知道如何启动远程后台进程并且即使在远程会话被杀死后该进程仍然存在?

JPB*_*anc 26

这是第一个解释为什么它如此工作的解释.也许其他人可以使用它来带来另一种解决方案.

我用基于WMI的解决方案编辑了我的答案.

当您进入远程会话时:

PS C:\Users\JPB> enter-PSSession -ComputerName 192.168.183.100 -Credential $cred
[192.168.183.100]: PS C:\Users\jpb\Documents>
Run Code Online (Sandbox Code Playgroud)

您在服务器上创建一个wsmprovhost.exe如下所示的进程

在此输入图像描述

当您只是在此远程会话中启动进程时:

[192.168.183.100]: PS C:\Users\jpb\Documents> Start-Process calc.exe
Run Code Online (Sandbox Code Playgroud)

新流程是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文档,我找到了一种文档化的技术方法,通过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
Run Code Online (Sandbox Code Playgroud)

如果停止远程会话wsmprovhost.exe消失,但新进程保留在服务器上,如下所示:

在此输入图像描述

以WMI开始的进程不属于任何作业.用法语我会说"Ce qu'ilfallaitdémontrer"