最近在win7上,VS2010开发环境中,写一个守护进程的程序,程序内容:发现目标进程挂起后,将其kill,然后重启。
可是,遇到了一个问题,就是在使用TerminateProcess进行kill目标进程时,kill失败,利用GetLastError()获取错误代码为5,“5”表示拒绝访问。在网上查了下资料,大概有2中解决方法:
方法1:获取管理员权限。
在应用程序的Manifest禁用UAC Virtualization,取消其对数据写操作的重定向。具体做法:项目--》***属性--》连接器--》清单文件,我们设置启用UAC(Enable User Account Control),并且在UAC Execution Level中设置请求管理员权限。这样,应用程序在启动的时候,就会向用户请求管理员权限,当应用程序获得管理员执行权限后,当然可以向任意目录写入数据,UAC Virtualization也就不会起作用了。
如下图:
但是,我这样做了,却不起作用。我开始纠结了,什么原因呢?
后来发现了方法2,解决了我的问题。欣喜若狂啊!
方法2:在OpenProcess的时候权限设置的不对。
原因是OpenProcess是设置的权限不够,应该加上PROCESS_TERMINATE权限,具体可参考MSDN中的OpenProcess函数的说明。
将参数DWORDexitCode 设置成PROCESS_ALL权限即可使用。
TerminateProcess结束进程的具体代码如下:
--------------------------------------------------------------------------
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID);
TerminateProcess(hProcess,uExitCode);
--------------------------------------------------------------------------
最后,我用方法2解决了我的问题。感觉自己对这些API不熟悉,没有全局把握。