2010-08-15 5 views
6

Bonjour à tous.Process.kill() refusé dans Windows 7 32 bits même avec les privilèges d'administrateur

Je suis confronté à un problème étrange. Mon application a une méthode simple qui dans le cas où IE entre dans un état où il ne répond pas cette méthode est déclenchée en fermant tous les processus d'IE et ensuite l'application redémarre son travail avec IE.

Code de la méthode:

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

débogage Même mon application avec des privilèges d'administrateur l'application exécute parfois cette méthode avec succès et d'autres fois je reçois l'erreur Access Denied même en cours d'exécution en tant qu'administrateur.

J'ai même codé mon propre fichier manifeste en spécifiant le besoin d'exécuter cette application avec des droits d'administrateur, ce que je pense avoir bien compris.

Code de Manifest:

<?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> 

Toute personne avait cette même question avant? Comment puis-je corriger ce problème étrange.

Merci

Répondre

9

Étant donné que vous dites que vous possédez toujours des privilèges d'administrateur lorsque vous essayez d'appeler cette méthode, ce qui suit pourrait expliquer pourquoi vous avez intermittents problèmes:

System.Diagnostics.Process.Kill:

Si l'appel à la méthode Kill est effectué alors que le processus se termine, un Win32Exception est renvoyé pour l'accès refusé.

Si vous avez rapidement frappé « supprimer » + « OK » deux fois, sur une entrée dans le processus de l'Explorateur, vous saurez de quoi je parle.

+0

Vous avez raison bien sûr. Après 2 heures de test, le même problème ne se reproduit plus. Merci. –

5

Avez-vous enveloppé votre code dans un bloc try/catch pour voir si une exception a été levée? Sinon, essayez

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

Merci. Surtout pour l'essayer et attraper .. Je ne savais pas que je pouvais avoir plus d'un attrapé .. Silly moi. –

1

Il est une bizarrerie d'Internet Explorer, il démarre plusieurs processus pour une session. Tuer l'un d'eux peut tous les faire sortir. Vous voyez probablement l'exception "processus s'est terminé". Faites comme ceci:

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

C'est ce que j'ai fait quand Ani a répondu. Merci. –

0

vous ne devriez pas utiliser « foreach » pour le tuer, et entre deux tuer, vous avez besoin de retard pour le processus à tuer complètement

Questions connexes