Windows 关闭某个进程

来源:互联网 发布:java中super是什么意思 编辑:程序博客网 时间:2024/06/05 16:09

在Windows中如何通过某个进程对Kill另外的进程。

1.获取系统中正在运行的进程、线程的信息 HANDLE WINAPI CreateToolhelp32Snapshot(        DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等        DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0        );dwFlags 指定快照中包含的系统内容,这个参数能够使用下列数值(常量)中的一个或多个。    TH32CS_INHERIT - 声明快照句柄是可继承的。    TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。    TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的进程的所有的堆。    TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的进程的所有的模块。    TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。    TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。th32ProcessID 指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。获取现在说有进程的信息并返回 hsnpshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);2.遍历进程快照,轮巡显示每个进程的信息PROCESSENTRY32 te;      pe32.dwSize = sizeof(pe32);     //在使用这个结构前,先设置它的大小BOOL f0k = Process32First(hSnApshot,&te);   //获取第一个进程信息f0k = Process32Next(hSnApshot,&te);     //获取后续进程信息3.提升当前进程的权限(参考https://baike.baidu.com/item/OpenProcessToken/9825617?fr=aladdin)BOOL OpenProcessToken(              //打开某个进程的访问令牌,并返回令牌指针给tokenhandle    __in HANDLE ProcessHandle, //要修改访问权限的进程句柄    __in DWORD DesiredAccess, //指定你要进行的操作类型    __out PHANDLE TokenHandle //返回的访问令牌指针    );BOOL LookupPrivilegeValue(        //查看系统的指定特权并返回特权名称信息给lpluid    LPCTSTR lpSystemName,    //第一个参数表示所要查看的系统,本地系统直接用NULL    LPCTSTR lpName,         //第二个参数指向一个以零结尾的字符串,指定要查看的特权的名称,    PLUID lpLuid            //第三个参数用来接收所返回的制定特权名称的信息。    );AdjustTokenPrivileges这个函数启用或禁止 指定访问令牌的特权。BOOL AdjustTokenPrivileges(    //启用或禁用特权一个有TOKEN_ADJUST_PRIVILEGES访问的访问令牌.    HANDLE TokenHandle, //包含特权的句柄    BOOL DisableAllPrivileges,//禁用所有权限标志    PTOKEN_PRIVILEGES NewState,//新特权信息的指针(结构体)    DWORD BufferLength, //缓冲数据大小,以字节为单位的PreviousState的缓存区(sizeof)    PTOKEN_PRIVILEGES PreviousState,//接收被改变特权当前状态的Buffer    PDWORD ReturnLength //接收PreviousState缓存区要求的大小    );4.结束进程 http://blog.csdn.net/pxm2525/article/details/39828815TerminateProcess函数终止指定进程及其所有线程。BOOL TerminateProcess(    HANDLE hProcess,//进程句柄    UINT uExitCode //进程终止码    );  

注意:PROCESS_ALL_ACCESS 权限并不包括 PROCESS_TERMINATE 所以在终止进程前,openprocess要以PROCESS_TERMINATE权限对进程进行打开
实例:

#include "stdio.h"#include "windows.h"#include "winbase.h"#include "tlhelp32.h"#pragma comment(lib,"kernel32.lib")#pragma comment(lib,"advapi32.lib")void EnableDebugPriv( void ){    HANDLE hToken;    TOKEN_PRIVILEGES tkp;    OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);    tkp.PrivilegeCount = 1;        //数组的个数    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;     //使能一个权限值    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,        (PTOKEN_PRIVILEGES)NULL, 0);    CloseHandle( hToken );}DWORD pskill(DWORD id) //根据进程ID杀进程{    HANDLE hProcess=NULL;    //打开目标进程    hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,id);    if (hProcess==NULL){        printf("\nOpen Process fAiled:%d\n",GetLastError());        return -1;    }    //结束目标进程    DWORD ret=TerminateProcess(hProcess,0);    if(ret==0){        printf("%d",GetLastError());    } return -1;}DWORD main(void){    DWORD id = 0;    //进程列举    HANDLE hSnApshot= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);    if(hSnApshot!=INVALID_HANDLE_VALUE){        PROCESSENTRY32 te={sizeof(te)};        BOOL f0k = Process32First(hSnApshot,&te);        for(;f0k;f0k=Process32Next(hSnApshot,&te))        {            printf("Pid: %d %s\n",te.th32ProcessID ,te.szExeFile );            if (stricmp(te.szExeFile, "shownum.exe") == 0)            {                id = te.th32ProcessID;                break;            }        }    }    CloseHandle(hSnApshot);    //杀进程    printf("the process's id which you want to kill: %d",id);    //scanf("%d",&id);    EnableDebugPriv(); //提升权限    pskill(id);    system("pause");    return 0;}
原创粉丝点击