2010-08-15 15 views
6

Hola a todos.Process.kill() denegado en Windows 7 32 bits incluso con privilegios de administrador

Tengo un problema raro. Mi aplicación tiene un método simple que, en caso de que IE entre en un estado, deja de responder, este método se activa cerrando todos los procesos de IE y luego la aplicación reinicia su trabajo con IE.

código Método:

foreach (System.Diagnostics.Process exe in System.Diagnostics.Process.GetProcesses()) 
{ 
    if (exe.ProcessName.StartsWith("iexplore")) 
      exe.Kill(); 
} 

Incluso depurar mi aplicación con privilegios de administrador de la aplicación funciona a veces este método con éxito y otras veces me sale el error Access Denied incluso corriendo como administrador.

Incluso codifiqué mi propio archivo de manifiesto especificando la necesidad de que esta aplicación se ejecute con derechos de administrador, lo que creo que lo hice bien.

Código Manifiesto:

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <assemblyIdentity version="1.0.0.0" name="Demo.app"/> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
    </application> 
    </compatibility> 
</asmv1:assembly> 

Cualquier persona tenía este mismo problema antes? ¿Cómo puedo corregir este extraño problema?

Gracias

Respuesta

9

Dado que usted dice que siempre posee privilegios administrativos cuando se intenta llamar a este método, la siguiente explicaría por qué tiene intermitentes cuestiones:

System.Diagnostics.Process.Kill:

Si la llamada al método Kill se realiza mientras el proceso está actualmente finalizando, un Win32Exception se lanza para Acceso denegado.

Si usted ha golpeado rápidamente 'eliminar' + 'Aceptar' dos veces, en una entrada de Proceso-Explorer, usted sabrá lo que estoy hablando.

+0

Tienes razón, por supuesto. Después de 2 horas probándolo, el mismo problema no ha vuelto a suceder. Gracias. –

5

¿Envolvió su código en un bloque de prueba/captura para ver si se produjo una excepción? Si no, intente

try 
{    
    foreach (System.Diagnostics.Process exe in System.Diagnostics.Process.GetProcesses()) 
    { 
     if (exe.ProcessName.StartsWith("iexplore")) 
      exe.Kill(); 
    } 
} 

catch (Win32Exception e) 
{ 
    Console.WriteLine("The process is terminating or could not be terminated."); 
} 

catch (InvalidOperationException e) 
{ 
    Console.Writeline("The process has already exited."); 
} 

catch (Exception e) // some other exception 
{ 
    Console.WriteLine("{0} Exception caught.", e); 
} 
+1

Gracias. Especialmente para el intento y la captura .. No sabía que podría tener más de una captura .. Tonto de mí. –

1

Es una peculiaridad de Internet Explorer, inicia varios procesos para una sesión. Matar a uno de ellos puede hacer que todos ellos salgan. Probablemente vea la excepción "proceso ha salido". Hacerlo de esta manera en su lugar:

 foreach (var ie in Process.GetProcessesByName("iexplore")) { 
      try { 
       ie.Kill(); 
      } 
      catch {} 
     } 
+0

Eso es lo que hice cuando Ani respondió. Gracias. –

0

no debería utilizar "foreach" para acabar con él, y entre dos matanza, necesita retardo para el proceso a matar por completo

Cuestiones relacionadas