如何终止服务进程

本文关键字:服务进程 终止 何终止 | 更新日期: 2023-09-27 18:37:22

我正在尝试终止服务进程,如果它在尝试通过ServiceController停止它时卡住。我有一个此服务的流程对象;但是,当我对其调用 Kill() 方法时没有任何反应。没有异常,并且进程仍在运行。
那么,我怎样才能杀死这个过程呢?

如何终止服务进程

从内核的角度来看,服务进程没有什么异常,但对它们的权限并没有明确授予PROCESS_TERMINATE对管理员组的访问权限。 要绕过这一点,您需要启用调试权限。

作为参考,以下是我用来确认没有发生意外

情况的代码:
#include <Windows.h>
#include <stdio.h>
int main(int argc, char ** argv)
{
    HANDLE h, hToken;
    DWORD pid = atoi(argv[1]);
    printf("Process %u'n", pid);
    if (OpenProcessToken(GetCurrentProcess(), 
                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    {
        struct {
            DWORD PrivilegeCount;
            LUID_AND_ATTRIBUTES Privileges[1];
        } tkp;
        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid); 
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
        AdjustTokenPrivileges(hToken, FALSE, (PTOKEN_PRIVILEGES)&tkp, 0, 
                (PTOKEN_PRIVILEGES)NULL, 0);
        CloseHandle(hToken);
    }
    h = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
    if (h == NULL)
    {
        printf("OpenProcess: %u'n", GetLastError());
        return 1;
    }
    if (!TerminateProcess(h, 1))
    {
        printf("TerminateProcess: %u'n", GetLastError());
        return 1;
    }
    printf("Done!'n");
    return 0;
}

我不确定其中有多少可以在 C# 中本地完成,但如有必要,您可以 P/调用相关调用。