2011-12-30 10 views
8

Ho utilizzato PsExec -d per avviare le applicazioni della console in una sessione PowerShell remota perché desidero che queste app vengano eseguite in background mentre eseguo alcune attività . Il problema è che voglio che le applicazioni in background continuino a funzionare anche se uccido la sessione PowerShell remota con Remove-PSSession. Quello che succede attualmente è una volta che la sessione di PowerShell remota viene uccisa, quindi sono tutti i processi che sono stati avviati con l'aiuto di PsExec -d. Immagino che abbia qualcosa a che fare con gli alberi del processo e su come Windows gestisce la durata di tali cose.Avvio di attività in background in una sessione remota che non vengono eliminate quando la sessione viene rimossa

Qualcuno ha idea di come sia possibile avviare un processo in background remoto e mantenere tale processo anche dopo l'interruzione della sessione remota?

risposta

22

Ecco qui una prima spiegazione del perché funziona così. Forse qualcun altro può usarlo per portare un'altra soluzione.

Ho modificato la risposta con una soluzione basata su WMI.

Quando si entra in una sessione remota:

PS C:\Users\JPB> enter-PSSession -ComputerName 192.168.183.100 -Credential $cred 
[192.168.183.100]: PS C:\Users\jpb\Documents> 

È possibile creare sul server un processo chiamato wsmprovhost.exe come mostrato qui sotto

enter image description here

Quando si avvia semplicemente un processo in questa sessione remota :

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

Il nuovo processo è un bambino di wsmprovhost.exe come mostrato qui sotto

enter image description here

Se si interrompe la sessione remota wsmprovhost.exe scomparso e così il processo figlio.

La spiegazione è che wsmprovhost.exe e tutti i processi avviati da questo appartengono allo stesso lavoro.

enter image description here

Per impostazione predefinita, da un lato questo lavoro non supporta JOB_OBJECT_LIMIT_BREAKAWAY_OK bandiera limite che non ci permette di avviare un processo con CREATE_BREAKAWAY_FROM_JOB la bandiera, d'altra parte questo lavoro supporta JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE bandiera limite che fa sì che tutti i processi associato al lavoro da terminare quando viene chiuso l'ultimo handle del lavoro.

Esiste forse una soluzione per configurare WinRM per supportare lavori che supportano JOB_OBJECT_LIMIT_BREAKAWAY_OK.


Modificato:

Quindi la lettura Microsoft documentation, ho trovato un modo tecnico documentato per iniziare un programma attraverso il WinRM ma in un lavoro onother. Per impostazione predefinita, i processi creati utilizzando CreateProcess da un processo associato a un lavoro sono associati al lavoro; tuttavia, i processi creati utilizzando Win32_Process.Createnon sono associati al lavoro.

Quindi, se in voi sessione remota si crea un processo con WMI in questo modo:

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 

Se si interrompe la sessione remota wsmprovhost.exe scomparso, ma il nuovo soggiorno processo sul server come mostrato qui sotto:

enter image description here

I processi avviati con WMI non appartiene a qualsiasi lavoro. In francese direi "Ce qu'il fallait démontrer"

+1

Grazie per l'analisi JPBlanc. La mia soluzione attuale è semplicemente utilizzare le sessioni remote per raccogliere informazioni utilizzate per avviare processi con 'PsExec -d' dall'esterno delle sessioni remote. In questo modo, quando viene interrotta la sessione remota, il processo avviato con 'PsExec -d' non lo è. – davidk01

+0

@ davidk01 Penso di aver trovato una soluzione pulita, ho modificato la mia risposta per spiegarlo. – JPBlanc

+1

Grazie per l'ottimo post. Mi ha risparmiato più ore di ricerca su come farlo. –

Problemi correlati