【问题标题】:How to kill a service process?如何杀死一个服务进程?
【发布时间】:2015-03-12 05:45:09
【问题描述】:

我正在尝试杀死一个服务进程,如果它在尝试通过 ServiceController 停止它时卡住了。我有这个服务的 Process 对象;但是,当我在其上调用 Kill() 方法时,什么也没有发生。没有异常,进程仍在运行。
那么,我怎样才能杀死这个进程呢?

【问题讨论】:

  • 我认为您需要提供一些代码。显然这里发生的事情比你所描述的要多。
  • @Mick,不。没有更多的事情发生。 PS每次我问任何不太容易回答的问题,我都必须花很多时间证明我不是白痴。干得好,所以。
  • 好吧,这不是你是个白痴的问题,你已经为我们提供了对你认为正在发生的事情的解释,很有可能这是一个误解,因此你一直在无法解决。
  • 这可能是相关的:really-killing-a-process-in-windows
  • 如果 TerminateProcess() 也不起作用,最可能的问题是您忘记启用调试权限和/或在调用 OpenProcess() 时没有请求 PROCESS_TERMINATE 访问权限。无论哪种方式,来自 TerminateProcess() 的错误代码都是 5,拒绝访问。 (如果错误代码是别的东西,那就是另一个问题了。但我们没有希望在至少不知道错误代码是什么的情况下识别它。)

标签: c# .net windows


【解决方案1】:

从内核的角度来看,服务进程并没有什么不寻常的地方,但是对它们的权限并没有明确授予对管理员组的 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 相关调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2014-10-03
    • 1970-01-01
    • 2018-06-09
    • 2011-05-28
    • 2013-04-13
    相关资源
    最近更新 更多