【问题标题】:TerminateProcess not working for specific processesTerminateProcess 不适用于特定进程
【发布时间】: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;
}

从上面你可以看出,我不确定我应该使用哪个dwDesiredAccessPROCESS_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。您认为这是问题所在吗?
  • “我需要在我的程序运行之前终止一些进程” - 这听起来很像你应该修复你的程序,或者重新审视你的系统设计。

标签: c++ winapi process


【解决方案1】:

我认为你误解了权利和特权之间的区别,this answer 解释它。

在这种情况下,您的当前用户可能无权终止指定进程。您可能首先需要使用LogonUser 并使用管理员身份来模拟流程上下文。

您要终止的是服务,您可以尝试使用ControlServiceSERVICE_CONTROL_STOP 来停止服务。但也需要先切换到有权限的用户。

【讨论】:

  • 所以使用这个我可以使用进程/exe的名称并以管理员身份“登录”,打开一个进程句柄并终止它,或者我必须打开一个服务句柄并停止服务那里?如果我遇到安装了第三方防火墙的情况,该防火墙仅作为进程运行,而不是作为服务运行。在这种情况下,我可以同时运行服务和进程处理吗?所以它可以在这两种情况下工作。
  • 如果它作为进程运行,那么您当然可以在启动它的同一用户中终止它。(管理员也是如此)如果它作为服务运行,那么默认拥有的是本地系统,普通用户无法终止,但管理员可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 2017-06-04
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多