如何在C ++程序中终止系统进程?

时间:2014-12-11 22:29:37

标签: c++ winapi

我想终止一个进程,当我打开这个进程时,它会内置在我的帐户和系统中。

然后我想用c ++程序终止这个过程。我的代码只能在我的帐户中终止进程,而不是在系统中。我怎么能改变终止两者?

我的代码就像:

PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

if (Process32First(snapshot, &entry) == TRUE)
{
    while (Process32Next(snapshot, &entry) == TRUE)
    {
        if (stricmp(entry.szExeFile, "tvnserver.exe") == 0)
        {  
            HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
            TerminateProcess(hProcess, 1);
            CloseHandle(hProcess);
        }
    }
}
CloseHandle(snapshot);

1 个答案:

答案 0 :(得分:2)

因为你没有这样做的许可,微软王国的权力等级默认是这样的。

访客 - >用户 - >管理员 - >系统 - >内核

您只能触摸功率低于或等于您的应用程序。

因此,要关闭在系统下运行的进程,您需要将应用程序作为系统运行(或使用驱动程序)

获得系统权限的最简单方法是安装/创建/启动服务,默认情况下我认为它们作为LocalSystem运行,它应该具有足够的特权来杀死你的目标。

编辑:

实际上还有另一种方法,假设您以管理员身份运行,您可以在当前进程上启用SE_DEBUG_NAME权限,并且您将能够终止目标进程。或者也可以获取目标流程的所有权,如https://social.msdn.microsoft.com/Forums/vstudio/en-US/3fb9cb5d-8891-4ba6-a945-06009be51e40/terminating-a-process-from-system-account-when-privileges-are-not-sufficient?forum=vcgeneral

所述

这使用第一个解决方案,在以管理员身份运行时适用于我。

#include <stdio.h>
#include <windows.h>
#include <TlHelp32.h>

NTSTATUS EnablePrivilege(wchar_t *privilege)
{
    HANDLE token;
    TOKEN_PRIVILEGES *tp = NULL;
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token))
        goto error;

    tp = (TOKEN_PRIVILEGES*)new char[offsetof(TOKEN_PRIVILEGES, Privileges[1])];
    if (!tp)
        goto error;
    tp->PrivilegeCount = 1;
    tp->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (!LookupPrivilegeValueW(0, privilege, &tp->Privileges[0].Luid))
        goto error;

    if (!AdjustTokenPrivileges(token, 0, tp, 0, 0, 0) || GetLastError() != ERROR_SUCCESS)
        goto error;

    CloseHandle(token);

    return 0x0;
    error:
    if(tp)
        delete[] tp;

    return 0xC0000001;
}

int main()
{
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

    if (Process32First(snapshot, &entry) == TRUE)
    {
        while (Process32Next(snapshot, &entry) == TRUE)
        {
            if (wcscmp(entry.szExeFile, L"spoolsv.exe") == 0)
            {
                NTSTATUS result = EnablePrivilege(SE_DEBUG_NAME);
                if (result != 0)
                {
                    printf("could not set SE_DEBUG_NAME Privilege\n");
                    getchar();
                    return -1;
                }

                HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, entry.th32ProcessID);
                if (hProcess == NULL)
                {
                    printf("couldn't open process\n");
                    getchar();
                    return -1;
                }
                TerminateProcess(hProcess, 1);
                CloseHandle(hProcess);
            }
        }
    }
    CloseHandle(snapshot);

    printf("success!\n");
    getchar();

    return 0;
}