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

Windows privileges needed to close a external app

本文关键字:Windows 权限 外部 应用程序      更新时间:2023-10-16

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

我的应用程序是否需要管理员权限才能使用Windows APIGetWindowThreadProcessIdOpenProcessTerminateProcess或用户模式已满?

我已经检查了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);
}

谢谢。

这实际上取决于您的应用程序和您想要终止的外部进程。Windows有一个相当复杂的进程交互授权系统(一切都围绕着Access Tokens)。

流程

自从Windows Vista以来,进程现在有一个完整性级别,可以是:

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

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

根据完整性级别分析,您的程序可能只能终止由同一用户创建的进程,并且没有管理权限

服务

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

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