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?
risposta
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.
Tutte le informazioni che ti servono sembrano essere nelle pagine di documentazione dietro quei collegamenti .... Li hai letti? –
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. –
@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. –