2010-08-15 7 views
6

Hallo alle.Process.kill() in Windows 7 verweigert 32 Bit auch mit Administratorrechten

Ich bin mit einem seltsamen Problem konfrontiert. Meine Anwendung hat eine einfache Methode, bei der IE in einen Zustand eintritt, in dem es nicht mehr reagiert. Diese Methode wird ausgelöst, indem alle IE-Prozesse geschlossen werden und die Anwendung ihre Arbeit mit IE wieder aufnimmt.

Code Methode:

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

Auch das Debuggen meine Anwendung mit Administratorrechten die Anwendung läuft manchmal diese Methode erfolgreich und einige andere Zeiten erhalte ich die Fehler Access Denied auch als Administrator ausgeführt wird.

Ich habe sogar meine eigene Manifest-Datei codiert, die angibt, dass diese Anwendung mit Administratorrechten ausgeführt werden muss, was meiner Meinung nach richtig ist.

Manifest Code:

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

Wer vor das gleiche Problem hatte? Wie kann ich dieses seltsame Problem korrigieren?

Dank

Antwort

9

Vorausgesetzt, dass Sie sagen, dass Sie Administratorrechte immer besitzen, wenn Sie diese Methode aufzurufen versuchen, erklären die folgenden würde, warum Sie intermittierende Probleme haben:

System.Diagnostics.Process.Kill:

Wenn der Aufruf der Methode Kill erfolgt, während der Prozess gerade beendet wird, eine Win32Exception wird für Zugriff verweigert ausgelöst.

Wenn Sie schnell ‚löschen‘ getroffen haben + ‚OK‘ zweimal, auf einen Eintrag in Process-Explorer, Sie wissen, was ich rede.

+0

Sie haben natürlich Recht, getötet zu werden. Nach 2 Stunden Test ist das gleiche Problem nicht wieder aufgetreten. Vielen Dank. –

5

Haben Sie Ihren Code in einen try/catch-Block geschrieben, um festzustellen, ob eine Ausnahme ausgelöst wurde? Wenn nicht, versuchen Sie

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

Danke. Vor allem für den Versuch und Fang .. Ich wusste nicht, dass ich mehr als einen Haken haben könnte .. Silly mich. –

1

Es ist eine Eigenart von Internet Explorer, es beginnt mehrere Prozesse für eine Sitzung. Wenn einer von ihnen getötet wird, können alle davon aussteigen. Wahrscheinlich sehen Sie die Ausnahme "Prozess wurde beendet". Machen Sie es wie diese statt:

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

Das habe ich getan als Ani geantwortet hat. Vielen Dank. –

0

Sie nicht „foreach“ verwenden sollten, es zu töten, und zwischen zwei töten, Sie Verzögerung müssen für den Prozess vollständig

Verwandte Themen