-1
我試圖殺死一個服務進程,如果它嘗試通過ServiceController停止它時發生。我有這個服務的一個Process對象;然而,當我調用Kill()方法時,沒有任何反應。沒有例外,並且該過程仍在運行。
那麼,我該如何殺死這個過程呢?如何殺死一個服務進程?
我試圖殺死一個服務進程,如果它嘗試通過ServiceController停止它時發生。我有這個服務的一個Process對象;然而,當我調用Kill()方法時,沒有任何反應。沒有例外,並且該過程仍在運行。
那麼,我該如何殺死這個過程呢?如何殺死一個服務進程?
從內核的角度來看,服務進程沒有什麼不尋常之處,但是它們的權限並沒有明確地給予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的必要時進行相關電話。
我想你需要提供一些代碼。這裏顯然比你描述的更多。 – Mick
@米克,不。沒有更多的事情在繼續。 PS每當我問任何不容易回答的事情時,我都要花費很多時間來證明我不是一個白癡。好的工作,所以。 – user626528
嗯,這不是一個白癡的問題,你給我們提供了一個你認爲正在發生的事情的解釋,這很可能是一個錯誤的解釋,因此你無法解決它的原因。 – Mick