如何杀死服务流程?

时间:2015-01-14 05:09:58

标签: c# .net windows

我试图杀死一个服务进程,如果它试图通过ServiceController停止它时卡住了。我有这个服务的Process对象;但是,当我在其上调用Kill()方法时没有任何反应。没有例外,过程仍在运行 那么,我该怎样杀死这个过程呢?

1 个答案:

答案 0 :(得分:1)

从内核的角度来看,服务进程并没有什么不寻常之处,但是对它们的权限并没有明确赋予Administrators组的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 / Invoke相关的调用。