【发布时间】:2019-07-30 11:55:53
【问题描述】:
我需要在我的程序运行之前终止一些进程,但是每当我运行TerminateProcess(),GetLastError() 返回 5。到目前为止我知道这意味着访问被拒绝,我也知道提升我的我需要使用 AdjustTokenPrivileges() 的权利,基于 Rango 的回答 here 和 Microsoft 的文档 here。
我不知道为什么它不起作用。根据我所阅读的内容,以下内容应该有效:
BOOL TerminateMyProcess(DWORD dwProcessId, UINT uExitCode)
{
DWORD dwDesiredAccess = PROCESS_ALL_ACCESS;
//DWORD dwDesiredAccess = ACCESS_SYSTEM_SECURITY;
BOOL bInheritHandle = FALSE;
HANDLE hProcess = NULL;
TOKEN_PRIVILEGES tp = { 0 };
LUID luid;
LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hProcess, FALSE, &tp, 0, NULL, NULL);
hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
BOOL result = TerminateProcess(hProcess, uExitCode);
CloseHandle(hProcess);
return result;
}
从上面你可以看出,我不确定我应该使用哪个dwDesiredAccess。 PROCESS_ALL_ACCESS 让我可以终止其他简单的进程,例如 chrome.exe 或 notepad.exe,但不是我需要终止的。 ACCESS_SYSTEM_SECURITY 是微软所说的,但我根本无法终止任何进程。
另外,这是否接近我需要做的事情,如果不是,请您指出正确的方向。
更新:从here 中添加了UpdatePrivilege() 函数,并在调用OpenProcess() 函数之前调用它,仍然没有咬。
更新 2: 我需要终止的进程是“afwServ.exe”进程,即 Avast 的防火墙。我需要这样做,以便我的防火墙是 Windows 使用的 sole 防火墙。这是我项目的要求。
【问题讨论】:
-
您需要使用
PROCESS_TERMINATE而不是PROCESS_ALL_ACCESS。第二 - 在您的代码中,您没有检查任何结果。你确定你被TerminateProcess拒绝访问,但不是OpenProcess? -
PROCESS_TERMINATE的行为与PROCESS_ALL_ACCESS相同,GetLastError()在OpenProcess()之后返回 6。GetLastError()在TerminateProcess()正常运行后也返回 6,即终止诸如 notepad.exe 之类的东西,所以我认为这不是问题所在。我认为问题在于TerminatProcess()和我的实现。 -
6 -- 这是无效句柄。 在 TerminateProcess() 正常运行后 - 毫无意义的调用
GetLastError()。从检查任何函数调用结果/错误开始 -
当我打电话给
AdjustTokenPrivileges()时,我得到 6。您认为这是问题所在吗? -
“我需要在我的程序运行之前终止一些进程” - 这听起来很像你应该修复你的程序,或者重新审视你的系统设计。