2010-01-15 3 views
1

Я пишу приложение C#, которое, помимо прочего, автоматически закрывает рекламу, когда определенная игра отображается после выхода пользователя из игры. Моя программа выполняет это, убивая игровой процесс, когда обнаруживает, что пользователь вышел из игры. Моя программа похожа на сценарий Autohotkey, написанный кем-то другим, который делает подобные вещи, но добавляет некоторые функции и графический интерфейс.В чем разница между этими двумя методами убийства процесса?

Естественно, я использовал метод Process.Kill. Однако это приведет к сбою с исключением «Доступ лишен». Я заметил, что сценарий Autohotkey использует необычный метод убийства процесса. Я спросил об этом автора, и он сказал, что ему тоже нелегко убить процесс обычными методами.

Мы подозреваем, что обычные способы завершения процесса не работают, это HackShield программное обеспечение, которое использует игра, чтобы попытаться бороться с изменой.

Вот код AutoHotkey сценарий другого парня использует для уничтожения процесса:

; kills all process instances of a given executable name 
; COM AutoHotkey library code omitted 
KillProcessInstances(exe) 
{ 
    psvc := COM_GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
    pset := COM_Invoke(psvc, "ExecQuery", "Select * from Win32_Process Where Name = '" exe "'") 
    penm := COM_Invoke(pset, "_NewEnum") 
    Loop, % COM_Invoke(pset, "Count") 
    If COM_Enumerate(penm, pobj)=0 
    { 
     COM_Invoke(pobj, "Terminate") 
     COM_Release(pobj) 
    } 
    COM_Release(penm) 
    COM_Release(pset) 
    COM_Release(psvc) 
} 

Я заменил process.kill с WMI вызовов в моей программе, используя пространство имен System.Management и моя программа сейчас способный убить процесс.

То, что я не понимаю, делает WMI отличным от Process.Kill. Я бы ожидал, что оба будут работать или оба потерпят неудачу. Кроме того, диспетчер задач способен убить процесс просто отлично, но я бы подумал, что он просто использует вызов win32 TerminateProcess, как это делает Process.Kill. Может ли кто-нибудь пролить свет на причину различного поведения? Если это имеет значение, я запускаю Windows XP.

Редактировать: wj32 объясняет, почему работает WMI, но может ли кто-нибудь объяснить, почему я могу убить процесс с помощью диспетчера задач, но не с моей собственной программой?

ответ

2

WMI-вызовы не выполняются в контексте безопасности вашего процесса. Они обрабатываются в другом процессе (я предполагаю, что сервис Winmgmt). Эта услуга работает под учетной записью SYSTEM, и HackShield может позволить, чтобы это прекращение продолжалось из-за этого.

+0

Как насчет того факта, что диспетчер задач может его убить? Есть ли что-то особенное в диспетчере задач? –