Запуск фоновых задач в удаленном сеансе, которые не убиваются при удалении сеанса - PullRequest
10 голосов
/ 30 декабря 2011

Я использовал PsExec -d для запуска консольных приложений в удаленном сеансе PowerShell, потому что я хочу, чтобы эти приложения работали в фоновом режиме, пока я выполняю какую-то задачу. Проблема в том, что я хочу, чтобы фоновые приложения продолжали работать, даже если я прерву сеанс удаленного powershell с Remove-PSSession. В настоящее время происходит, когда удаленный сеанс PowerShell завершается, и все процессы, которые были запущены с помощью PsExec -d. Я предполагаю, что это как-то связано с деревьями процессов и тем, как windows управляет временем жизни таких вещей.

Кто-нибудь знает, как я могу запустить удаленный фоновый процесс и сохранить этот процесс даже после завершения удаленного сеанса?

1 Ответ

25 голосов
/ 03 января 2012

Вот первое объяснение того, почему это так работает.Возможно, кто-то еще может использовать его, чтобы принести другое решение.

Я отредактировал свой ответ с помощью решения, основанного на 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, как показано здесь под

enter image description here

Когда вы просто запускаете процесс в этом удаленном сеансе:

[192.168.183.100]: PS C:\Users\jpb\Documents> Start-Process calc.exe

Новый процесс является дочерним для wsmprovhost.exe, как показано здесь под

enter image description here

Если вы остановите удаленный сеанс, wsmprovhost.exe исчезнет, ​​и, таким образом, дочерний процесс.

Объяснение состоит в том, что wsmprovhost.exe и все процессы, запущенные этим процессом, принадлежат одному и тому же заданию.

enter image description here

По умолчанию, с одной стороны, это задание НЕ поддерживает флаг ограничения 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 исчезнет, ​​но новый процесс останется на сервере, как показано здесь:

enter image description here

Процессы, запущенные сWMI не принадлежит ни одной вакансии.На французском я бы сказал "Ce qu'il fallait démontrer"

...