关闭外部应用程序所需的Windows权限

时间:2017-01-17 19:18:20

标签: c++ windows

我需要关闭一些外部程序。

我的应用是否需要管理员权限才能使用Windows API GetWindowThreadProcessId OpenProcess TerminateProcess 或用户模式?

我已经检查过XP和7并且工作正常,但我知道新版本的限制性更强。

我正在使用以下代码:

bool CloseApp(const char *WindowName)
{
  HWND hWnd;
  hWnd=FindWindow(nullptr,WindowName);
  if(!hWnd)return(true); // Not running

  DWORD pid;
  GetWindowThreadProcessId(hWnd,&pid);
  if(!pid)return(false);

  HANDLE prc;
  prc=OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE,FALSE,pid);
  if(!prc)return(false);

  TerminateProcess(prc,0);
  DWORD rst=WaitForSingleObject(prc,10000); // Wait until completion
  CloseHandle(prc);

  if(FindWindow(nullptr,WindowName))return(false); // Check if still running

  return(true);
}

感谢。

1 个答案:

答案 0 :(得分:2)

这实际上取决于您的应用程序和要杀死的外部进程。 Windows有一个非常复杂的流程交互授权系统(一切都围绕Access Tokens)。

过程

从Windows Vista开始,进程现在有integrity level,可以是:

  • Untrusted。没有登录SID,无法访问文件系统。基本上是一个贱民。
  • Low。只能访问%LocalLow%和一组受限制的API。通常用于沙箱应用程序的危险部分(解析器,评估程序等)
  • Medium。您的普通应用程序/用户
  • High。优越的特权。需要UAC确认。

可以想象,较低的完整性级应用程序不能干扰更高完整性级别的应用程序。由于这种机制很少被开发人员使用(除了MS产品和Web浏览器),我认为您的程序运行为Medium

从完整性级别分析,您的程序可能只能终止由同一用户创建的流程,并且不会管理员权限

服务

服务是长期流程,拥有自己的一套访问机制。服务通常需要管理级别(甚至SYSTEM)来控制和终止。有些甚至可以仅由网络管理员修改(例如在AD中)或仅由Windows本身修改(例如用于PPL services

无论如何,检查它的最佳方法是使用您的参数调用OpenProcess,如果调用失败,则检索最后一个错误集(使用GetLastError()并检查ERROR_ACCESS_DENIED }(0x5)值。