遍历系统中的所有进程,根据szName杀死指定的程序(这个是在Qt下运行的,如果要放到Visual Studio下,只需删掉qDebug,换成cout即可)。
这段代码是网友写的,我之所以写本文章是因为,这段代码中的OpenProcess的让我们浪费了大量的时间。当时,我在Win7下的Openprocess的第一个参数设置为PROCESS_ALL_ACCESS,可以正常的杀死进程。但是当把该函数用到Windows Server 2003下时,GetLastError()返回的是5.我开始以为要提升进程的Debug权限。折腾半天,权限提升了。但是依旧不能杀死进程。最终问题出在Openprocess的第一个参数设置有问题,它应该设置为PROCESS_TERMINATE。写此博文以纪念苦逼程序员的成长之路。
void EnumAndTerminateProcess(char*szName) PROCESS_TERMINATE { HANDLE hToolHelp32Snapshot; hToolHelp32Snapshot= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe= {sizeof(PROCESSENTRY32)}; BOOL IsSuccess; IsSuccess= Process32First(hToolHelp32Snapshot, &pe); while(IsSuccess) { int len= WideCharToMultiByte(CP_ACP,0,pe.szExeFile,wcslen(pe.szExeFile),NULL,0,NULL,NULL); char *des=(char *)malloc(sizeof(char) * (len + 1)); WideCharToMultiByte(CP_ACP,0,pe.szExeFile,wcslen(pe.szExeFile),des,len,NULL,NULL); des[len] = '\0'; if(!strcmp(des, szName)) { TerminateProcess(OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID),0); } free(des); IsSuccess = Process32Next(hToolHelp32Snapshot, &pe); } CloseHandle(hToolHelp32Snapshot); }最后附上进程提权函数,虽然没用上,但是也算是学习了。
int EnableDebugPriv(const TCHAR * name) //提权函数 { HANDLEhToken; TOKEN_PRIVILEGEStp; LUIDluid; //打开进程令牌环 if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken)) { qDebug() << QObject::tr("OpenProcessToken Error"); return 1; } //获得进程本地唯一ID if(!LookupPrivilegeValue(NULL,name,&luid)) { qDebug() << QObject::tr("LookupPrivivlegeValue Error"); } tp.PrivilegeCount=1; tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; tp.Privileges[0].Luid=luid; //调整权限 if(!AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL)) { return 1; } return0; }