TerminateProcess终止进程失败

今天写了个自动升级程序,   该程序从服务器下载客户端最新版本, 然后通过查找客户端进程的方式, 使用TerminateProcess终止进程, 代码如下:

void KillProcess(  CString strProName )
{
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(pe32);
	HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if(hProcessSnap == INVALID_HANDLE_VALUE)
		return;

	CString str;
	BOOL bMore = ::Process32First(hProcessSnap, &pe32);
	CString strProcessName = _T("");
	strProName.MakeUpper();
	while(bMore)
	{
		bMore = ::Process32Next(hProcessSnap, &pe32);
		strProcessName = pe32.szExeFile;
		strProcessName.MakeUpper();
		if(strProcessName.Find( strProName ) != -1)
		{

			HANDLE hdl = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pe32.th32ProcessID);

			TerminateProcess(hdl,0);
			::CloseHandle(hProcessSnap);
			return;
		}
	}
	::CloseHandle(hProcessSnap);
}

在win7上面正常,  但是在xp系统上,却发现,升级程序终止客户端进程失败,跟踪了下代码,发现执行

<pre name="code" class="cpp">OpenProcess(PROCESS_ALL_ACCESS,TRUE,pe32.th32ProcessID)


失败,  错误码 5,拒绝访问

后来上网查询了一番,终于发现是因为权限问题,并找到一段代码

BOOL EnableDebugPrivilege()

{
  HANDLE hToken;
  BOOL fOk=FALSE;
  if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
  {
    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount=1;
    LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid);
    tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

    AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);

    fOk=(GetLastError()==ERROR_SUCCESS);
    CloseHandle(hToken);
  }
    return fOk;
}

经测试,完美解决。

现在贴出完整代码:

void KillProcess(  CString strProName )
{
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(pe32);
	HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if(hProcessSnap == INVALID_HANDLE_VALUE)
		return;

	CString str;
	BOOL bMore = ::Process32First(hProcessSnap, &pe32);
	CString strProcessName = _T("");
	strProName.MakeUpper();
	while(bMore)
	{
		bMore = ::Process32Next(hProcessSnap, &pe32);
		strProcessName = pe32.szExeFile;
		strProcessName.MakeUpper();
		if(strProcessName.Find( strProName ) != -1)
		{

			HANDLE hdl = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pe32.th32ProcessID);
			if ( !hdl )
			{
				EnableDebugPrivilege();
				hdl = OpenProcess(PROCESS_ALL_ACCESS,TRUE,pe32.th32ProcessID);
			}
			TerminateProcess(hdl,0);
			::CloseHandle(hProcessSnap);
			return;
		}
	}
	::CloseHandle(hProcessSnap);
}
时间: 2024-08-07 13:52:12

TerminateProcess终止进程失败的相关文章

WindowsAPI详解——TerminateProcess 终止|杀死其它进程

TerminateProcess 终止其它进程 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://www.blogbus.com/flyxxtt-logs/43973152.html 这个函数可以用来终止或者说杀死一个进程,它不会留给进程及其所有线程清理的时间,系统会马上终止(杀死)这个进程的所有线程,致使进程终止.在使用此函数前我们必须要调用OpenProcess函数来获得我们要终止(杀死)进程的句柄,并且要获得进程的PROCESS_TERMINATE权限. 函数原

使用ExitProcess()结束本进程,TerminateProcess()结束进程

进程只是提供了一段地址空间和内核对象,其运行时通过在其地址空间内的主线程来体现的.当主线程的进入点函数返回时,进程也就随之结束.这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的清除.除了这种进程的正常退出方式外,有时还需要在程序中通过代码来强制结束本进程或其他进程的运行.ExitProcess()函数的原型为: void ExitProcess(UINT uExitCode); 其参数uExitCode为进程设置了退出代码.该函数具有强制性,在执行完毕后进程即被结束,因此

Windows Internals 笔记——终止进程

1.进程可以通过以下四种方式终止: 主线程的入口点函数返回(强烈推荐的方式) 进程中的一个线程调用ExitProcess函数(避免这种方式) 另一个进程中的线程调用TerminateProcess函数(避免这种方式) 进程中的所有线程都“自然死亡”(这种情况几乎从来都不会发生) 2.应该保证只有在主线程的入口点函数返回之后,这个应用程序的进程才终止,只有这样才能保证主线程的所有资源都被正确清理.让主线程的入口点函数返回,可以保证以下操作会被执行: 该线程创建的任何C++对象都将由这些对象的析构函

Linux查看用于终止进程命令

[email protected]:~$ ps PID TTY TIME CMD 2576 pts/0 00:00:00 bash 2742 pts/0 00:00:00 ps [email protected]:~$ kill -9 [2742] bash: kill: [2742]: 参数必须是进程或任务 ID -9 表示强迫进程立即停止 通常用 ps 查看进程 PID ,用 kill 命令终止进程

linux下查找进程及终止进程操作的相关命令

使用linux操作系统,难免遇到一些软件"卡壳"的问题,这时就需要使用linux下强大的kill命令来结束相关进程.这在linux系统下是极其容易的事情,你只需要kill xxx即可,这里xxx代表与此软件运行相关的进程PID号.首先,我们需要使用linux下另外一个命令ps查找与进程相关的PID号:ps aux | grep program_filter_word1)ps a 显示现行终端机下的所有程序,包括其他用户的程序.2)ps -A 显示所有程序.3)ps c 列出程序时,显示

Linux常用指令---kill | killall(终止进程)

kill Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程.kill命令是通过向进程发送指定的信号来结束相应进程的.在默认情况下,采用编号为15的TERM信号.TERM信号将终止所有不能捕获该信号的进程.对于那些可以捕

我使用过的Linux命令之kill - 终止进程/发送信号

用途说明 kill命令用于终止指定的进程(terminate a process),是Unix/Linux下进程管理的常用命令.通常,我们在需要终止某个或某些进程时,先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程.kill命令的另外一个用途就是向指定的进程或进程组发送信号(The  command kill sends the specified signal to the specified process or process group)

linux 查看并终止进程

1,查看端口被那个进程占用 例如: netstat -anp | grep 1160 ps:查看端口1169被那个进程占用. 2,查找进程 例如 :ps -ef | grep 'tomcat' ps:查找出进程名里含有 tomcat的进程 3,终止进程 一般终止进程的方法是如: kill 8080 ps:终止进程号为8080的进程 如果上面的命令终止不了进程可以使用 killall命令进程终止 如:killall -KILL 8080 ps:强制终止进程号为8080的进程 linux 查看并终止

【转】iis解决应用程序池**提供服务的进程意外终止进程ID是**。进程退出代码是&#39;0x80&#39;

转自:http://blog.sina.com.cn/s/blog_56a68d5501013xdd.html 我们公司旗下的红黑互联会遇到这种问题 事件类型: 警告事件来源: W3SVC事件种类: 无事件 ID: 1009日期: 事件: XX:XX:XX用户: XX计算机: XXXX描述:为应用程序池 XXXXX 提供服务的进程意外终止.进程 ID 是 XXXX.进程退出代码是 0x80.有关更多信息,请参阅在 asp">http://go.microsoft.com/fwlink/ev