Process.kill () refusé dans Windows 7 32 bits, même avec des privilèges d’administrateur

Bonjour à tous.

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 plus, cette méthode est déclenchée en fermant tous les processus IE, puis l’application redémarre avec IE.

Code de la méthode:

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

Même en déboguant mon application avec des privilèges d’administrateur, l’application exécute parfois cette méthode avec succès et j’obtiens parfois l’erreur Access Denied même si elle est exécutée en tant qu’administrateur.

J’ai même codé mon propre fichier manifeste en précisant la nécessité d’exécuter cette application avec les droits d’administrateur, ce qui, je pense, est juste.

Code manifeste:

                

Quelqu’un avait ce même problème avant? Comment puis-je corriger ce problème étrange.

Merci

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

System.Diagnostics.Process.Kill :

Si l’appel de la méthode Kill est effectué alors que le processus se termine actuellement, une Win32Exception est levée pour Access Denied.

Si vous avez rapidement appuyé sur «supprimer» + «OK» deux fois, sur une entrée de Process-Explorer, vous saurez de quoi je parle.

Avez-vous encapsulé votre code dans un bloc try / catch pour voir si une exception a été levée? Si non, 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); } 

C’est une bizarrerie d’Internet Explorer, il démarre plusieurs processus pour une session. Tuer l’un d’entre eux peut tous les faire sortir. Vous voyez probablement l’exception “le processus est terminé”. Faites-le comme ceci à la place:

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

vous ne devriez pas utiliser “foreach” pour le tuer, et entre deux tuer, vous avez besoin de délai pour que le processus soit complètement tué