遍历系统中的所有进程,根据szName杀死指定的程序

遍历系统中的所有进程,根据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;
}


你可能感兴趣的:(遍历系统中的所有进程,根据szName杀死指定的程序)