如何杀死一个服务进程?
How to kill a service process?
我正在尝试终止服务进程,如果它在尝试通过 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/Invoke 相关调用。
我正在尝试终止服务进程,如果它在尝试通过 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/Invoke 相关调用。