Привет всем.
Я столкнулся со странной проблемой. Мое приложение имеет простой метод, который в случае, если IE входит в состояние, когда он перестает отвечать, этот метод запускается, закрывая все процессы IE ' s, а затем приложение возобновляет свою работу с IE.
Код метода:
foreach (System.Diagnostics.Process exe in System.Diagnostics.Process.GetProcesses())
{
if (exe.ProcessName.StartsWith("iexplore"))
exe.Kill();
}
Даже при отладке моего приложения с правами администратора приложение иногда запускает этот метод успешно, а иногда я получаю сообщение об ошибке Доступ запрещен
даже работая в качестве администратора.
Я даже закодировал свой собственный файл манифеста, определяющий необходимость выполнения этого приложения с правами администратора, что, я думаю, я понял правильно.
Код манифеста:
<?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>
У кого-то была такая же проблема перед? Как я могу исправить эту странную проблему.
Спасибо
Учитывая, что вы говорите, что всегда обладаете правами администратора, когда пытаетесь вызвать этот метод, следующее может объяснить, почему у вас возникают периодические проблемы:
System.Diagnostics.Process.Kill :
Если вызов метода
Kill
выполняется в то время, когда процесс в настоящее время завершается, возникает исключениеWin32Exception
для отказа в доступе.
Если вы дважды быстро нажали «удалить» + «ОК» для записи в Process-Explorer, вы поймете, о чем я говорю.
Обернули ли вы свой код в блок 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);
}
Это особенность Internet Explorer, он запускает несколько процессов за один сеанс. Убийство одного из них может заставить их всех выйти. Вы, вероятно, видите исключение «процесс завершился». Вместо этого сделайте это так:
foreach (var ie in Process.GetProcessesByName("iexplore")) {
try {
ie.Kill();
}
catch {}
}