Powershell 在不使用';会话被删除时不会被杀死

Powershell 在不使用';会话被删除时不会被杀死,powershell,powershell-2.0,psexec,powershell-remoting,Powershell,Powershell 2.0,Psexec,Powershell Remoting,我一直在使用PsExec-d在远程powershell会话中启动控制台应用程序,因为我希望这些应用程序在执行某些任务时在后台运行。问题是,即使我使用Remove-PSSession终止远程powershell会话,我仍希望后台应用程序继续运行。当前发生的情况是,一旦远程powershell会话被终止,那么在PsExec-d帮助下启动的所有进程也将被终止。我猜这与进程树以及windows如何管理这些东西的生命周期有关 有人知道我如何启动远程后台进程,并使该进程在远程会话被终止后仍能保持下去吗?这里

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


有人知道我如何启动远程后台进程,并使该进程在远程会话被终止后仍能保持下去吗?

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

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

当您进入远程会话时:

PS C:\Users\JPB> enter-PSSession -ComputerName 192.168.183.100 -Credential $cred
[192.168.183.100]: PS C:\Users\jpb\Documents>
[192.168.183.100]: PS C:\Users\jpb\Documents> Start-Process calc.exe
您可以在服务器上创建一个名为
wsmprovhost.exe
的进程,如下所示

仅在此远程会话中启动进程时:

PS C:\Users\JPB> enter-PSSession -ComputerName 192.168.183.100 -Credential $cred
[192.168.183.100]: PS C:\Users\jpb\Documents>
[192.168.183.100]: PS C:\Users\jpb\Documents> Start-Process calc.exe
新进程是wsmprovhost.exe的子进程,如下所示

如果停止远程会话
wsmprovhost.exe
,则子进程将消失

解释是,
wsmprovhost.exe
和该进程启动的所有进程都属于同一个作业

默认情况下,一方面,此作业不支持
job\u OBJECT\u LIMIT\u breakoff\u OK
LIMIT标志,该标志不允许我们使用
CREATE\u breakoff\u FROM\u job
标志启动流程,另一方面,此作业支持
job\u OBJECT\u LIMIT\u KILL\u on\u job\u CLOSE
LIMIT标志,当作业的最后一个句柄关闭时,该标志会导致与该作业关联的所有进程终止

可能存在一种解决方案,可以将WinRM配置为支持支持
JOB\u OBJECT\u LIMIT\u breakout\u OK
的作业


编辑:

在阅读本文时,我找到了一种有文档记录的技术方法,可以让您通过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'il fallait démontrer”

感谢JPBlanc的分析。我目前的解决方法是简单地使用远程会话来收集信息,这些信息用于从远程会话外部启动带有
PsExec-d
的进程。这样,当远程会话被终止时,以
PsExec-d
启动的进程就不存在了。@davidk01我想我找到了一个干净的解决方案,我编辑了我的答案来解释它。谢谢你的精彩帖子。它节省了我更多的时间来搜索如何做到这一点。