2015-05-25 5 views
5

Supponiamo, se ho creato un processo utilizzando le API CreateProcess o CreateProcessAsUser, significa che chiamare TerminateProcess(PROCESS_INFORMATION.hProcess) interromperà sempre tale processo indipendentemente dal contesto in cui è in esecuzione il mio processo host (utente con privilegi ridotti, Guest predefinito, ecc.)?Se ho creato un processo, significa che sarò sempre in grado di terminarlo?

+0

Tutte le informazioni che ti servono sembrano essere nelle pagine di documentazione dietro quei collegamenti .... Li hai letti? –

+0

Nella documentazione di TerminateProcess ho letto: "La funzione [...] richiede l'annullamento di tutti gli I/O in sospeso. Il processo terminato non può essere terminato finché tutti gli I/O in attesa non sono stati completati o annullati." Questo potrebbe essere letto come se indicasse che se l'I/O non onora la richiesta di annullamento, il processo non può essere risolto. Scommetto che potresti scrivere un driver a scopo dimostrativo, e ad es. con NFS su linee laggose possono essere presenti bancarelle lunghe. –

+1

@PeterSchneider A livello di driver, ci sono un sacco di cose che puoi fare per evitare che il processo venga terminato, inclusa la sostituzione di TerminateProcess con la tua implementazione. –

risposta

4

Non l'ho provato, ma secondo la documentazione dovresti essere sempre in grado di terminare con successo il processo utilizzando l'handle restituito in PROCESS_INFORMATION. In Windows le autorizzazioni del modello di sicurezza vengono normalmente verificate solo rispetto all'handle utilizzato, nient'altro. In base alla documentazione MSDN su Process Security and Access Rights:

l'handle restituito dalla funzione CreateProcess ha PROCESS_ALL_ACCESS accesso all'oggetto processo.

La documentazione per CreateProcessAsUser permette di farlo con:

Questo descrittore di protezione potrebbe non consentire l'accesso per il chiamante, nel qual caso il processo non può essere riaperto dopo che è stato eseguito. L'handle del processo è valido e continuerà ad avere i diritti di accesso completo.

L'unico requisito autorizzazione givein nella documentazione per TerminateProcess è:

La maniglia deve avere la PROCESS_TERMINATE diritto di accesso.

Pertanto, qualsiasi handle restituito da CreateProcess e CreateProcessAsUser deve disporre dei diritti di accesso necessari e sufficienti per consentire l'eliminazione del nuovo processo utilizzando TerminateProcess.