2015-01-14 144 views
-1

我试图杀死一个服务进程,如果它尝试通过ServiceController停止它时发生。我有这个服务的一个Process对象;然而,当我调用Kill()方法时,没有任何反应。没有例外,并且该过程仍在运行。
那么,我该如何杀死这个过程呢?如何杀死一个服务进程?

+1

我想你需要提供一些代码。这里显然比你描述的更多。 – Mick

+0

@米克,不。没有更多的事情在继续。 PS每当我问任何不容易回答的事情时,我都要花费很多时间来证明我不是一个白痴。好的工作,所以。 – user626528

+0

嗯,这不是一个白痴的问题,你给我们提供了一个你认为正在发生的事情的解释,这很可能是一个错误的解释,因此你无法解决它的原因。 – Mick

回答

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的必要时进行相关电话。