Windows 关闭某个进程

在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/39828815
TerminateProcess函数终止指定进程及其所有线程。
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;
}

你可能感兴趣的:(C++,programing,language,windows平台)