Kill process (windows 8) problemi

Ho installato Windows 8 circa un mese fa e ho riscontrato problemi in cui quando un processo si blocca non riesco a terminarlo / ucciderlo. Né il task manager né CMD Taskkill / f / PID #### faranno il lavoro, quindi ho pensato di scrivere il mio killer di processo in C # e vedere quali problemi emergono.

Dopo aver scritto una piccola app mi sono reso conto che non sono così intelligente come pensavo – non sono ancora in grado di terminare il processo. All’inizio sono stato in grado di trovare il processo per nome / PID:

Process p = Process.GetProcessById(aPid) //or foreach (Process p in Process.GetProcessesByName(aProcessName) 

..e ricevevo l’eccezione “Accesso negato” quando ho provato a:

 process.Kill(); 

.. dopo alcuni tentativi che sono cambiati e non sarei più in grado di trovare il processo. Per esempio. quando ho provato a trovarlo per nome o PID non è stato restituito nulla, mentre il processo rimaneva ancora nel Task Manager e sul mio schermo.

Ho letto anche su Process @MSDN e dice che “Accesso negato” può essere lanciato se il processo è già in fase di chiusura o non può essere terminato .. 🙁

Aiuto? Non c’è davvero alcun modo per forzare il processo finale?

Bene, si sta essenzialmente incontrando lo stesso problema che impedisce a Task Manager di terminare il processo. Ci sono due possibili ragioni. Uno è associato all’eccezione di accesso negato, il processo potrebbe aver rimosso il diritto di accesso ad altri processi per acquisire un handle per il processo. Dato che stai usando Windows 8, hai installato .NET 4.5. Quale fornisce un nuovo metodo per la class Process, puoi chiamare EnterDebugMode() . Ciò abilita il SeDebugPrivilege , potrebbe essere abbastanza buono da rendere Kill() funzionante.

L’altro è un problema molto più grande, il processo potrebbe avere un thread attivo in modalità kernel che non sta uscendo. Il modo migliore per diagnosticare ciò è utilizzando Task Manager, scheda Dettagli, fare clic con il pulsante destro del mouse su una delle intestazioni di colonna e scegliere “Seleziona colonne”. Spunta “Maniglie”. Guarda il valore visualizzato per il processo. Se viene visualizzato un valore diverso da zero, è molto probabile che il processo abbia un handle aperto e che sia in attesa che un driver di dispositivo esegua una richiesta I / O. E quel driver di periferica è altrimenti insensibile a Windows chiedendo di annullare la richiesta. Restringere il troublemaker non è così facile, devi sapere di più su esattamente quale tipo di I / O richiede il tuo processo. Fai seguito a questo facendo una domanda al riguardo su superuser.com