11

我一直在使用PsExec -d远程 powershell 会话中启动控制台应用程序,因为我希望这些应用程序在我执行某些任务时在后台运行。问题是我希望后台应用程序继续运行,即使我用Remove-PSSession. 当前发生的情况是,一旦远程 powershell 会话被终止,所有在PsExec -d. 我猜它与进程树以及 Windows 如何管理此类事物的生命周期有关。

有谁知道我如何启动远程后台进程并让该进程在远程会话被终止后仍然存在?

4

1 回答 1

31

这里首先解释一下它为什么会这样。也许其他人可以使用它来带来另一种解决方案。

我使用基于 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 文档后,我找到了一种记录在案的技术方法,让您可以通过 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 启动的进程不属于任何 Job。在法语中,我会说“Ce qu'il fallait démontrer”

于 2012-01-02T20:17:57.740 回答