Process.kill () запрещен в Windows 7 32bit даже с правами администратора - PullRequest
6 голосов
/ 15 августа 2010

Привет всем.

Я столкнулся со странной проблемой. У моего приложения есть простой метод, который в случае, если IE входит в состояние, когда он перестает отвечать, этот метод запускается, закрывая все процессы IE, а затем приложение возобновляет работу с IE.

Код метода:

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

Даже при отладке моего приложения с правами администратора приложение иногда запускает этот метод успешно, а иногда я получаю сообщение об ошибке Access Denied, даже работая от имени администратора.

Я даже закодировал свой собственный файл манифеста, определяющий необходимость выполнения этого приложения с правами администратора, что, я думаю, я правильно понял.

Код манифеста:

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

У кого-нибудь была такая же проблема раньше? Как я могу исправить эту странную проблему.

Спасибо

Ответы [ 4 ]

9 голосов
/ 15 августа 2010

Учитывая, что вы говорите, что всегда обладаете административными привилегиями при попытке вызвать этот метод, следующее объяснит, почему у вас периодические проблемы:

System.Diagnostics.Process.Kill :

Если вызов метода Kill сделан во время завершения процесса, Win32Exception выбрасывается для отказа в доступе.

Если вы быстро дважды нажали «удалить» + «ОК» в записи в Process-Explorer, вы поймете, о чем я говорю.

5 голосов
/ 15 августа 2010

Обернули ли вы свой код в блок try / catch, чтобы увидеть, было ли создано исключение?Если нет, попробуйте

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 голос
/ 15 августа 2010

Это особенность Internet Explorer, он запускает несколько процессов за один сеанс. Убийство одного из них может привести к выходу всех из них. Вы, вероятно, видите исключение «процесс завершен». Сделайте это следующим образом:

        foreach (var ie in Process.GetProcessesByName("iexplore")) { 
            try {
               ie.Kill();
            }
            catch {}
        }
0 голосов
/ 24 августа 2016

вы не должны использовать «foreach», чтобы убить его, и между двумя, вам нужно задержать процесс, чтобы процесс был полностью убит

...