这里首先解释一下为什么会这样。也许其他人可以使用它来带来另一种解决方案。
我使用基于 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。
默认情况下,一方面此作业不支持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'il fallait démontrer”