我正在编写一个C#应用程序,除其他外,它会在用户退出游戏后自动关闭某个游戏显示的广告。我的程序通过在检测到用户退出游戏时终止游戏过程来实现此目的。我的程序类似于其他人编写的Autohotkey脚本,它执行类似的操作,但它添加了一些功能和GUI。
当然,我使用了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)
}
我使用System.Management命名空间在我的程序中使用WMI调用替换了Process.KIll,我的程序现在能够终止进程。
我不明白是什么让WMI与Process.Kill有所不同。我希望两者都能奏效或两者都失败。此外,任务管理器能够很好地杀死进程,但我认为它只是使用TerminateProcess win32调用,就像Process.Kill一样。任何人都可以对不同行为的原因有所了解吗?如果重要,我正在运行Windows XP。
编辑:wj32解释了为什么WMI可以工作,但任何人都可以解释为什么我可以使用任务管理器而不是使用我自己的程序来终止进程吗?
答案 0 :(得分:2)
WMI调用不在进程的安全上下文中执行。它们在另一个进程中处理(我猜测Winmgmt服务)。此服务在SYSTEM帐户下运行,HackShield可能允许终止此终止。